Contenido

Comparativas de getElementsByClassName

9 Mar

+ 13

Hace unos días comentabamos que Firefox 3 implementará una versión nativa de getElementByClassName. John Resig, creador de jQuery ha publicado una comparativa entre las diferentes versiones de esta función en javascript.

Tree Walker [url]


document.getElementsByClass = function(needle) {
 function acceptNode(node) {
   if (node.hasAttribute("class")) {
     var c = " " + node.className + " ";
      if (c.indexOf(" " + needle + " ") != -1)
        return NodeFilter.FILTER_ACCEPT;
   }
   return NodeFilter.FILTER_SKIP;
 }
 var treeWalker = document.createTreeWalker(document.documentElement,
     NodeFilter.SHOW_ELEMENT, acceptNode, true);
 var outArray = new Array();
 if (treeWalker) {
   var node = treeWalker.nextNode();
   while (node) {
     outArray.push(node);
     node = treeWalker.nextNode();
   }
 }
 return outArray;
}

The Ultimate getElementsByClassName [url]


 function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }
    }
    return (arrReturnElements)
}

Dustin Diaz’s getElementByClass [url]


function getElementsByClass(searchClass,node,tag) {
       var classElements = new Array();
       if ( node == null )
               node = document;
       if ( tag == null )
               tag = '*';
       var els = node.getElementsByTagName(tag);
       var elsLen = els.length;
       var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
       for (i = 0, j = 0; i < elsLen; i++) {
               if ( pattern.test(els[i].className) ) {
                       classElements[j] = els[i];
                       j++;
               }
       }
       return classElements;
}

Prototype 1.5.0 [url]


document.getElementsByClassName = function(className, parentElement) {
 if (Prototype.BrowserFeatures.XPath) {
   var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
   return document._getElementsByXPath(q, parentElement);
 } else {
   var children = ($(parentElement) || document.body).getElementsByTagName('*');
   var elements = [], child;
   for (var i = 0, length = children.length; i < length; i++) {
     child = children[i];
     if (Element.hasClassName(child, className))
       elements.push(Element.extend(child));
   }
   return elements;
 }
};

Nativa en Firefox 3 [url]

document.getElementsByClassName

Pruebas 

Para las pruebas ha copiado la página de inicio de Yahoo dentrode un HTML estático y ha realizado la misma operación de seleccionar los elelemtos de una determinada clase dentro del fichero. 

Resultados

classname-speed2-md.gif

Creo que no hace falta comentar nada acerca de los resultado obtenidos, la imagen habla por si misma. 

Conclusiones 

Queda claro, que todo lo que esté declarado en el nucleo del navegador es, y vá a ser más rápido que cualquier otro método. Así que me parece un gran acierto que integren esta función dentro del corazón de Firefox y espero que los demás navegadores sigan su ejemplo.

Al igual que tú encuentro muy buena la iniciativa de Firefox, pero creo que será bastante inútil en los próximos meses, ya que si sólo funciona en firefox será igualmente necesario utilizar otros métodos para otros navegadores. A sabes cuanto tardará IE en incorporar también el método.

#1 Por desgracia estamos acostumbrados a eso. Aunque creo recordar que ya había fechas (estimaciones) para el lanzamiento del IE8…. ¿puede ser?¿o lo he soñado?

ahora es cuando hay que volver a definirse un nuevo getElementsByClassName

if(firefox){
return document.getElementsByClassName
}
else
{
return getElementsByClassName_que_mas_rabia_te_de()
}

Empezarán a funcionar las cosas muy rápido en firefox y peor en IE… suena interesante xD

Sabes como se puede medir el tiempo en cuestión con JS ?

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.