使用XPath读取输入的值,然后在Greasemonkey中使用

时间:2008-11-05 17:42:01

标签: javascript xpath greasemonkey

我正在使用此XPath来获取字段的值:

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

我得到了几个结果,但我只想要第一个。使用

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

不起作用。有了这个,我如何在Greasemonkey中获取值?我正在尝试这样的事情:

alert("val " + val.snapshotItem);

但我认为那是节点,而不是字符串。

3 个答案:

答案 0 :(得分:16)

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

严格来说:在XPath过滤器中使用"position()=1"并非绝对必要,因为无论如何只会使用第一个返回的结果(通过snapshotItem(0))。但是为什么要建立一个比你真正需要的更大的结果集。

编辑:使用ORDERED_NODE_SNAPSHOT_TYPE类型的XPath结果可确保以文档顺序获取节点。这意味着结果的第一个节点也将是文档中的第一个节点。

答案 1 :(得分: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.");

这样,您将指定结果集的一部分,您只希望返回一个项目(在本例中为文档中的第一个项目)。此外,您在这里获取DOM节点,然后读取其value属性以获取值。我发现这比通过XPath获取字符串值更可靠(尽管你的里程可能会有所不同)。

答案 2 :(得分:0)

一种可能性是在脚本中包含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.");
}