我在這裏點擊了一個磚牆。我當前項目的前一位開發人員決定使用一個巨型JS文件構建此應用程序的整個前端部分,幾乎沒有html用於頁面結構。所以基本上所有的應用程序內容和結構都是動態生成的。JQuery - 通過自定義事件上的動態元素循環
我已經學會了用這個18k +行的JS文件來生活,但我終於碰到了一塊路障。我需要找到className爲.grid_elm
的其他元素數組中的特定元素,我需要在其上觸發點擊事件。
當前HTML:
<div id="grid">
<div id="gridMask">
<div id="mCSB_1"> /*Auto-Generated by a Scrollbar Plugin*/
<div class="mCSB_conatiner"> /*Auto-Generated by a Scrollbar Plugin*/
<div class="holder">
<div class="grid_elm"></div>
<div class="grid_elm"></div>
<div class="grid_elm"></div>
<div class="grid_elm"></div>
</div>
</div>
</div>
</div>
</div>
問題:
的#grid
被刷新的新元素,每當用戶選擇從自動提示搜索框的選項。然後,我需要遍歷每個.grid_elm
元素,並根據它的子元素找到特定的元素,然後觸發該特定的點擊.grid_elm
- 但我不知道如何做到這一點,因爲沒有特定的元素來傳播事件來自。我無法將每個.grid_elm
元素訂閱到自定義事件,然後在將元素添加到#grid
時觸發自定義事件,因爲觸發器要麼發生在所有.grid_elm
元素上,要麼不會發生,因爲它可能需要更多具體觸發反對。如果我這樣做:
$("#grid").on("click",'.grid_elm",function(){
$(".grid_elm").each(function(){
console.log($(this));
})
})
我可以拿到,因爲事件是由一個特定的元素髮射元素的列表,但如果我通過每個元素的嘗試循環時,自定義事件被觸發時,我得到什麼:
$("#grid").on("custom",".grid_elm",function(){
$.each($(".grid_elm"),function(){
console.log($(this));
})
})
//"custom" Event is fired after grid refreshes with new content
$(".grid_elm").trigger("custom");
即使我同意並直接在#grid
觸發事件沒有任何參考.grid_elm
,然後通過它的孩子嘗試循環,我還是什麼也沒得到。我覺得我缺少一些關於自定義事件處理的基礎知識。
我想你可能就在這裏,因爲它看起來像我打電話來更新網格與新''的功能。grid_elm'元素可能會再次注入整個'#grid',這意味着當我訂閱頁面加載到事件時的網格元素時,新注入的'#grid'也需要以某種方式訂閱?我應該將事件偵聽器附加在DOM樹上的一個元素上嗎?甚至可能是身體?我會試試這個,讓你知道發生了什麼! –
將事件偵聽器附加到DOM樹*上方的元素*應起作用。如果這不起作用,則可能需要在注入時將事件重新訂閱到#grid元素。 –
事實證明,即使在將新元素注入到「#grid」後,我的事件訂閱仍在工作 - 但是當我的自定義事件觸發並觸發回調時,顯然這些元素尚未準備好?我通過在通過元素開始循環之前添加一個超時來解決這個問題,但是必須有更優雅的方式嗎?似乎俗氣,我已經可以看到這可能會變得不一致,因爲所有地獄 –