JQuery Seçiciden DOM Öğesi Nasıl Alınır


179

Bir jquery seçiciden gerçek DOMElement almak için bulmak imkansız zor zaman yaşıyorum. Basit kod:

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

ve başka bir kod parçası onay kutusunun işaretli değerini belirlemeye çalışıyorum.

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

Ve lütfen, yapmak istemiyorum:

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

Bu beni onay kutusunun etrafında tutuyor, ama diğer zamanlarda gerçek DOMElement'e ihtiyacım vardı.


4
Bunun gerekli olabileceği bir durum: Knockout.js'de işlev, applyBindingsbir jQuery seçici değil bir DOM düğümü bekler. Bu soru (ve cevapları) tam olarak ihtiyaç duyulan şeydir.
Muhammad Alkarouri

Yanıtlar:


264

Ham DOM öğesine aşağıdakilerle erişebilirsiniz:

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

veya daha basit:

$("table")[0];

Aslında bunun için çok fazla ihtiyacınız yok ancak (tecrübelerime göre). Onay kutusu örneğinizi alın:

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

"jquery'ish" ve (imho) daha özlüdür. Ya onları numaralandırmak isteseydiniz?

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

Bu özelliklerden bazıları, tarayıcılardaki farklılıkların da maskelenmesine yardımcı olur. Bazı özellikler farklı olabilir. Klasik örnek AJAX çağrılarıdır. Ham düzgün bunu yapmak için Javascript için yaklaşık 7 yedek durumda vardır XmlHttpRequest.


1
Teşekkürler, ancak get yöntemi dom öğesini değil, bir jquery öğesini döndürür. Aksi takdirde .checked özellik çağrısı işe yarardı.
BillRob

$('a').get(0).nodeType==1Bu sayfadaki Firebug'da deneyin , doğru mu yoksa başarısız mı olarak değerlendiriliyor?
meder omuraliev

@BillRob, get () DOM öğesini döndürmüyorsa, bir sorun var. Buradaki dokümanlara bakın: docs.jquery.com/Core/get#index
Sixten Otto

$('<input type=checkbox>').appendTo('body').get(0).checked
meder omuraliev

5
Açıkça DOM özelliklerini kullanacaksanız jQuery kullanmanın anlamı nedir? Olası TypeErrors'a karşı hatasız tutarlı bir koda sahip olmak daha iyi olmamalı mı? Birkaç yıl önce elitist bir ECMAScripter idim ve çerçevelerden kaçınırdım, ancak tutarsızlıklar hakkında daha fazla şey öğrendim, daha fazla güvenmeye başladım. Tarayıcı motorları sadece daha hızlı ve daha hızlı hale geliyor, hız farkedilmezse, bu konuda gerçekten endişelenmemelisiniz. Bir çerçeveyi kullanmanın tüm amacı, mümkün olduğunca hızlı bir şekilde bir şeyler yapmak yerine, birçok sorunu çözen uygulanabilir tutarlı kodlara sahip olmaktır.
meder omuraliev

7

Düzenleme: Öğe alamadım varsayarak yanlış gibi görünüyor. Diğerlerinin burada yayınladığı gibi, aşağıdakileri alabilirsiniz:

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

Bu aslında eşleşen DOM öğesi döndürür doğruladı.


2
Kendimi tekrar ediyorum, ama yine ... tüm tarayıcılarda değil. IE7 ve öncesi başarısız.
Slavo

6

Bir dize olarak eleman almak gerekiyordu.

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

Hangi gibi bir şey verecektir:

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

... DOM öğesi yerine dize olarak.


1

DOM öğesiyle doğrudan etkileşime girmeniz gerekiyorsa, neden yalnızca kullanmıyorsunuz, document.getElementByIdçünkü belirli bir öğeyle etkileşime girmeye çalışıyorsanız, sınıf adının yalnızca bir öğede veya başka bir seçeneğin var olduğunu varsayarak muhtemelen kimliği bileceksiniz. riskli ol.

Ancak, diğerleriyle hemfikirim, çoğu durumda jQuery'nin size verdiği şeyi kullanarak ihtiyacınız olan şeyi yapmayı öğrenmelisiniz, çünkü çok esnektir.

GÜNCELLEME: Bir yoruma göre: İşte güzel bir açıklama içeren bir yayın: http://www.mail-archive.com/jquery-en@googlegroups.com/msg04461.html

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

Bu, işaretlenirse değeri veya işaretlenmezse 0 değerini döndürür.

$(this).val() işaretli olsun veya olmasın, yalnızca dom'a ulaşıyor ve öğenin "değer" özelliğini alıyor.


2
Document.getElementById veya MS ajax $ get yöntemini kullanabilirsiniz. MS jquery onayladığından beri ms ajax javascript'e olan güvenimi kırmaya ve jquery öğrenmeye çalışıyorum. Jquery'nin checkbox .val () yönteminin davranışını değiştireceği tamamen sezgisel görünüyor. Diğer her .val () çağrısı form yazı alanlarını döndürür. jQuery ile çalışmak çok iyi oldu, bu yüzden val () yöntemini değiştirmek kafa karıştırıcıydı ve hızlı bir çözüm bulmayı umuyordu.
BillRob


2
Val () yönteminin gerçekten .attr ("değer") olduğu tuhaf James. Bunun için neden iki farklı yöntemi olduğunu merak ediyorum. Bana göre .val () form yazı alanının değeridir.
BillRob

2
@BillRob - jQuery, gerçek öğeye gitmek ve bunu kendiniz yapmak yerine, değeri nasıl elde edeceğinizi basitleştiriyor ve standartlaştırıyor.
James Black

Bazen kimlikleri ve bir üst-alt senaryosu olan karmaşık bir seçiciye ihtiyacınız vardır ve bunu bir kod satırı ile jQuery'den alabilirsiniz, ancak document.getElementById'i kullanmak bir gün sürer. Kitaplıkların karıştırılmasının kötü bir fikir olduğunu kabul ediyorum, ancak sadece bazen oluyor ve bir jquery nesnesinden bir DOM öğesi alma görevi, özellikle .get (0) tarayıcı uyumluluğuna sahip değilken, zor.
Slavo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.