2009-03-02 12 views
19

Intentando ensamblar un selector jQuery bastante complejo aquí y teniendo problemas.jQuery pregunta del selector. Seleccione todos los nodos que NO COMIENZEN con (cadena)

Esencialmente, estoy tratando de agarrar todas las anclas que que 1) no tienen un "rel" de "facebox", y O 2) no tienen un "href" que comienza con "mailto ".

Esto es lo que he estado tratando de hacer: no parecen

$('a[rel!=facebox], a[href!^="mailto"]') 

pequeñas variaciones de que esto funcione. ¿Hay alguna forma mejor de resolver esto?

Estos selectores parecen funcionar de forma individual, pero no cuando está sentado de forma consecutiva en el mismo selector:

$('a:not([rel=facebox]), a:not([href^=mailto])') 

solución final: tenemos un ganador!

$('a:not([rel=facebox],[href^=mailto])') 
+0

Curiosamente, $ ('a: not ([rel = facebox]') y $ ('a: not ([href^= mailto]') funcionan bien, pero no ambos separados por una coma. –

+0

Eso es porque las comas agregan el objeto que está detrás del objeto jQuery, seleccionando todo excepto th e nodos que tiene rel = facebox y href con mailto. – svinto

Respuesta

48

desea que el EDITAR :not selector

$("a:not([rel=facebox],[href^=mailto])"); 

: Robé su respuesta para la corrección

+0

Ahí vamos, ahora me siento mejor si lo selecciono como la respuesta aceptada. Tenías razón sobre el selector: no originalmente, pero no había formulado mi pregunta correctamente. –

+0

Pregunta sobre esta respuesta: ¿Por qué es^= necesario? ¿Eso no significa que "no es igual" mientras que mientras tanto ya has escrito ": no?" – user1477388

+4

el^= significa 'comienza con' –

3

Muy bien Sr. Jeremy Ricketts. Jquery ha arruinado tu cabeza. Está intentando encadenar lógica de selector ... algo así como cómo jQuery encadena los métodos. En su segundo selector (a[href!^="mailto"]) está tratando de decir ... NO cosas que contengan ESTE atributo. Lo que está diciendo es "Buscar todo lo que no es mailto" y "Buscar todo lo que contiene mailto". Es como filtros de luz ... si filtra la luz roja ... y arroja un filtro de luz amarilla en la parte superior ... no se está filtrando por la luz naranja ... acaba de filtrar TODO (lo siento por el tramo de una analogía) . Entonces, lo que estás tratando de hacer es usar el pseudo selector: no.

como no - $(a:not([href^=mailto:])).whateverJqueryMethodYouWant();

EDIT: Bueno, ahora que usted ha spec'da a cabo correctamente la pregunta ... que lo puede hacer como esto - $(a:not([href^=mailto:] , [rel=facebox])).whateverJqueryFunctionYouWant();

0

¿No debería ser:

$("a:not([rel='facebox'],[href^='mailto'])"); 
Cuestiones relacionadas