我的印象是,jQuery的on
事件處理程序是爲了能夠'偵聽'動態創建的元素,並且它應該取代live
的行爲。但是,我所經歷的是,使用on
不捕獲點擊事件,而使用live
成功!jQuery'on'沒有在動態生成的模態彈出框中註冊
我的情況的棘手方面是我不僅動態地創建內容,而且我通過AJAX .get()
調用並將結果HTML插入到模態.dialog()
jQueryUI彈出窗口中。
這裏是什麼,我試圖完成的簡化版本(包裹在$(document).ready(...)
):
$.get("getUserDataAjax.php", queryString, function(formToDisplay) {
$("#dialog").dialog({
autoOpen: true,
modal: true,
buttons...
}).html(formToDisplay);
});
$(".classThatExistsInFormToDisplay").on("click", function() {
alert("This doesn't get called");
});
從on
的文檔,我發現這裏面這是我是如何接近寫我on
事件:
$("p").on("click", function(){
alert($(this).text());
});
然而,出於某種原因,live
將作爲我期待 - 而on
失敗我。
這不是一個問題:「我怎樣才能使它發揮作用」,因爲我發現,on
會成功(捕獲點擊)我若內的function(formToDisplay)
回調。
我的問題是:on
有什麼問題,它不是在模態彈出窗口中找到我的動態創建的元素?我的jQuery實例是jquery-1.7.2。 jQueryUI是1.8.21。
這裏有兩個jsFiddles近似的問題。在兩個實例中單擊「測試」一詞以查看不同的行爲。代碼的唯一區別是替換on
的live
。
其中the click被live
捕獲。
其中the click未被on
捕獲(點擊'測試 - 點擊我'看不到任何事情發生)。
我意識到我可能只是使用on
不適當或要求它做一些事情,並沒有打算,但我想知道爲什麼它不工作(但如果你有一些非常聰明的,隨時分享)。感謝您的智慧!
更新/答案/解決方案:
根據用戶「未定義」,不同的是,on
不是從document
對象,而live
確實頂部委派一路/是。
作爲克勞迪奧提到,有引用動態創建的元素的on
文檔的部分,並且您在在運行時所需存在的查詢的$("")
部分什麼。
這裏是我的新解決方案:捕獲點擊事件on
我的模態對話框,雖然它沒有任何內容,當事件在運行時創建時,將能夠找到我的內容和元素與生成的特殊類後來。
$("#dialog").on("click", ".classThatExistsInFormToDisplay", function() {
... //(success! Event captured)
});
非常感謝!
迷人!我發現你的建議成功了。多麼壯麗!我將'on'事件附加到Modal對話框,然後將點擊次數限制在我想要真正關注的課程中。雖然這會比捕獲我的課程更多的觸發因素(假設),但這似乎是一個很好的解決方案。感謝您的回答! – veeTrain
@veeTrain不客氣。 – undefined
你是救命恩人,先生!謝謝。 – Agent007