2012-06-13 7 views
8

diciamo che ho un po 'selezionare elemento che non contiene una stringa all'interno di un attributo

<TR style = "background-color : red ;"> 

e alcuni

<TR> 

(da notare che gli spazi accanto al colon e al virgola sono intenzionali, perché la pagina mi occupo è scritto in quel modo)

ora, in questo modo:

$('.detailtable tr:not([style~="darkgray"])') 

funziona perfettamente. Ma here dice: [! Name = "valore"]

non può sfruttare la spinta di prestazioni fornite dal metodo nativo DOM querySelectorAll(). Per migliorare le prestazioni nei browser moderni, usare $ ("your-pure-css-selettore") non ('[name = "valore"]') invece

quindi mi chiedevo:. È la mia espressione il migliore uno o qualcosa del genere:

$('.detailtable tr').not('[style~="darkgray"]') // this doesn't work! 

è più performante? E qual è il modo corretto di scrivere questa ultima espressione?

Grazie in anticipo

+0

'$ ('. Detailtable tr'). Not ('[style ~ =" darkgray "]')' dovrebbe funzionare allo stesso modo. Se sei preoccupato per le prestazioni, testalo: http://jsperf.com/. –

+0

come ho scritto nel commento, $ ('. Detailtable tr'). Not ('[style ~ = "darkgray"]') non funziona ... – Pierpaolo

risposta

20

Se si vuole veramente a "selezionare elemento che non contiene una stringa all'interno di un attributo", è necessario utilizzare *= invece di ~=, in questo modo:

$('.detailtable tr').not('[style*="darkgray"]'); 

Ecco il fiddle.


E no, usare .not probabilmente non è più veloce.querySelectorAll dovrebbe essere in grado di analizzare quel selettore così com'è.

Vedere questo fiddle.


Edit: Se vi preoccupate per IE8 più di tanto, quindi utilizzando il metodo al posto del selettore :not.not vi darà un piccolo incremento delle prestazioni. La ragione di ciò è molto semplice: IE8 supporta i selettori di attributi, ma non il selettore di negazione.

+0

Sì, funzionerà con 'querySelectorAll()' perché è un selettore CSS valido. Vedi anche: [Qual è la differenza nel selettore: not() tra jQuery e CSS?] (Http://stackoverflow.com/questions/10711730/whats-the-difference-in-the-not-selector-between- jquery-and-css) (Stavo per scrivere una piccola sezione su come le persone dovrebbero smettere di preoccuparsi delle prestazioni, ma ho pensato che le persone là fuori probabilmente si preoccupassero troppo delle prestazioni per leggere questo, quindi non mi importava scrivilo ...) – BoltClock

+0

@BoltClock - ovviamente ci sono differenze tra il selettore nativo ': not' e jQuery's beefed up:: not'. Tuttavia, in questo caso, è lecito ritenere che l'implementazione nativa lo gestirà correttamente. –

+0

@BoltClock - Mi interessa molto delle prestazioni, ma ascolterei volentieri la tua opinione. Cura di condividere? L'avrei letto anche se si trattava di una lunghezza da romanzo piccolo ... –

0

I'd suggest you take a look at this.

Curiosamente, pseudo selettori (come ": non") tendono ad essere effettivamente più lento rispetto all'utilizzo di una funzione accanto al selettore iniziale. In effetti ... sono apparentemente "due volte più lenti".

cito:

  1. $("#id p");
  2. $("#id").find("p");

Sarebbe sorpresa di apprendere che il secondo modo può contenere più di due volte più veloce come il primo? Conoscendo i selettori che i selettori superano gli altri (e perché) è un blocco di chiave di tipo per assicurarti che il tuo codice funzioni correttamente e non frustri gli utenti di che attendono che accadano.

Vorrei andare con .not amico mio!

+0

Apparentemente? Non a me. – BoltClock

+0

Secondo http://jsperf.com/id-vs-class-vs-tag-selectors/2, gli pseudo-selettori sono i selettori più lenti di tutti. Non ho trovato alcuna prova che dice che sono più veloci di concatenare una funzione jQuery in seguito. Poi di nuovo, solo perché non ho trovato prove non significa che non esiste. :) – cereallarceny

0

Da W3C Recommendation, ciò che si utilizza attualmente dovrebbe funzionare perfettamente anche con document.querySelectorAll().

Forse è possibile verificare se funziona come previsto.

+0

': not()' è stato aggiunto alla bozza molti anni fa, e jQuery lo ha raccolto abbastanza presto ... – BoltClock

+0

@BoltClock Ma la [tabella dei selettori] (http://www.w3.org/TR/css3-selectors/#selectors) menziona '3' nella colonna' Primo definito in livello CSS' per la Pseudo classe Negazione. Quindi ho pensato che questa fosse una recente aggiunta all'elenco dei selettori. Si prega di fornire qualsiasi riferimento per confermare che questo è stato raccolto da jQuery in precedenza. Aspetterò la tua risposta prima della modifica. – Sujay

+0

Il CSS3 è stato solo consigliato di recente, ma era in bozza da più di 10 anni e ': not()' è in giro da così tanto tempo (vai alla pagina delle specifiche e continua a cliccare su "Versione precedente"). jQuery è stato distribuito con ': not()' nella sua prima versione stabile principale - dice "versione aggiunta: 1.0" in [docs] (http://api.jquery.com/not-selector). – BoltClock

Problemi correlati