Як отримати елемент DOM від селектора JQuery


179

Мені неможливо важко дізнатися, щоб отримати фактичний DOMElement від селектора jquery. Приклад коду:

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

а в іншому фрагменті коду я намагаюся визначити встановлене значення прапорця.

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

І будь ласка, я не хочу цього робити:

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

Це мене обертає біля прапорця, але в інші рази мені потрібен був справжній ДОМЕмент.


4
Один випадок, коли це може знадобитися: у Knockout.js функція applyBindingsочікує, що вузол DOM не є селектором jQuery. Це питання (та його відповіді) - саме те, що потрібно.
Мухаммед Алькарурі

Відповіді:


264

Ви можете отримати доступ до необмеженого елемента DOM за допомогою:

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

або простіше:

$("table")[0];

Насправді, для мого цього досвіду насправді не дуже багато (на мій досвід). Візьміть свій приклад прапорця:

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

є більш "jquery'ish" і (imho) більш стислим. Що робити, якщо ви хотіли їх пронумерувати?

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

Деякі з цих функцій також допомагають замаскувати відмінності у веб-переглядачах. Деякі атрибути можуть бути різними. Класичний приклад - дзвінки AJAX. Для цього належним чином у сирому Javascript є близько 7 резервних випадків для XmlHttpRequest.


1
Дякую, але метод get все ще повертає елемент jquery, а не елемент dom. Інакше виклик властивості .виконав би спрацював.
BillRob

Спробуйте $('a').get(0).nodeType==1в Firebug на цій сторінці, чи оцінюється вона справжньою чи невдалою?
meder omuraliev

@BillRob якщо get () не повертає елемент DOM, щось не так. Дивіться документи тут: docs.jquery.com/Core/get#index
Sixten Otto

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

5
Який сенс використовувати jQuery, якщо ви будете явно використовувати властивості DOM? Чи не слід краще мати послідовний код, захищений від помилок щодо можливих TypeErrors? Кілька років тому я був елітарним ECMAScripter і уникав фреймворків, але чим більше я дізнався про невідповідності, тим я все більше покладався. Двигуни браузера стають тільки все швидшими та швидшими, якщо швидкість не помітна, ви не повинні з цим дуже хвилюватися. Весь сенс використання фреймворку полягає в тому, щоб справно працюючий код вирішував багато питань, не роблячи роботу якомога швидше.
meder omuraliev

7

Редагувати: здається, я помилявся, вважаючи, що ви не можете отримати елемент. Як опублікували інші, ви можете отримати це за допомогою:

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

Я перевірив, що це фактично повертає зібраний елемент DOM.


2
Повторюю себе, але знову ж таки… Не у всіх браузерах. Помилки в IE7 і раніше.
Славо

6

Мені потрібно було отримати елемент у вигляді рядка.

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

Що дасть вам щось на кшталт:

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

... як рядок, а не елемент DOM.


1

Якщо вам потрібно взаємодіяти безпосередньо з елементом DOM, чому б не просто використовувати, document.getElementByIdоскільки, якщо ви намагаєтесь взаємодіяти з певним елементом, ви, ймовірно, знаєте ідентифікатор, якщо припускати, що ім'я класу знаходиться лише на одному елементі, або якась інша опція має тенденцію бути ризикованим.

Але я схильний погоджуватися з іншими, що в більшості випадків ви повинні навчитися робити те, що вам потрібно, використовуючи те, що дає вам jQuery, оскільки це дуже гнучко.

ОНОВЛЕННЯ: На основі коментаря: Ось публікація з приємним поясненням: http://www.mail-archive.com/jquery-en@googlegroups.com/msg04461.html

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

Це поверне значення, якщо воно встановлено, або 0, якщо його немає.

$(this).val() просто потрапляє в dom і отримує атрибут "value" елемента, незалежно від того, перевіряється він чи ні.


2
Я міг би використати document.getElementById або метод MS ajax $ get. Оскільки MS схвалив jquery, я намагаюся порушити свою залежність від JavaScript ajax javascript та вивчити jquery. Здається, цілком протиінтуїтивно зрозуміло, що jquery змінить поведінку методу прапорця .val (). Як і кожен інший .val () виклик повертає поля публікації форми. jQuery настільки добре працював, тому було заплутано змінити метод val () і сподівався знайти швидке вирішення.
BillRob

2
Тому перегляньте цю сторінку: mail-archive.com/jquery-en@googlegroups.com/msg04461.html
Джеймс Блек

2
Це дивно, Джеймс, що метод val () дійсно .attr ("значення"). Цікаво, чому вони мають для цього два різні методи. Для мене .val () - значення поля публікації форми.
BillRob

2
@BillRob - jQuery просто спрощує та стандартизує, як отримати значення, а не потрібно переходити до фактичного елемента та робити це самостійно.
Джеймс Блек

Іноді вам потрібен складний селектор з ідентифікаторами та сценарієм батько-дитина, і ви можете отримати його через jQuery з одним рядком коду, але для використання document.getElementById потрібен день. Я погоджуюся, що змішування бібліотек - це погана ідея, але це буває просто іноді, а завдання отримати елемент DOM від об’єкта jquery є досить важким, особливо з .get (0), що не має сумісності з браузером.
Славо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.