如何从JQuery选择器获取DOM元素


179

我很难从jquery选择器中获取实际的DOMElement。样例代码:

<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

这让我无所适从,但有时我需要真正的DOMElement。


4
在一种情况下可能需要这样做:在Knockout.js中,该函数applyBindings期望一个DOM节点而不是jQuery选择器。这个问题(及其答案)正是需要的。
Muhammad Alkarouri

Answers:


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,它评估为true还是失败?
meder omuraliev 2009年

@BillRob如果get()没有返回DOM元素,则出了点问题。请参阅此处的文档:docs.jquery.com/Core/get#index
Sixten Otto

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

5
如果要显式使用DOM属性,使用jQuery有什么意义?拥有对可能的TypeError错误进行防错的一致代码,岂不是更好吗?几年前,我曾经是一名精英ECMAScripter,并且避免使用框架,但是当我了解到不一致之处后,我最终更加依赖了。浏览器引擎只会越来越快,除非速度非常明显,否则您不必为此担心。使用框架的全部目的是使可行的一致代码解决许多问题,而不是尽可能快地完成工作。
meder omuraliev 09年

7

编辑:似乎在假设您无法获取元素时我错了。正如其他人在这里发布的一样,您可以通过以下方式获得它:

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

我已验证这实际上返回了匹配的DOM元素。


2
再说一遍,但并非所有浏览器都重复。在IE7及更早版本中失败。
Slavo 2010年

6

我需要将元素作为字符串获取。

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

这会给你类似的东西:

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

...作为字符串而不是DOM元素。


1

如果您需要直接与DOM元素进行交互,为什么不直接使用,document.getElementById因为如果您尝试与特定元素进行交互,则您可能会知道id,因为假设类名仅在一个元素上或其他选项可能会冒险。

但是,我倾向于与其他人同意,在大多数情况下,您应该学会使用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,因此我试图打破对ms ajax javascript的依赖,学习jquery。似乎jquery会更改checkbox .val()方法的行为是完全违反直觉的。与其他每个.val()调用一样,它返回表单发布字段。jQuery非常好用,因此更改val()方法令人困惑,并希望找到一种快速的解决方法。
BillRob


2
James奇怪val()方法实际上是.attr(“ value”)。我想知道为什么他们有两种不同的方法。对我来说.val()是表单发布字段的值。
BillRob

2
@BillRob-jQuery只是简化和标准化了如何获取值,而不是您必须亲自去做实际的事情。
James Black

有时,您需要一个具有ID和父子场景的复杂选择器,并且可以通过jQuery使用一行代码来获取它,但是使用document.getElementById则需要一天的时间。我同意混合库是一个坏主意,但这有时会发生,并且从jquery对象获取DOM元素的任务非常艰巨,尤其是在.get(0)不具有浏览器兼容性的情况下。
Slavo 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.