2009-11-05 12 views
150

Mam niewiarygodne trudności ze znalezieniem rzeczywistego DOMElement z selektora jquery. Przykładowy kod:Jak uzyskać element DOM z selektora JQuery

<input type="checkbox" id="bob" /> 
    var checkbox = $("#bob").click(function() { //some code }) 

iw innym kawałku kodu próbuję określić zaznaczoną wartość pola wyboru.

if (checkbox.eq(0).SomeMethodToGetARealDomElement().checked) 
    //do something. 

I proszę, nie chcę zrobić:

if (checkbox.eq(0).is(":checked")) 
    //do something 

To ja się wokół wyboru, ale czasami mam potrzebne prawdziwe DOMElement.

+4

Jeden przypadek, w którym może być potrzebny: w Knockout.js funkcja 'applyBindings' oczekuje, że węzeł DOM nie jest selektorem jQuery. To pytanie (i jego odpowiedzi) są dokładnie tym, czego potrzeba. –

Odpowiedz

233

Możesz uzyskać dostęp do elementu DOM z surowego:

$("table").get(0); 

lub prościej:

$("table")[0]; 

Nie ma rzeczywiście dużo trzeba jednak za to (w moim doświadczeniu). Weź przykład z pola wyboru:

$(":checkbox").click(function() { 
    if ($(this).is(":checked")) { 
    // do stuff 
    } 
}); 

jest bardziej "jquery'ish" i (imho) bardziej zwięzły. Co jeśli chcesz je policzyć?

$(":checkbox").each(function(i, elem) { 
    $(elem).data("index", i); 
}); 
$(":checkbox").click(function() { 
    if ($(this).is(":checked") && $(this).data("index") == 0) { 
    // do stuff 
    } 
}); 

Niektóre z tych funkcji pomagają również maskować różnice w przeglądarkach. Niektóre atrybuty mogą być różne. Klasycznym przykładem są połączenia AJAX. Aby to zrobić poprawnie w surowym języku Javascript, ma około 7 przypadków zastępczych dla XmlHttpRequest.

+1

Dzięki, ale metoda get nadal zwraca element jquery, a nie element dom. W przeciwnym razie zadziałałaby wywołanie właściwości .checked. – BillRob

+0

Spróbuj '$ ('a'). Get (0) .nodeType == 1' w Firebug na tej stronie, czy jest to prawda czy nie? –

+0

@BillRob if get() nie zwraca elementu DOM, coś jest nie tak. Zobacz dokumentację tutaj: http://docs.jquery.com/Core/get#index –

1

Jeśli potrzebujesz interakcji bezpośrednio z elementem DOM, to dlaczego nie po prostu użyć document.getElementById, ponieważ jeśli próbujesz wejść w interakcję z konkretnym elementem, prawdopodobnie znasz identyfikator, zakładając, że nazwa klasy znajduje się tylko na jednym elemencie lub inna opcja może być ryzykowna.

Ale, zgadzam się z innymi, że w większości przypadków powinieneś nauczyć się robić to, czego potrzebujesz, używając jQuery, ponieważ jest bardzo elastyczny.

UPDATE: Na podstawie komentarza: Oto post z ładnym wyjaśnienia: http://www.mail-archive.com/[email protected]/msg04461.html

$(this).attr("checked") ? $(this).val() : 0 

ta zwróci wartość, jeśli jest zaznaczone, lub 0 jeśli nie jest.

$(this).val() dopiero sięga po dom i otrzymuje atrybut "wartość" elementu, niezależnie od tego, czy jest zaznaczony.

+2

Mogę użyć metody document.getElementById lub MS ajax $ get. Ponieważ MS poparło jquery, próbuję złamać moją zależność od ms ajax javascript i uczyć się jquery. Wydaje się całkowicie sprzeczne z intuicją, że jquery zmieniłoby zachowanie metody checkbox .val(). Jak każde inne wywołanie .val() zwraca pola formularza. jQuery był tak dobry, że praca z nim była tak myląca, że ​​zmieniła metodę val() i miała nadzieję na szybkie obejście problemu. – BillRob

+2

Więc sprawdź tę stronę: http://www.mail-archive.com/[email protected]/msg04461.html –

+2

To dziwne, James, że metoda val() jest naprawdę .attr ("wartość") . Zastanawiam się, dlaczego mają do tego dwie różne metody. Dla mnie .val() jest wartością pola formularza. – BillRob

7

Edycja: wydaje się, że nie miałem racji zakładając, że nie można uzyskać elementu. Jak napisali tutaj inni, możesz to uzyskać:

$('#element').get(0); 

Zweryfikowałem, że faktycznie zwraca element DOM, który został dopasowany.

+1

Powtarzam się, ale znowu ... nie we wszystkich przeglądarkach. Nie działa w IE7 i wcześniejszych wersjach. – Slavo

6

Potrzebowałem uzyskać element jako ciąg.

jQuery("#bob").get(0).outerHTML; 

które dadzą ci coś takiego:

<input type="text" id="bob" value="hello world" /> 

... jako ciąg znaków, a nie elementu DOM.

Powiązane problemy