如何在jquery中檢測何時將新元素添加到文檔中?如何在jquery中檢測何時將新元素添加到文檔中?
說明: 我想知道何時將具有類「列標題」的元素添加到文檔中。正如我計劃在這些元素上運行一些JavaScript。
我該怎麼做?我使用jQuery JavaScript庫。
如何在jquery中檢測何時將新元素添加到文檔中?如何在jquery中檢測何時將新元素添加到文檔中?
說明: 我想知道何時將具有類「列標題」的元素添加到文檔中。正如我計劃在這些元素上運行一些JavaScript。
我該怎麼做?我使用jQuery JavaScript庫。
如果你想要做一些jQuery的就可以了,你也可以這樣做livequery (extra plugin):
$('column-header').livequery(function()
{
// do things here with your column-header, like binding new events and stuff.
// this function is called when an object is added.
// check the API for the deletion function and so on.
});
UPDATE: 看來,鏈接被打破。嘗試this link
試試這個...
if($('.column-header')){
//do something...
}
,或者你也可以這樣做this..it將更加通用
jQuery.exists = function(selector) { return ($(selector).length > 0); }
if ($(selector).exists()) {
// Do something
}
問題依然存在,何時發表該聲明? – jAndy
是的,就是這樣的事情。我不想一次又一次地開槍。 –
你應該看看jQuery Mutation Events。我相信這是你正在尋找的。
按照指向http://www.adaptavist.com/display/jQuery/Mutation+Events的鏈接解釋它更多 – MattSmith
謝謝,看一看 –
$(document).bind('DOMNodeInserted', function(e) {
console.log(e.target, ' was inserted');
});
DOMNodeInserted
是DOM級別3事件。這反過來意味着,你需要一個相當新的瀏覽器來支持這種事件。
參考:MDC
嗯......這看起來很有趣。 –
這是IMO未來發展的最佳選擇。但應該指出,IE8和更低版本不支持這種功能。我在下面添加了一個答案,如果有人想要做一個快速和骯髒的方式來做這樣的工作在IE8和更低,不想使用livequery出於某種原因。 –
截至2016年[突變事件](https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events)已被棄用。建議不要在舊項目或新項目中使用這種技術。皮蒂。 –
,如果你想設置相同功能的所有類的元素column-header
然後你可以使用jQuery的生活()
$(".column-header").live("click",function(){});
是的,但它的問題是,它只會在觸發點擊而不是呈現。 –
如何使用投票 - 繼續尋找具有類元素「列標題「,直到找到它,然後執行操作。看起來很簡單。
是的,這將工作,但會有UI經驗滯後。希望避免這一點。 –
我認爲這取決於你的dom結構在頁面上有多深和多寬。我不認爲使用一些jQuery插件你會獲得更快的性能 - 應該在特定的例子上進行測試。 – bogatyrjov
是的,我試圖livequery。有一個滯後。 –
我會使用setInterval重複檢查元素。例如。
var curLength=0;
setInterval(function(){
if ($('.column-header').length!=curLength){
curLength=$('.column-header').length;
// do stuff here
}
},100);
此代碼將檢查是否有任何新的.colum-header元素,每100毫秒
這將工作。但不是很重嗎? –
這將是相當沉重的,但沒有本地支持NodeAdded事件。這是一樣好。無論如何,實時查詢突變事件肯定會使用某種setInterval循環。 – Ivan
根本不會太重,請將Interval設置爲變量並將其清除。 –
我認爲上面提到的DOMNodeInserted方法可能是最性感的選擇,但如果你需要的是會一起工作的東西IE8和更低的,你可以不喜歡以下:
// wrap this up in en immediately executed function so we don't
// junk up our global scope.
(function() {
// We're going to use this to store what we already know about.
var prevFound = null;
setInterval(function() {
// get all of the nodes you care about.
var newFound = $('.yourSelector');
// get all of the nodes that weren't here last check
var diff = newFound.not(prevFound);
// do something with the newly added nodes
diff.addClass('.justGotHere');
// set the tracking variable to what you've found.
prevFound = newFound;
}, 100);
})();
這僅僅是基本的想法,你可以改變但是你想,做的方法了吧,保持的setInterval的返回值,以便您可以阻止它,或者你需要做的任何事情。但它應該完成工作。
截至2013 MutationEvents已棄用。如果任何人有問題了DOM中的檢測新的元素,你可以改用MutationObservers: https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
不要只是回答粘貼鏈接,詳細說明你的答案。 (我來到這裏是因爲你的答案有標誌) – BrunoLM
接受的答案從2011年使用了過時的插件和最高upvoted答案使用它們現在deprecated突變事件。
今天,您應該使用MutationObserver來檢測元素何時添加到DOM。 MutationObservers現在在所有現代瀏覽器(Chrome 26 +,Firefox 14 +,IE11,Edge,Opera 15 +等)中得到廣泛支持。
下面是一個簡單示例,說明如何使用MutationObserver
來偵聽元素何時添加到DOM。
爲簡潔起見,我使用jQuery語法構建節點並將其插入到DOM中。
var myElement = $("<div>hello world</div>")[0];
var observer = new MutationObserver(function(mutations) {
if (document.contains(myElement)) {
console.log("It's in the DOM!");
observer.disconnect();
}
});
observer.observe(document, {attributes: false, childList: true, characterData: false, subtree:true});
$("body").append(myElement); // console.log: It's in the DOM!
的observer
事件處理程序將觸發每當任何節點被添加或從document
除去。在處理程序內部,我們然後執行contains
檢查以確定myElement
現在是否在document
中。
因爲您可以直接在myElement
上執行document.contains
檢查,所以不需要遍歷存儲在mutations
中的每個MutationRecord。
要提高性能,請將document
替換爲DOM中包含myElement
的特定元素。
謝謝,它爲我工作。 –
livequery不存在 – w35l3y
@ w35l3y我認爲這是現在的鏈接:http://plugins.jquery.com/livequery/ – Marnix