Estoy usando este XPath para obtener el valor de un campo:

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

Puedo obtener varios resultados, pero yo sólo quiero el primero. El uso de

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

No funciona. Una vez tengo esto, ¿cómo puedo recoger el valor de Greasemonkey? Estoy tratando de cosas como:

alert("val " + val.snapshotItem);

Pero creo que es para el nodo, en lugar de la cadena.

OriginalEl autor | 2008-11-05

3 Comentarios

  1. 16

    Para el XPath, trate de:

    //input[@type="hidden" y @nombre="val" y position() = 1]/@valor 
    

    Para utilizar en un script de GreaseMonkey, hacer algo como esto:

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

    Estrictamente hablando: el Uso de "position()=1" en el filtro XPath no es absolutamente necesario, porque sólo el primer resultado devuelto es el que va a ser utilizado de todos modos (a través de snapshotItem(0)). Pero ¿por qué construir un mayor conjunto de resultados que usted realmente necesita.

    EDICIÓN: Utilizando una expresión XPath resultado de la ORDERED_NODE_SNAPSHOT_TYPE tipo se asegura de que usted obtenga los nodos en el orden del documento. Eso significa que el primer nodo de el resultado también será el primer nodo en el documento.

    OriginalEl autor Tomalak

  2. 4

    Tomalak tiene la idea correcta, pero me gustaría hacerlo de una forma un poco diferente.

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

    De esta manera, se especifica como parte de la conjunto de resultados que solo quieres un artículo devuelto (la primera en el documento, en este caso). También, aquí está la captura de los DOM nodo y, a continuación, la lectura de su value propiedad para obtener el valor. He encontrado esto para ser más confiable que la obtención de una cadena de valor a través de XPath (a pesar de su kilometraje puede variar).

    Estás en lo correcto. Voy a adaptar mi código un poco. Tiendo a olvidar que FF ha XPath que es capaz de trabajar fuera de orden del documento. Gracias.

    OriginalEl autor savetheclocktower

  3. 0

    Una posibilidad es incluir jQuery en sus scripts. Esto proporcionará una sintaxis más sencilla para acceder a los elementos.

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

    OriginalEl autor Daniel X Moore

Dejar respuesta

Please enter your comment!
Please enter your name here