2008-11-05 9 views
9

ich mit diesen XPath bin mit dem Wert eines Feldes zu erhalten:den Wert eines Eingangslese XPath verwenden, dann in Grease

//input[@type="hidden"][@name="val"]/@value 

ich einige Ergebnisse, aber ich will nur das erste. Verwenden

//input[@type="hidden"][@name="val"]/@value[1] 

Funktioniert nicht. Sobald ich das habe, wie nehme ich den Wert in Greasemonkey? Ich versuche Dinge wie:

alert("val " + val.snapshotItem); 

Aber ich denke, das ist für den Knoten, anstatt die Zeichenfolge.

Antwort

16

Für die XPath, versuchen:

 
//input[@type="hidden" and @name="val" and position() = 1]/@value 

Zur Verwendung in einem Greasemonkey-Skript, tun Sie etwas wie folgt aus:

var result = document.evaluate(
    "//input[@type='hidden' and @name='var' and position()=1]/@value", 
    document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null 
); 

var hiddenval = result.snapshotItem(0); 

if (hiddenval) 
    alert("Found: " + hiddenval.nodeValue); 
else 
    alert("Not found."); 

Streng genommen: "position()=1" im XPath-Filter zu verwenden ist nicht unbedingt erforderlich, weil immer nur das erste zurückgegebene Ergebnis verwendet wird (über snapshotItem(0)). Aber warum sollte ein größeres Ergebnisset erstellt werden, als Sie wirklich benötigen?

BEARBEITEN: Unter Verwendung eines XPath-Ergebnisses des Typs ORDERED_NODE_SNAPSHOT_TYPE wird sichergestellt, dass Sie die Knoten in Dokumentenbestellung erhalten. Das bedeutet, dass der erste Knoten des Ergebnisses auch der erste Knoten im Dokument ist.

4

Tomalak hat die richtige Idee, aber ich würde es ein bisschen anders machen.

var result = document.evaluate(
    "//input[@type='hidden' and @name='var']", 
    document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null); 

var input = result.iterateNext(); 

if (input) 
    alert("Found: " + input.value); 
else 
    alert("Not found."); 

Auf diese Weise sind Sie als Teil des Ergebnisses Angabe gesetzt, dass Sie nur ein Element (die ersten in dem Dokument, in diesem Fall) zurückgegeben werden sollen. Auch hier holen Sie den DOM-Knoten und lesen dann seine value-Eigenschaft, um den Wert zu erhalten. Ich habe festgestellt, dass dies zuverlässiger ist als das Abrufen eines Zeichenfolgenwerts über XPath (obwohl Ihre Laufleistung variieren kann).

+0

Sie haben Recht. Ich werde meinen Code ein wenig anpassen. Ich neige dazu, zu vergessen, dass FF XPath hat, das in der Lage ist, die Dokumentenreihenfolge zu umgehen. Vielen Dank. – Tomalak

0

Eine Möglichkeit besteht darin, jQuery in Ihre Skripte aufzunehmen. Dies wird eine einfachere Syntax für den Zugriff auf Elemente bereitstellen.

// ==UserScript== 
// @name   MyScript 
// @namespace  http://example.com 
// @description Example 
// @include  * 
// 
// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js 
// ==/UserScript== 

var input = $("input[type='hidden'][name='var']"); 

if (input) { 
    alert("Found: " + input.val()); 
} else { 
    alert("Not found."); 
} 
Verwandte Themen