2013-07-05 79 views
0

我有一個HTML頁面,其中包含許多選擇框,美化我曾用「選擇2」那些箱子,我所做的是:JavaScript中是否有任何函數來檢測文檔中的更改?

$(document).ready(function() { $("select").select2(); }); 

這使得所有的選擇框即可變換像「選擇2" 。 但是現在我正在生成按鈕單擊表(在文檔準備就緒後),因此新生成的選擇框看起來不像「select2」,請幫助我是否有任何檢測到文檔更改的功能?
喜歡的東西:

$(document).change(function() { $("select").select2(); }); 
+1

在創建表後,只需再次調用'.select2()'(在新元素上)? –

+0

@FelixKling:這不是我的場景。 ( – MHS

+0

)這個問題正是你在問什麼,對DOM做了改變(無所謂),以及如何將插件應用於新元素 –

回答

1

你可以嘗試這樣的事:不建議

function checkDocumentChange() { 
    // Run a simple task to check whether any new "selects" were added 
    var old_value = checkDocumentChange.num_selects || 0; 
    var new_value = $("select").length; 

    if (old_value != new_value) { 
    $("select:not(.already_done)").select2(); 
    } 

    checkDocumentChange.num_selects = new_value; 
    setTimeout(checkDocumentChange, 100); 
} 

DOM事件使用,因爲這些都是deprecated

當您將select插入到DOM中後,更好的方法當然就是調用.select2()。這樣你就不必把這個委託給一些檢查器或事件。

+0

有**零理由,每秒查詢DOM 10次。 –

+0

@TJ克勞德,我從來沒有真的必須自己使用它,但這個問題的其他方法要麼需要不推薦的事件,要麼擴展其他代碼的邏輯(我把它放到我更新的答案中)。 – mishik

+0

@ mishik:不,他們沒有。看到我的回答,除了「不推薦的事件或擴展其他代碼的邏輯」之外,還有兩個建議。提示:從'getElementsByTagName'獲得的'NodeList'是** live **,而jQuery匹配的集合則不是。 –

0

您可以嘗試DOMNodeInsertedIntoDocument

$(document).on('DOMNodeInsertedIntoDocument', function() { 

} 

或者mutation observer

0

使用這個號碼,或者類

在此代碼

var id = document.getelementbyid("id for select 1 or 2"); 

//here the code 
+2

我不明白這是如何回答這個問題的。 –

2

在至少some browsers(沒有任何當前版本IE,雖然),你可以通過MutationObserver來做到這一點(這是新的DOM4的東西,而不是舊的DOM3突變事件,您希望遠離它)。

但我不推薦它,只需在附加新選擇的代碼後再調用select2即可。

另一種方法是使用定時器:獲取網頁上的所有select元素的NodeList

var allSelects = document.getElementsByTagName('select'); 

...和poll檢查其長度(NodeList s爲現場,你不必須重新查詢):

var lastLength = 0; 
setInterval(function() { 
    if (allSelects.length !== lastLength) { 
     lastLength = allSelects.length; 
     // Hook up the new ones here 
    } 
}, 1000); // 1000ms = 1 second 

你可以把一個類上他們跟蹤哪個那些已經完成(如果select2已經不這樣做)。

但是,再次,你有代碼添加select元素,只是在那裏重新觸發。

相關問題