Несколько лет спустя, теперь официально существует лучшее решение. Наблюдатели мутации DOM4 являются заменой устаревших событий мутации DOM3. Они в настоящее время реализованы в современных браузерах как MutationObserver
(или как префикс WebKitMutationObserver
в старых версиях Chrome):
MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var observer = new MutationObserver(function(mutations, observer) {
// fired when a mutation occurs
console.log(mutations, observer);
// ...
});
// define what element should be observed by the observer
// and what types of mutations trigger the callback
observer.observe(document, {
subtree: true,
attributes: true
//...
});
В этом примере прослушиваются изменения DOM при document
и всего его поддерева, и оно будет запускать изменения атрибутов элемента, а также структурные изменения. Черновик спецификации имеет полный список допустимых свойств прослушивателя мутаций :
childList
- Устанавливается в
true
, если следует наблюдать мутации у детей-мишеней.атрибутов
- Установите на
true
, если должны наблюдаться мутации в атрибутах цели.CharacterData
- Установите на
true
, если должны наблюдаться мутации в данных цели.поддерево
- Установите на
true
, если нужно наблюдать мутации не только цели, но и потомков цели.attributeOldValue
- Устанавливается в
true
, если дляattributes
установлено значение true и значение атрибута цели перед записью мутации.characterDataOldValue
- Устанавливается в
true
, если дляcharacterData
установлено значение true и данные цели перед записью мутации.attributeFilter
- Устанавливается в список локальных имен атрибутов (без пространства имен), если необходимо наблюдать не все мутации атрибутов.
(Этот список действителен по состоянию на апрель 2014 года; вы можете проверить спецификации на наличие изменений.)
Последний selectedIndex вне допустимого диапазона, так как вы используете предварительное увеличение. Это означает, что перед тестом i становится dp1.length, и ему также присваивается selectedIndex. Это могло бы объяснить странное поведение. Возможно, вы захотите использовать пост-инкремент.
Также. Единственное, что выполняется в этом while, похоже,
cmb.selectedIndex = ++i;
Я не знаю, что вы хотели, но вам может понадобиться там "{}".