問題描述
我有一些控制元件附有 javascript 控制元件。
如果視窗小工具出現在視窗小工具管理頁面載入時,控制元件正常工作。
當我新增一個新的小工具時,它們無法正常工作,我得到了標記,但沒有 javascript 事件生效。
如果我儲存新的小工具,當表單重新載入時,控制元件將被正確建立,現在可以正常工作。
重新整理頁面也會解決問題,但僅適用於現有的小工具。新的小工具還有這個問題。
具體來說,我在這些點上選擇輸入選擇:
-
檔案準備好了
-
Ajaxcomplete
我已經驗證了我的程式碼是按照需要在每個事件上執行的,但結果並不如預期。
這是一個測試外掛,演示了這個問題:
https://gist.github.com/Tarendai/8466299
你會看到我有一個計數器增加與每個選擇元素,它發現它可以轉換。
筆記:
-
當小工具頁面載入時,我可以按預期在 JS 控制檯中看到計數器增加
-
當我新增一個新的小工具時,程式碼是執行的,但是,找不到可以執行的任何 select 元素,如 found.length 為 0 所示。不應該是這樣,因為每一個新的 widget 都應該有一個選擇元素
-
選擇元素有一個類來標識它們,一旦應用選擇庫來防止重複,並且現有的小工具上的 re-processing 就會被刪除。
-
在使用 selectize 之前,我使用了 Select2,它有同樣的問題
-
註釋 AJAX 程式碼,我希望新的小工具具有標準的選擇輸入。他們不。我不知道為什麼會這樣
那麼如何使選擇控制工作沒有告訴使用者在進行更改之前重新整理/單擊儲存?
最佳解決方案
好訊息,
我已經修復了
抱歉,在我的初始評論中錯過你的想法,並給出你已經實施的答案。在火車上,我會教我在手機上回答
你使用 ajaxstop 是正確的。大多數情況下,JS 的地獄工作正常,您可以看到正在初始化的 css 樣式和 DOM 中的更改。
問題在於你的選擇器。
這是因為小工具內容沒有透過 ajax 載入,實際上它從隱藏的左側列中克隆,然後觸發 ajax 呼叫以將小工具的位置儲存在右側列中。這就解釋了為什麼 ajaxstop 工作,即使想到的內容被克隆。但是,由於左側欄中有一個隱藏版本的小工具,您的 JS 正在例項化。因此,當您將其拖動到右側列時,您將收到隱藏的小工具的破碎的克隆。
因此,您需要在左側選擇一個。以下是更正的程式碼:
<script>
jQuery( document ).ready( function( $ ) {
function runSelect() {
var found = $( '#widgets-right select.testselectize' );
found.each( function( index, value ) {
$( value ).selectize();
.removeClass( 'testselectize' )
.addClass( 'run-' + window.counter );
console.log( $val );
window.counter++;
} );
}
window.counter = 1;
runSelect();
$( document ).ajaxStop( function() {
runSelect();
} );
} );
</script>
次佳解決方案
作為 @ aaron-holbrook 評論說,一個更清潔的方法將是:
<script>
$(document).on('widget-updated widget-added', function(){
// your code to run
});
</script>
只是貼上在這裡作為參考,答案更容易找到這些評論
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。