Как получить элемент DOM из селектора JQuery

179

У меня невероятно трудно найти фактический элемент DOME из селектора 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

Это заставляет меня обойтись без флажка, но иногда мне нужен настоящий элемент DOME.

BillRob
источник
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. В противном случае вызов свойства .checked сработал бы.
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? Несколько лет назад я был элитарным читателем ECMAS и избегал фреймворков, но чем больше я узнавал о несоответствиях, тем больше полагался на меня. Движки браузера становятся все быстрее и быстрее, если скорость не заметна, вам не стоит об этом беспокоиться. Весь смысл использования фреймворка состоит в том, чтобы иметь работоспособный согласованный код, решающий многие проблемы, а не делать вещи как можно быстрее.
meder omuraliev
7

Изменить: кажется, я был неправ, предполагая, что вы не можете получить элемент. Как и другие опубликовали здесь, вы можете получить его с:

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

Я убедился, что это на самом деле возвращает элемент DOM, который был сопоставлен.

eduncan911
источник
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 и получает атрибут «значение» элемента, независимо от того, проверен он или нет.

Джеймс Блэк
источник
2
Я мог бы использовать document.getElementById или метод MS ajax $ get. С тех пор как MS одобрила jquery, я пытаюсь сломать свою зависимость от javascript ms ajax и изучить jquery. Кажется совершенно нелогичным, что jquery изменил бы поведение метода checkbox .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) нет совместимости с браузером.
Славо