2016-12-25 64 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'自動地傳遞它,就像它傳遞'mutation'一樣。 – loganfsmyth

+0

JS是如何做到這一點的?我從來不知道一種編程語言會自動爲你傳遞參數。這個特殊功能在JS中有一個名字嗎? –