Come controllare gli oggetti null in jQuery


169

Sto usando jQuery e voglio verificare l'esistenza di un elemento nella mia pagina. Ho scritto il seguente codice, ma non funziona:

if($("#btext" + i) != null) {
    //alert($("#btext" + i).text());
    $("#btext" + i).text("Branch " + i);
}

Come posso verificare l'esistenza dell'elemento?

Risposte:


251

Controlla le FAQ di jQuery ...

È possibile utilizzare la proprietà length della raccolta jQuery restituita dal selettore:

if ( $('#myDiv').length ){}

cosa ne pensi di var _myDiv = $ ('# myDiv'); ... .... if (_myDiv.lenght) {...} produce un'eccezione.
Nuri YILMAZ,

1
come diceva eleotlecram; meglio evitare .length
numediaweb

5
@AurelianoBuendia, hai usato al lenghtposto di length; è un errore di ortografia.
Sam,

4
@numediaweb, eleotlecram non ha detto di evitare .length.
Sam,

1
ma .. non visualizzerai un errore "Impossibile leggere la proprietà 'lunghezza' di null"?
Sagive SEO

61

(Dal momento che non ho abbastanza reputazione per votare la risposta ...)

Wolf ha scritto:

Chiamare la proprietà length su un oggetto indefinito o nullo farà fallire i browser IE e webkit!

Invece prova questo:

 // NOTE!! THE FOLLOWING IS WRONG; DO NOT USE!  -- EleotleCram
if($("#something") !== null){
  // do something
}

o

 // NOTE!! THE FOLLOWING IS WRONG; DO NOT USE!  -- EleotleCram
if($("#something") === null){
  // don't do something
}

Mentre è vero che chiamare la proprietà length su un oggetto indefinito o nullo farà fallire i browser, il risultato dei selettori di jQuery ($ ('...')) non sarà mai nullo o indefinito. Quindi i suggerimenti sul codice non hanno senso. Usa una delle altre risposte, hanno più senso.


(Aggiornamento 2012) Perché le persone guardano il codice e questa risposta è piuttosto in cima alla lista: Negli ultimi due anni, ho usato questo piccolo plugin:

  jQuery.fn['any'] = function() {
     return (this.length > 0);
  };

Penso che $ ('div'). Any () sia migliore di $ ('div'). Length , in più non soffrirai tanto per errori di battitura: $ ('div'). Ayn () darà un errore di runtime , $ ('div'). La lunghezza in silenzio molto probabilmente sarà sempre falsa.

__
Modifica novembre 2012:

1) Poiché la gente tende a guardare il codice e non a leggere ciò che viene detto intorno al codice, ho aggiunto due grandi note da leggere al codice citato di Wolf.
2) Ho aggiunto il codice del piccolo plugin che utilizzo per questa situazione.


2
@VovaPopov: ti suggerisco la prossima volta che ti prendi un po 'più di tempo per leggere la risposta. Stavo semplicemente affermando che l'esempio di codice "di Wolf" non era corretto. Non ho mai fornito una risposta, ho solo fatto riferimento ad alcune delle altre risposte che hanno più senso.
eleotlecram

Buona risposta. Mi dispiace che la gente lo fraintenda.
Joe Simmons,

14

La funzione di ricerca restituisce una matrice di elementi corrispondenti. È possibile verificare se la lunghezza è zero. Nota la modifica per cercare gli elementi solo una volta e riutilizzare i risultati secondo necessità.

var elem = $("#btext" + i);
if (elem.length != 0) {
   elem.text("Branch " + i);
}

Inoltre, hai provato a usare solo la funzione text - se non esiste alcun elemento, non farà nulla.

$("#btext" + i).text("Branch " + i);

7
0 è un valore falso, quindi l'espressione elem.length restituisce falso - in altre parole, non è necessario per la parte '! = 0'
James

2
@ 999, penso che il segno di spunta contro zero renda il codice più leggibile, sebbene entrambi i modi siano probabilmente leggibili per qualcuno che è abituato ai linguaggi di scripting.
Sam,

12

La funzione jquery $ () restituisce sempre un valore non nullo - elementi medi corrispondenti alla cretaria del selettore. Se l'elemento non è stato trovato, verrà restituito un array vuoto. Quindi il tuo codice sarà simile a questo -

if ($("#btext" + i).length){
        //alert($("#btext" + i).text());
    $("#btext" + i).text("Branch " + i);
}

1
Non credo sia vero che $ () restituisca un array. Gli oggetti jQuery hanno comportamenti simili agli array, ma non penso che siano effettivamente array, e penso che scoprirai che non tutto il loro comportamento è uguale a quello degli array. Guarda questa rapida dimostrazione .
Sam

5

In jQuery 1.4 ottieni la funzione $ .isEmptyObject, ma se sei costretto a usare una versione precedente di jQ ​​come noi poveri sviluppatori di Drupal semplicemente rubi usa questo codice:

// This is a function similar to the jQuery 1.4 $.isEmptyObject.
function isObjectEmpty(obj) {
  for ( var name in obj ) {
    return false;
  }
  return true;
}

Usalo come:

console.log(isObjectEmpty(the_object)); // Returns true or false.

Questo non affronta la domanda.
Sam

5

indipendentemente dalla selezione effettuata, la funzione $()restituisce sempre un oggetto jQuery in modo che non possa essere utilizzato per il test. Il modo migliore ancora (se non l'unico) è usare la size()funzione o la proprietà della lunghezza nativa come spiegato sopra.

if ( $('selector').size() ) {...}                   

3
if ( $('#whatever')[0] ) {...}

L'oggetto jQuery che viene restituito da tutti i metodi nativi jQuery NON è un array, è un oggetto con molte proprietà; uno di questi è una proprietà "lunghezza". Puoi anche controllare size () o get (0) o get () - 'get (0)' funziona allo stesso modo dell'accesso al primo elemento, ovvero $ (elem) [0]


3

Che dire dell'utilizzo di "undefined"?

if (value != undefined){ // do stuff } 

1

usare $("#selector").get(0)per verificare con null in questo modo. get restituisce l'elemento dom, fino ad allora hai a che fare con un array, dove devi controllare la proprietà length. Personalmente non mi piace il controllo della lunghezza per la gestione nulla, mi confonde per qualche motivo :)


È interessante il modo in cui le diverse persone pensano diversamente; Penso che abbia più senso verificare se il numero di elementi è zero anziché verificare se il primo elemento è presente.
Sam,

1

Usando la proprietà length puoi farlo.

jQuery.fn.exists = function(){return ($(this).length < 0);}
if ($(selector).exists()) { 
   //do somthing
}

2
Intendi (questo) lunghezza> 0?
sage88,

0

quando l'oggetto è vuoto restituire questo errore:

Uncaught TypeError: Cannot read property '0' of null

Provo questo codice:

try{
  if ($("#btext" + i).length) {};               
}catch(err){
  if ($("#btext" + i).length) {
     //working this code if the item, not NULL 
   }
}

-4
if (typeof($("#btext" + i)) == 'object'){
    $("#btext" + i).text("Branch " + i);
}

-7

Chiamare la proprietà length su un oggetto indefinito o nullo farà fallire i browser IE e webkit!

Invece prova questo:

if($("#something") !== null){
  // do something
}

o

if($("#something") === null){
  // don't do something
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.