diff --git a/src/definitions/modules/dropdown.js b/src/definitions/modules/dropdown.js index 79dc3c4b9..a3873612e 100644 --- a/src/definitions/modules/dropdown.js +++ b/src/definitions/modules/dropdown.js @@ -134,37 +134,48 @@ $.fn.dropdown = function(parameters) { $document .off(elementNamespace) ; - if(selectObserver) { - selectObserver.disconnect(); - } - if(menuObserver) { - menuObserver.disconnect(); - } + module.disconnect.menuObserver(); + module.disconnect.selectObserver(); }, observeChanges: function() { if('MutationObserver' in window) { - selectObserver = new MutationObserver(function(mutations) { - module.debug(' modified, recreating menu'); + module.setup.select(); + } + }, menu: { + mutation: function(mutations) { + module.debug('Menu modified, updating selector cache'); + var + mutation = mutations[0], + $addedNode = mutation.addedNodes + ? $(mutation.addedNodes[0]) + : $(false), + $removedNode = mutation.removedNodes + ? $(mutation.removedNodes[0]) + : $(false), + $changedNodes = $addedNode.add($removedNode), + isUserAddition = $changedNodes.is(selector.addition) || $changedNodes.closest(selector.addition).length > 0, + isMessage = $changedNodes.is(selector.message) || $changedNodes.closest(selector.message).length > 0 + ; + if(isUserAddition || isMessage) { + return + } + module.refresh(); + }, mousedown: function() { itemActivated = true; }, @@ -2491,10 +2527,7 @@ $.fn.dropdown = function(parameters) { return; } // temporarily disconnect observer - if(selectObserver) { - selectObserver.disconnect(); - module.verbose('Temporarily disconnecting mutation observer', escapedValue); - } + module.disconnect.selectObserver(); if( module.is.single() ) { module.verbose('Removing previous user addition'); $input.find('option.' + className.addition).remove(); @@ -2506,12 +2539,7 @@ $.fn.dropdown = function(parameters) { .appendTo($input) ; module.verbose('Adding user addition as an