2012-11-23 6 views
5

Sto selezionando un array di oggetti di input usando jQuery e sto incontrando un problema interessante quando tento di concatenare più metodi dopo aver selezionato uno degli elementi dell'array. Qualcuno può spiegarmi perché ho questo comportamento?Perché array [0] restituisce un oggetto diverso da array.first utilizzando jQuery e perché non posso usare .val()?

jQuery('.custom-size').first().find('input:hidden') 
returns => 

[<input id=​"custom_order_custom_sizes_attributes_0_size_id" name=​"custom_order[custom_sizes_attributes]​[0]​[size_id]​" type=​"hidden" value=​"138">​ 
, 
<input name=​"custom_order[custom_sizes_attributes]​[0]​[_destroy]​" type=​"hidden" value=​"0">​ 
] 

Se seleziono uno degli elementi che utilizzano jQuery .first() o .last() e quindi chiamare .val(), ottengo il valore atteso di "138".

Quando si tenta di utilizzare una posizione nell'array, posso riportare l'elemento dell'array:

var input = jQuery('.custom-size').first().find('input:hidden')[1] 
returns => 
<input name=​"custom_order[custom_sizes_attributes]​[0]​[_destroy]​" type=​"hidden" value=​"0"> 

non posso chiamare .val() su questo oggetto tuttavia. Invece ricevo questo messaggio di errore:

TypeError: Object #<HTMLInputElement> has no method 'val' 

posso usare .slice(x,y) per restituire il singolo elemento, ma questo sembra piuttosto sciocco. Cosa mi manca qui.

+0

Mettere insieme un jsfiddle che dimostra il problema, in questo modo possiamo giocarci e magari aiutare. – michaelward82

risposta

5

Il codice seguente:

$(".something")[0] 

ottiene un unico elemento DOM dal set jQuery. Questo codice fa lo stesso come se si fare

document.getElementsByClassName("something")[0] 

Estratto elemento DOM non ha val() metodo, dal momento che non è un oggetto jQuery.

Al fine di ottenere il primo jQuery oggetto da jQuery set, è possibile utilizzare sia :eq() selettore (o .eq() metodo), o :first selettore (o .first() metodo):

$(".something:eq(0)"); // $(".something").eq(0); 
$(".something:first"); // $(".something").first(); 
+0

perché .slice (x, y) funziona qui? Presumo che restituisca un oggetto jQuery ... ma non sono sicuro del perché? – Paul

+1

@Paul Perché jQuery ha un meraviglioso metodo ['slice()'] (http://api.jquery.com/slice/). – VisioN

+0

Oh non sapevo che era un metodo jQuery. Rubified JS :) – Paul

5

Se si accede a un oggetto jQuery con notazione parentesi e indice, restituisce l'elemento DOM non elaborato in quell'indice. Gli elementi DOM non hanno alcun metodo jQuery.

.first, .last o .eq dall'altro restituiscono un oggetto jQuery. Per ottenere un oggetto jQuery su un indice specifico n, utilizzare $(...).eq(n).

2

La posizione nativa per indice ([1]) restituisce l'elemento DOM specificato.
jQuery funziona come .first() restituisce un oggetto jQuery (praticamente più elementi DOM avvolti in una skin jQuery) che ha quelle altre funzioni.

Problemi correlati