Página 1
Obtener un árbol XML del documento HTML actual
Página 2
Índice
See this article in english  Ver este artículo en español 
Página 3
Obtener la posición absoluta de cualquier elemento HTML

Evaluar expresiones XPath en cualquier navegador

Alexander Hristov

Recientemente para un desarrollo AJAX tuve que asegurarme de poder evaluar y recorrer el resultado de una expresión XPath de forma independiente al navegador. Mozilla (Firefox), Opera y cia implementan el estándar DOM XPath, mientras que IE para variar va por libre (aunque todo hay que decirlo, IE tuvo evaluación XPath mucho antes de que existiera este estándar). El problema no es solo que la forma de evaluar expresiones XPath es diferente, sino que para más inri el objeto devuelto por la función evaluadora es distinto también.

Finalmente, la solución es una función genérica que además devuelve un objeto encapsulador cuyo código varía según el navegador:

xpath.js
 
function selectXPath(expr, node) {
  if (document.evaluate) {
    return {
      list : node.evaluate(expr,node,null,XPathResult.ANY_TYPE,null),
      next : function() { 
        return this.list.iterateNext()
      }
    }
  } else {
    return {
      list: node.selectNodes(expr),
      i : 0,
      next: function() {
        if (this.i > this.list.length)
          return null;
        return this.list[this.i++];
      }
    }
  }
}


 

La funciön primero comprueba si existe una implementación de DOM XPath y si es así, la usa. Si no, asume que el navegador utiliza la función de IE selectNodes(). En ambos casos se devuelve un objeto que internamente contiene el resultado y que va proporcionando nodos mediante la función next().

Un ejemplo de uso podría ser el siguiente:

 
function test() {
  var imagenes="Lista de imagenes de este documento: ";
  if  (document.evaluate)
    var result = selectXPath("//IMG",document);
  else
    var result = selectXPath("//IMG",document2DOM());
  var nodo;
  do {
    nodo = result.next();
    if (nodo)  imagenes += nodo.getAttribute("src") + "\n";
  } while (nodo);
  alert(imagenes);
}

 
(la función document2DOM() es la descrita en el truco anterior)

Pulsa   para probar la función "en vivo".



Código Fuente



 

Comentarios

 

Añadir Comentario

Nombre (opcional)
EMail (opcional, no se muestra)

Texto