Чтение значения ввода с использованием XPath, а затем с помощью Greasemonkey - PullRequest
9 голосов
/ 05 ноября 2008

Я использую этот XPath для получения значения поля:

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

Я получаю несколько результатов, но хочу только первого. Использование

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

Не работает. Как только я получу это, как мне получить значение в Greasemonkey? Я пытаюсь что-то вроде:

alert("val " + val.snapshotItem);

Но я думаю, что это для узла, а не для строки.

Ответы [ 3 ]

16 голосов
/ 05 ноября 2008

Для 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)). Но зачем создавать больший набор результатов, чем вам действительно нужно.

РЕДАКТИРОВАТЬ: Использование результата XPath типа ORDERED_NODE_SNAPSHOT_TYPE гарантирует, что вы получите узлы в порядке документов . Это означает, что первый узел результата также будет первым узлом в документе.

4 голосов
/ 05 ноября 2008

У Томалака правильная идея, но я бы сделал это немного по-другому.

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 (хотя ваш пробег может отличаться).

0 голосов
/ 04 марта 2009

Одна из возможностей - включить 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.");
}
...