2011-01-24 73 views

回答

5

如果你想要做一些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

+0

謝謝,它爲我工作。 –

+0

livequery不存在 – w35l3y

+1

@ w35l3y我認爲這是現在的鏈接:http://plugins.jquery.com/livequery/ – Marnix

-4

試試這個...

if($('.column-header')){ 
//do something... 
} 

,或者你也可以這樣做this..it將更加通用

jQuery.exists = function(selector) { return ($(selector).length > 0); } 

if ($(selector).exists()) { 
    // Do something 
} 
+0

問題依然存在,何時發表該聲明? – jAndy

+0

是的,就是這樣的事情。我不想一次又一次地開槍。 –

1

你應該看看jQuery Mutation Events。我相信這是你正在尋找的。

+0

按照指向http://www.adaptavist.com/display/jQuery/Mutation+Events的鏈接解釋它更多 – MattSmith

+0

謝謝,看一看 –

21
$(document).bind('DOMNodeInserted', function(e) { 
    console.log(e.target, ' was inserted'); 
}); 

DOMNodeInserted是DOM級別3事件。這反過來意味着,你需要一個相當新的瀏覽器來支持這種事件。

參考:MDC

+0

嗯......這看起來很有趣。 –

+2

這是IMO未來發展的最佳選擇。但應該指出,IE8和更低版本不支持這種功能。我在下面添加了一個答案,如果有人想要做一個快速和骯髒的方式來做這樣的工作在IE8和更低,不想使用livequery出於某種原因。 –

+2

截至2016年[突變事件](https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Mutation_events)已被棄用。建議不要在舊項目或新項目中使用這種技術。皮蒂。 –

0

,如果你想設置相同功能的所有類的元素column-header 然後你可以使用jQuery的生活()

$(".column-header").live("click",function(){}); 
+0

是的,但它的問題是,它只會在觸發點擊而不是呈現。 –

0

如何使用投票 - 繼續尋找具有類元素「列標題「,直到找到它,然後執行操作。看起來很簡單。

+0

是的,這將工作,但會有UI經驗滯後。希望避免這一點。 –

+0

我認爲這取決於你的dom結構在頁面上有多深和多寬。我不認爲使用一些jQuery插件你會獲得更快的性能 - 應該在特定的例子上進行測試。 – bogatyrjov

+0

是的,我試圖livequery。有一個滯後。 –

3

我會使用setInterval重複檢查元素。例如。

var curLength=0; 
setInterval(function(){ 
    if ($('.column-header').length!=curLength){ 
    curLength=$('.column-header').length; 
    // do stuff here 
    } 
},100); 

此代碼將檢查是否有任何新的.colum-header元素,每100毫秒

+0

這將工作。但不是很重嗎? –

+2

這將是相當沉重的,但沒有本地支持NodeAdded事件。這是一樣好。無論如何,實時查詢突變事件肯定會使用某種setInterval循環。 – Ivan

+0

根本不會太重,請將Interval設置爲變量並將其清除。 –

2

我認爲上面提到的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的返回值,以便您可以阻止它,或者你需要做的任何事情。但它應該完成工作。

7

接受的答案從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的特定元素。

相關問題