2012-10-01 12 views
97

Recentemente ho aggiornato la mia versione di PHPStorm IDE e ora mi avverte dell'uso inefficiente di jQuery.Avvisi di utilizzo jQuery inefficienti in PHPStorm IDE

Ad esempio:

var property_single_location = $("#property [data-role='content'] .container"); 

Prompt questo avvertimento:

Controlla che selettori di jQuery sono utilizzati in modo efficiente. Suggerisce di separare i selettori dei discendenti che sono preceduti dal selettore ID e gli avvertimenti relativi ai selettori duplicati che potrebbero essere memorizzati nella cache.

Quindi la mia domanda è:

Perché questo è inefficiente e qual è il modo efficace di fare il selettore di cui sopra?

direi a:

var property_single_location = $("#property").find("[data-role='content']").find(".container"); 

È questo il modo giusto?

risposta

151

Ho avuto la stessa domanda oggi e sono riuscito a trovare una soluzione grazie a Scott Kosmanhere.

Fondamentalmente la risposta è selezionare gli ID individualmente e quindi utilizzare .find(...) per qualcosa di seguito. In modo da prendere il vostro esempio:

$("#property [data-role='content'] .container"); 

La modifica a questo rende PhpStorm felice e può, evidentemente, essere more than twice as fast:

$("#property").find("[data-role='content'] .container"); 
+1

Per i miei gusti $ ('[data-role = "content"] .container', '#property'); è più leggibile – n3rd

+25

@ n3rd Divertente, non trovo che questo approccio sia leggibile, ma a ciascuno il suo dicono. – MikeSchinkel

+2

Ok, ma perché? Quando si utilizza il selettore di classe IntelliJ non mostra un avvertimento .. –

19

credo che la differenza tra i due metodi quando si utilizzano le versioni recenti di jQuery e browser è trascurabile . Ho costruito un test che dimostra che è ormai in realtà il 10% più veloce per fare un selettore combinato, piuttosto che la selezione su id e poi trovare per un caso molto semplice:

http://jsperf.com/jquery-find-vs-insel

Per la selezione di più i bambini per classe a qualsiasi profondità, il "trovare" sembra essere più veloce:

http://jsperf.com/jquery-find-vs-insel/7

ci fu qualche discussione su questo sul forum di jQuery, ma i suoi 3 anni: https://forum.jquery.com/topic/which-jquery-selection-is-efficient Mentre si sottolineano qui, se sietefacendo un sacco di operazioni sullo stesso selettore di id, il più grande miglioramento delle prestazioni si trova memorizzando nella cache l'elemento di primo livello. D'altro canto, se stai facendo solo alcune selezioni, non ci sarà praticamente alcuna differenza di prestazioni.

Quindi credo che IntelliJ stia esagerando l'importanza di questo stile di codice.

+4

Nel primo test, si sta utilizzando il decedent diretto selezionare ">". Ho eseguito il tuo primo test senza ">", e usare "trova" è più veloce. http://jsperf.com/jquery-find-vs-insel/12 – beardedlinuxgeek

+0

La cosa che trovo più interessante è che le ultime versioni di Safari elaborano il metodo diretto più veloce di circa il 25%. Non so cosa hanno fatto, ma a quanto pare tutti gli altri browser non hanno preso piede. – Uxonith

13

La prima domanda è premere Alt + Invio e selezionare il primo suggerimento nell'elenco, quindi premere Invio, vedrete quale ritiene il modo più efficiente.

Problemi correlati