我有以下代码行
$("*[class]").each(function (index, elem)
{
console.log("Element: " + elem.tagName + " " + $(elem).prop("className"));
});
我无法理解的是elem
和$(elem)
之间的区别
elem
已经不是jJuery对象吗?如果是,那么为什么我们需要在$(elem)
参数中再次使用console.log
来获取属性className。
为什么我们不能直接做elem.prop("className")
。
答案 0 :(得分:3)
首先,存在DOM。这是浏览器在解析HTML文档后理解HTML文档的方式。浏览器本身可以理解访问元素和与元素交互的特定方式。
然而,这些是相当有限的,非常详细。它们不易编写或阅读。
这就是创建jQuery的原因。
使用$()
构建jQuery对象时,它会创建一个“包装”本机DOM对象的新对象,实际上通常用于包装多个DOM对象并一起处理它们。有大量的功能可供使用,并为您完成所有冗长的工作,因此您的代码很容易编写和读取。使用jQuery没有什么新东西可以做,但写入和阅读起来要快得多。
在这种情况下,elem
是本机DOM对象。当使用each
迭代集合时,jQuery不会自动将DOM对象转换为jQuery对象。这有两个主要原因。首先,您并不总是需要jQuery对象。例如,如果你想要做的就是获得元素的tagName
属性,你就可以elem.tagName
。其次,创建jQuery对象的计算成本很高。它可能会大大减慢你的脚本速度。
因此,如果你想获得一个jQuery对象,你需要自己使用jQuery构造函数。
答案 1 :(得分:1)
each
函数参数是本机DOM元素,而不是包装该本机DOM元素的jQuery对象。
请注意,对于我所知道的所有jQuery函数,val
,attr
,map
......总是参数是DOM元素jQuery对象。
您还可以使用this
关键字访问该原生元素。
Native元素是实现Element interface的元素
jQuery对象只是一个包装一组原生元素的对象(零到N个元素)
jQuery对象具有更强大和简单的API,例如.html()
,而本机元素具有笨拙的API,许多示例......
jQuery对象有prop
,而本机元素只有属性...
$(element).prop('id')
VS element.id
这个例子很糟糕,因为通常本机方法不更简单。 :)