2016-12-25 4 views
3

Wie kann ich den Mutationsbeobachter von seiner Callback-Funktion trennen? Die Änderungen werden beobachtet, wie sie sollten, aber ich möchte den Beobachter nach der ersten Änderung trennen. Da die Variable des Betrachters außerhalb des Bereichs liegt, wird sie nicht getrennt. Wie kann ich die Observer-Variable an die Callback-Funktion übergeben, damit der Code funktioniert?Trennen von Mutation Observer von der Callback-Funktion

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>

Antwort

4

Der einfachste Weg, um Ihren Rückruf

function mutate(mutations) { 

zu

function mutate(mutations, observer) { 

weil die Beobachter-Instanz mit den Mutationen assoziiert anzupassen wäre automatisch die übergeben wird zweiter Parameter zu t Die Mutationshandler-Funktion.

Dann können Sie observer.disconnect() zu jeder gewünschten Zeit aufrufen.

+0

Ja, aber wie würden Sie dann die Beobachtervariable als Argument an mutate() übergeben? Könnten Sie Ihren Code ausarbeiten, damit ich ihn nicht testen kann? Ich bin interessiert zu sehen, wie Ihr Code funktionieren würde. –

+1

Sie müssen nicht, "MutationObserver" übergibt es automatisch, genauso wie es "Mutationen" passiert. – loganfsmyth

+0

Wie ist es, dass JS das kann? Ich habe nie eine Programmiersprache gekannt, die automatisch Argumente für Sie übergibt. Hat dieses spezielle Feature einen Namen in JS? –

Verwandte Themen