我有一個jQuery選擇,它既可以作爲新創建的元素(例如$("<div/>")
)發起,也可以不具有父代,或者實際上是DOM中的元素。確定一個jQuery選擇是否在DOM中
確定所選元素是否實際位於當前DOM樹中的最有效方法是什麼?
一種可能性是致電.parent()
,但我懷疑有一種更有效的方法。
我有一個jQuery選擇,它既可以作爲新創建的元素(例如$("<div/>")
)發起,也可以不具有父代,或者實際上是DOM中的元素。確定一個jQuery選擇是否在DOM中
確定所選元素是否實際位於當前DOM樹中的最有效方法是什麼?
一種可能性是致電.parent()
,但我懷疑有一種更有效的方法。
我意識到我的問題,安迪的解決方案(使用node.parentNode
)可以推廣。這裏有一個完整版本,可以用於任何jQuery選擇,即使它至少有一個祖先。
/**
* Returns true if this selection is part of the current DOM;
* false if it's a fragment.
* @return {Boolean}
*/
jQuery.fn.inDom = function() {
// Get the first element in the jQuery selection
var node = this[0];
while (node) {
if (node.nodeType === Node.DOCUMENT_NODE) {
return true;
}
node = node.parentNode;
}
return false;
}
爲新創建的元素指定一個ID並查詢該ID。
但是這樣更有效率嗎?我要求分析。 – 2011-01-13 21:56:22
像$(yourDiv).index('body div')
可以告訴你很多東西。
要求.parent()
的想法並不差,實際上它是一種非常常見的方式。無論如何,你也可以使用.contains()
方法。
var newdiv = $('<div>');
if($.contains(document.body, newdiv[0])) {
}
參考:.contains()
例如:http://www.jsfiddle.net/gGPav/
性能:http://jsperf.com/contains-vs-parentnode
看演出,我也會去node.parentNode
如果你想讓你的JavaScript運行得更快,這不會有太大的區別。你需要先做一些分析工作,看看實際上很慢。調用父()一百次甚至不會花費毫秒。 – 2011-01-13 22:10:39
@Mike,這取決於我需要多久調用一次該方法。 – kpozin 2011-01-13 22:25:28