問題描述

我有一些控件附有 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。