2011-07-21 23 views
21

我有我使用的是jQuery插件:jQuery:如何在尚未添加到DOM的元素上調用jQuery插件函數?

$.get('ajax.html', function(data){ 
    $('#container').html(data); 
}); 

我可以再次調用該插件的功能是這樣的::

$.get('ajax.html', function(data){ 
    $('#container').html(data).find('.elements').fancyPlugin(); 
}); 

$(document).ready(function(){ 
    $('.elements').fancyPlugin(); 
}); 

,直到我開始添加新的元素這個偉大的工程

...除了AJAX發生在另一個不應該知道關於fancyPlugin()的jQuery插件中。

如何將此插件應用於所有當前和未來的元素?

+0

好的好吧好吧我知道這個...... hrmmmm ...好吧也許不是完全的,但你應該使用事件監聽器。我將在文檔上綁定DOMNodeInserted,然後調用你的函數。 –

回答

15

我認爲這將在所有的瀏覽器IE除外。

document.body.addEventListener("DOMNodeInserted", function(event){ 
    var $elementJustAdded = $(event.target); 
    if ($elementJustAdded.hasClass('elements')) { 
     $elementJustAdded.fancyPlugin(); 
    } 
}, false); 
+1

正是我所期待的。謝謝! – Andrew

+0

整潔。感謝分享,@PaulPRO。 – spliter

+2

有沒有什麼可以在IE中使用? –

0

讓您的AJAX處理程序觸發某個自定義事件,如contentAdded,並將fancyPlugin綁定到該事件。

或者,您可以使用DOM mutation events來調用fancyPlugin以查看容器中的任何更改。本機瀏覽器支持還沒有完成,但有plugins這應該照顧。

+0

我希望你能展示**如何**使用DOM突變事件! –

+0

自那時以來,突變事件已經由[Mutation Observer](http://www.w3.org/TR/dom/#mutation-observers)取代,它[體面支持](http://caniuse.com/#搜索=突變)。 MDN有[代碼示例](https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver#Example_usage)。 – Tgr

2

如果與AJAX添加這些元素,你可以使用.ajaxSuccess()方法:

$('#container').ajaxSuccess(function(result) { 
    $('.elements').fancyPlugin(); 
}); 

而且這裏有一個live demo

+0

注意:「從jQuery 1.8開始,應該只將.ajaxSuccess()方法附加到文檔中。」 http://api.jquery.com/ajaxsuccess/ – jacekll

-1

你看過jQuery .live事件處理程序嗎?當新項目被添加到dom時,它會自動綁定,只要它符合指定的要求。

http://api.jquery.com/live/

+1

正如你所看到的,'load'事件並沒有在jQuery的實時函數中實現:http://stackoverflow.com/questions/3196404/jquery-live-with-the -ready-or-load-event – Milimetric

-1

,如果你做這樣的事是什麼?

$(document).ready(function(){ 
    $('.elements').live('load', function() { 
     $(this).fancyPlugin(); 
    }) 
}); 

的事件後不Ajax調用或它們返回的內容中重新綁定。現在和將來live()附加一個處理程序事件「

+1

正如你所看到的,'load'事件並沒有在jQuery的實時函數中實現:http://stackoverflow.com/questions/3196404/jquery-live-with-the-ready-or -load-event – Milimetric

0

從本質上講,你想是這樣有趣:

$('selector').ready(... do something ...); 

問題是那種邏輯不可用在頁面加載的元素不會觸發任何我知道的特定事件,他們只是繼承CSS上面的DOM節點。只是,從$.get成功函數n,觸發自定義事件。其餘的代碼可以掛鉤到該事件中,以執行可能需要的任何插件重新加載工作。你可以通過相關的選擇列表與事件,並用它來調用相應的插件(你可以保持一組selector -> plugin refresh function關係在哈希表)

11

這樣做的另一種方法是創建自己的事件:

var container=$('#container'); 
$.get('ajax.html', function(data){ 
    container.html(data); 
    $('.elements',container).trigger('added.yourns');  
}); 

container.on('added.yourns','.elements',function(){ 
    $(this).fancyPlugin(); 
}); 

然後,添加ellements時,只需使用trigger方法觸發事件!

var aDiv=$('div'); 
aDiv.appendTo(someNode); 
aDiv.trigger('added.yourns'); 

這樣做可以讓您在任何javascript文件中附加任何行爲!

+0

男人,從我所有的心裏,謝謝你謝謝你謝謝:) – Lamis

+0

你回答了我的一個問題,幾個月後我的腦海裏陷入了...今天,我只是需要這個。你讓一個人開心,歡呼:))))))))))))))))) – Lamis

+0

這很棒,幫助解決了我正在構建的東西。謝謝! –

相關問題