2010-11-08 14 views
5

¿Cómo se puede escribir el siguiente jQuery-no ...jQuery-no en JavaScript puro

$(".hover").not(".selected"); 

... en JavaScript puro?

+0

¿Alguna razón por la que no solo utiliza jQuery u otro framework? –

+0

debido al rendimiento ... usamos raphael ya sea – albuvee

+2

Tenga en cuenta que jQuery está bastante bien optimizado, cualquier código que escriba probablemente no será más eficiente. –

Respuesta

7
allItems = document.getElementsByTagName('*'); 
goodItems = []; 
for(i=0;i<allItems.length;i++){ 
    if(
     allItems[i].className && 
     (' '+allItems[i].className.replace(/\s+/g, ' ')+' ').indexOf(' '+'hover'+' ') != -1 && 
     (' '+allItems[i].className.replace(/\s+/g, ' ')+' ').indexOf(' '+'selected'+' ') == -1 
    ) 
     goodItems.push(allItems[i]); 
} 

Si necesita este tipo de selecciones Categoría frecuencia con la que debe considerar el ahorro como funciones o incluso replicar algunos de los comportamientos de jQuery para ser capaz de hacer cosas como $(".hover").not(".selected");

+0

'indexOf()' en el no es una buena prueba para saber si un elemento tiene una clase particular y dará falsos positivos. Por ejemplo, un elemento con 'class =" foo_hover_bar "' será igualado por este código. –

+0

@Tim Buena captura. Gracias. Actualicé el código. –

+0

Todavía hay un problema: esto no funcionará en IE <9, en el que las matrices no tienen un método 'indexOf()'. –

1

También puede utilizar la función siguiente para obtener elementos por nombre de clase.

excludeClass es un parámetro opcional aquí, esta función seguirá funcionando si solo define el parámetro includeClass.

function getElementsByClassName(includeClass, excludeClass) { 
    var elements = []; var el = document.getElementsByTagName('*'); 
    var regexp1 = new RegExp("\\b" + includeClass + "\\b"); 
    var regexp2 = new RegExp("\\b" + (excludeClass ? excludeClass : "") + "\\b"); 
    for (var i = 0; i < el.length; i++) { 
     if (regexp1.test(el[i].className) && !regexp2.test(el[i].className)) { elements.push(el[i]); } 
    } 
    return elements; 
} 
4

Lo siguiente funcionará. Se podría optimizar utilizando una implementación de navegador nativo de getElementsByClassName() donde esté presente para filtrar la lista a solo elementos con la clase "hover".

function hasClass(el, cssClass) { 
    return el.className && new RegExp("(^|\\s)" + cssClass + "(\\s|$)").test(el.className); 
} 

var matchingElements = []; 
var allElements = document.getElementsByTagName("*"); 
for (var i = 0, len = allElements.length, el; i < len; ++i) { 
    el = allElements[i]; 
    if (hasClass(el, "hover") && !hasClass(el, "selected")) { 
     matchingElements.push(el); 
    } 
} 
+1

+1 para la función hasclass – meo

+0

@Alin: Está bien, sin embargo, porque no se divide en la expresión regular. Comprueba que la clase está al inicio o inmediatamente precedida por un carácter de espacio en blanco; lo que precede a ese carácter de espacios en blanco (si está presente) es irrelevante. La lógica para verificar el final de la clase es similar. –

+0

Tienes razón. Lo siento. –

Cuestiones relacionadas