2016-12-25 5 views
3

Как отключить мой наблюдатель мутации от его функции обратного вызова? Изменения наблюдаются по мере необходимости, но я хотел бы отключить наблюдателя после первого изменения. Поскольку переменная наблюдателя выходит за пределы области действия, она не отключается, как следует. Как передать переменную наблюдателя функции обратного вызова, чтобы код работал?Отключить наблюдатель мутации от функции обратного вызова

function mutate(mutations) { 
 
    mutations.forEach(function(mutation) { 
 
    if (mutation.type === 'characterData') { 
 
     console.log('1st change.'); 
 
     observer.disconnect(); // Should disconnect here but observer variable is not defined. 
 
    } 
 
    else if (mutation.type === 'childList') { 
 
     console.log('2nd change. This should not trigger after being disconnected.'); 
 
    } 
 
    }); 
 
} 
 

 
jQuery(document).ready(function() { 
 
    setTimeout(function() { 
 
    document.querySelector('div#mainContainer p').innerHTML = 'Some other text.'; 
 
    }, 2000); 
 

 
    setTimeout(function() { 
 
    jQuery('div#mainContainer').append('<div class="insertedDiv">New div!<//div>'); 
 
    }, 4000); 
 

 
    var targetOne = document.querySelector('div#mainContainer'); 
 
    var observer = new MutationObserver(mutate); 
 
    var config = { attributes: true, characterData: true, childList: true, subtree: true }; 
 

 
    observer.observe(targetOne, config); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<body> 
 
    <div id="mainContainer"> 
 
    <h1>Heading</h1> 
 
    <p>Paragraph.</p> 
 
    </div> 
 
</body>

ответ

4

Самый простой способ будет настроить ваш обратный вызов

function mutate(mutations) { 

в

function mutate(mutations, observer) { 

, так как экземпляр наблюдатель, связанный с мутациями автоматически передается как второй параметр t он выполняет функцию обработки мутаций.

Тогда вы можете позвонить по телефону observer.disconnect() в зависимости от того, сколько вам понадобится.

+0

Да, но тогда как бы вы передали переменную наблюдателя в качестве аргумента mutate()? Не могли бы вы разработать свой код, чтобы я не мог его проверить? Мне интересно посмотреть, как будет работать ваш код. –

+1

Вам не обязательно, 'MutationObserver' автоматически передает его, так же, как передает мутации. – loganfsmyth

+0

Каким образом JS может это сделать? Я никогда не знал языка программирования, который автоматически передает вам аргументы. Эта особенность имеет имя в JS? –

Смежные вопросы