案例:e
类型为HtmlElement
,而非css selector
我说的是任何属性,而不仅仅是标准允许的属性,如atom-type
或data-atom-type
,无论名称是什么,它都可以在没有jQuery的情况下工作吗?
我怀疑$(e).attr(name,value)
太慢,首先它创建了一个完整的jQuery对象 ($(e) !== $(e) // two objects are not same)
(jsPerf:http://jsperf.com/jquery-attr-vs-native-setattribute/28)然后它会调用某些检查然后设置值,大多数浏览器都很容易支持e.setAttribute
。
将$(e).attr(name,value)
替换为e.setAttribute(name,value)
是否有任何问题?
根据MSDN文档,IE8支持setAttribute
。是否有任何移动浏览器或任何不支持它的浏览器?
最终我想提高我的JavaScript框架的性能,最初我们广泛使用jQuery来实现其跨浏览器DOM功能。
我们现在已经明白,除非您使用css selector
,否则当您拥有attr,val,text
的实例时,大多数函数(例如HtmlElement
)都会使用其直接DOM计数器部分进行调用。
答案 0 :(得分:5)
我怀疑
$(e).attr(name,value)
太慢了,首先它创建了一个完整的jQuery对象然后调用某些检查,然后设置值,大多数浏览器都很容易支持e.setAttribute
。
如果您measure it,您会发现相对而言,效果差异很大,但绝对值 微不足道 它是我们通常关心的绝对术语。它在99.999999%的情况下并不重要。如果遇到特定的性能问题,并使用jQuery跟踪它,那么然后会考虑在那时进行优化。
$(e).attr(name,value)
与e.setAttribute(name,value)
的好处是什么?
在您提到的具体案例中,e
是HTMLElement
,只有几个好处:
setAttribute
中有一些特定于IE的错误,jQuery为你工作
有一些"属性"人们在确实应该设置属性时设置,例如checked
或disabled
; jQuery映射那些(现在这主要是遗留功能,因为人们应该使用prop
)
它为您做了一些布尔值的预处理,让您在$(e).attr("checked", true)
确实应该true
时使用"checked"
根据MSDN文档,IE8支持setAttribute。是否有任何移动浏览器或任何不支持它的浏览器?
所有浏览器都支持setAttribute
。正如我前面提到的,IE的各种版本都有各种各样的错误,但它在那里并且大部分都有效。