10

このXPathを使用して、フィールドの値を取得しています。

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

いくつかの結果が得られますが、最初のものだけが必要です。使用する

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

動作しません。これを入手したら、Greasemonkeyで値を取得するにはどうすればよいですか?私は次のようなことを試みています:

alert("val " + val.snapshotItem);

しかし、それは文字列ではなく、ノード用だと思います。

4

3 に答える 3

19

XPathについては、次を試してください。

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

GreaseMonkeyスクリプトで使用するには、次のようにします。

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.");

厳密に言えば"position()=1"、XPathフィルターでの使用は絶対に必要というわけではありません。とにかく、最初に返された結果のみが(を介してsnapshotItem(0))使用されるためです。しかし、なぜ実際に必要なものよりも大きな結果セットを作成するのでしょうか。

編集:このORDERED_NODE_SNAPSHOT_TYPEタイプのXPath結果を使用すると、ノードをドキュメント順に取得できます。つまり、結果の最初のノードがドキュメントの最初のノードにもなります。

于 2008-11-05T18:08:45.843 に答える
4

トマラクは正しい考えを持っていますが、私は少し違うやり方をします.

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.");

このようにして、結果セットの一部として、 1 つのアイテム (この場合はドキュメントの最初のアイテム) のみを返すように指定します。また、ここでは DOM ノードをフェッチし、そのvalueプロパティを読み取って値を取得しています。これは、XPath を介して文字列値をフェッチするよりも信頼性が高いことがわかりました (マイレージは異なる場合があります)。

于 2008-11-05T19:42:59.897 に答える
-1

1 つの可能性は、スクリプトに jQuery を組み込むことです。これにより、要素にアクセスするためのより単純な構文が提供されます。

// ==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.");
}
于 2009-03-04T06:08:07.327 に答える