2013-03-05 11 views
10

Co to jest najlepsza praktyka, aby sprawdzić, czy element DOM istnieje w javascript?Sprawdzanie javascript jeśli istnieje element DOM najlepsza praktyka

Czy należy sprawdzić, czy dany element istnieje przed jego użyciem?

if ($("#" + machineId + packageId.removeSpecialChars().toUpperCase() + "").size() != 0) { 
    var row = $("#" + machineId + packageId.removeSpecialChars().toUpperCase() + ""); 
} 

Czy to nie dwukrotnie wykonałoby packageId.removeSpecialChars().toUpperCase()?

Czy byłaby to lepsza opcja?

var row = $("#" + machineId + packageId.removeSpecialChars().toUpperCase() + ""); 
if (row) 
{ 
    // do something 
} 

Jednak, czy nie wyrzuciłoby wyjątku, gdyby go nie znaleziono?

+0

usuwa to z obu linii '+" "'. – Jai

+0

'size()' jest przestarzałe .... użyj 'length' zamiast – charlietfl

Odpowiedz

21

Kiedy jesteś rzeczywiście pracuje z elementów DOM, to tak, należy sprawdzić, czy istnieje zanim spróbujesz z nim pracować, aby uniknąć błędów JavaScript. Jednak jesteś nie pracy z elementami DOM, pracujesz z obiektem jQuery, który (potencjalnie) zawiera elementy DOM.

Funkcje jQuery obsługują już przypadki, w których nie ma dopasowań w swoim zestawie elementów, więc nie trzeba jawnie sprawdzać, czy istnieją elementy przed próbą pracy z nimi. Trzeba to zrobić tylko, jeśli próbujesz bezpośrednio odwoływać się do elementów DOM z wnętrza tego zestawu, korzystając z funkcji .get() lub notacji nawias kwadratowych [index].

Tak na marginesie, to funkcja .size() jQuery została zaniechana w wersji 1.8, należy użyć obiektu jQuery length się bezpośrednio do sprawdzenia, czy istnieją elementy, więc:

var $object = $('a-selector'); 
if($object.length) { 
    // there's at least one matching element 
} 
+1

To nie jest poprawne. Powinno to być 'if ($ object.length> 0)' - nawet dla niezobowiązujących selektorów nadal zwraca 0 – Archer

+5

@Archer Co masz na myśli przez "nieuzasadnione selektory"? Jeśli masz na myśli selektory, które nie pasują do żadnych elementów, to tak, zwrócą '0', co jest dokładnie tym, czego chcemy. '0' to falsey, więc warunek' if' zakończy się niepowodzeniem, jeśli w obiekcie jQuery nie ma żadnych elementów. –

+1

Cóż, nigdy! Dzięki Anthony - Nigdy nie wiedziałem, że 0 jest odczytywane jako fałsz w instrukcji if. Właśnie dlatego "poprawiałem" ciebie. Dzięki za moją nową rzecz nauczyłem się na cały dzień. Otrzymaj +1 :) – Archer

1

Ogólne konwencje programowania mówią nie powtarzaj się. Tak więc, w tym przypadku, można przynajmniej zrobić stwierdzenia rzeczy tylko raz i zachować zmiennej odniesienia:

var thing = $("#" + machineId + packageId.removeSpecialChars().toUpperCase() + ""); 

Następnie Lookup wybór nie zdarza dwukrotnie zbędny metoda nazywa usunięte itp Ma to również korzyść z umożliwienia ci napisania bardziej zrozumiałego kodu, kiedy możesz nazwać zmienną na coś znaczącego, innego niż thing, lub, eeek!, a (choć niekoniecznie jest tak, że kod musi być bardziej sensowne, ludzie jeszcze używać nazw takich jak a!)

if (thing != null) { } 
if (thing.size() != 0) { 

} 
etc. 

chodzi o wywoływanie metod wiele razy, że często nieuniknione.

+0

Uważa się, że złą praktyką jest szczególnie sprawdzanie wartości zerowej w JS. Po prostu sprawdź, czy coś istnieje, ponieważ może być również niezdefiniowane, 0 lub fałsz – thomaux

+0

@Azeze Sprawdź, czy 'null' lub' undefined' jak chcesz, nie o to mi chodziło. –

0

Czyni, czego potrzebujesz to:

var a = $("#" + machineId + packageId.removeSpecialChars().toUpperCase() + ""); 
if (a.size()) { 
    var row = a; 
} 
1

Lepiej go cache:

var machId = $("#" + machineId + packageId.removeSpecialChars().toUpperCase()); 
if (machId.size() != 0) { 
    var row = machId; 
} 
0

Zasadniczo trzeba sprawdzić, czy DOM istnieje w twoim kodzie HTML, ale pamiętaj o tym, że jQuery nie zgłasza błędu krytycznego, jeśli element nie istnieje w twoim DOM, ale byłby to dobry sposób sprawdzenia, dodaje jeszcze jedną bezpieczną warstwę do kodu, coś o nazwie .size() wycofane z wersji 1.8, więc nie zaleca się używania nawet starej wersji jQuery, więc najlepszym rozwiązaniem w tej chwili byłoby coś w rodzaju poniższego kodu:

if($('.class').length) { // check if any element with this class exist, if not exist, it return 0 and can not pass the if estatement 
    // do something 
} 
Powiązane problemy