29

एचटीएमएल 5 ब्राउज़र के डीओएम में परिवर्तनों की निगरानी के लिए "mutation observers" की अवधारणा शामिल है।क्या jQuery चयनकर्ताओं को डीओएम उत्परिवर्तन पर्यवेक्षकों के साथ उपयोग किया जा सकता है?

आपका पर्यवेक्षक कॉलबैक डेटा पास किया जाएगा जो DOM पेड़ स्निपेट की तरह दिखता है। मुझे नहीं पता कि वे वास्तव में हैं या वे वास्तव में कैसे काम करते हैं।

लेकिन जब आप किसी तृतीय पक्ष साइट के साथ बातचीत करने के लिए कोड लिख रहे हैं जिस पर आपका कोई नियंत्रण नहीं है, तो Greasemonkey स्क्रिप्ट या Google क्रोम उपयोगकर्ता स्क्रिप्ट के साथ कहें, आपको यह जानने के लिए पास की गई तत्वों के पेड़ का निरीक्षण करना होगा कि कौन सी जानकारी है आप के लिए प्रासंगिक

यह चयनकर्ताओं के साथ बहुत आसान है, जैसे किसी भी डोम के साथ काम करना, पेड़ को मैन्युअल रूप से चलने से, खासकर क्रॉस-ब्राउज़र कोड के लिए।

क्या एचटीएमएल 5 उत्परिवर्तन पर्यवेक्षक कॉलबैक को पारित डेटा के साथ jQuery चयनकर्ताओं का उपयोग करने का कोई तरीका है?

+0

संबंधित प्रश्न: [क्या कोई jQuery डॉम परिवर्तन श्रोता है?] (Http://stackoverflow.com/questions/2844565/is-there-a-jquery-dom-change-listener), [JQuery में DOM उत्परिवर्तन ईवेंट या वेनिला जावास्क्रिप्ट] (http://stackoverflow.com/questions/7692730/dom-mutation-event-in-jquery-or-vanilla-javascript) – hippietrail

+0

यह भी देखें: [क्या मैं एक HTML स्ट्रिंग पर Jquery चयनकर्ताओं का उपयोग कर सकता हूं जो नहीं है डीओएम से जुड़ा हुआ है?] (http://stackoverflow.com/questions/4336674) – hippietrail

+1

इसके लिए ** ** प्लगइन ** है: https://github.com/kapetan/jquery-observe – vsync

उत्तर

35

हां, आप उत्परिवर्तन पर्यवेक्षक कॉलबैक पर लौटाए गए डेटा पर jQuery चयनकर्ताओं का उपयोग कर सकते हैं।

See this jsFiddle.

मान लीजिए आप तो जैसे HTML था:

<span class="myclass"> 
    <span class="myclass2">My <span class="boldly">vastly</span> improved</span> 
    text. 
</span> 


और तुम तो जैसे एक पर्यवेक्षक निर्धारित करते हैं,:

var targetNodes   = $(".myclass"); 
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver; 
var myObserver   = new MutationObserver (mutationHandler); 
var obsConfig   = { childList: true, characterData: true, attributes: true, subtree: true }; 

//--- Add a target node to the observer. Can only add one node at a time. 
targetNodes.each (function() { 
    myObserver.observe (this, obsConfig); 
}); 

function mutationHandler (mutationRecords) { 
    console.info ("mutationHandler:"); 

    mutationRecords.forEach (function (mutation) { 
     console.log (mutation.type); 

     if (typeof mutation.removedNodes == "object") { 
      var jq = $(mutation.removedNodes); 
      console.log (jq); 
      console.log (jq.is("span.myclass2")); 
      console.log (jq.find("span")); 
     } 
    }); 
} 

आप ध्यान दें हूँ कि हम पर jQuery कर सकते हैं mutation.removedNodes


आप तो सांत्वना से $(".myclass").html ("[censored!]"); चलाते हैं तो आप Chrome और Firefox से मिल जाएगा:

mutationHandler: 
childList 
jQuery(<TextNode textContent="\n ">, span.myclass2, <TextNode textContent="\n text.\n ">) 
true 
jQuery(span.boldly) 

से पता चलता है कि आप वापस आ नोड सेट पर सामान्य jQuery चयन तरीकों का उपयोग कर सकते हैं।

+1

क्या आप जानते हैं कि यह आधिकारिक तौर पर jQuery द्वारा समर्थित है, अगर यह jQuery के सभी ब्राउज़रों में काम करता है और जो उत्परिवर्तन पर्यवेक्षकों का समर्थन करता है? क्या यह हो सकता है कि यह इन ब्राउज़रों में काम करने के लिए होता है? ऐसा प्रतीत होता है कि ऐसा व्यवहार हो सकता है क्योंकि व्यवहार अलग दिखता है ... मैं निश्चित रूप से इसके साथ खेलना चाहता हूं! (-: – hippietrail

+1

मुझे नहीं लगता कि यह "आधिकारिक" समर्थन का सवाल है। 'हटाए गए नोड्स' और 'जोड़े गए नोड्स' जैसी चीजें [नोड्स की वापसी सूची] (http://dvcs.w3.org/hg/domcore/raw- फ़ाइल/टिप/अवलोकन.html # dom-mutationrecord-addednodes)। jQuery पूरे दिन ऐसी सूचियों पर काम करता है, हमेशा है ... ... कोड फ़ायरफ़ॉक्स और क्रोम पर और W3C spec पर काम करता है। इसे किसी भी ब्राउज़र पर काम करना चाहिए इस तरह की घटनाओं का समर्थन करता है। –

+1

पीएस, अद्यतन उत्तर और जोड़ा गया जेएसफ़िल्ड देखें। –

2

मैं एक स्टैक एक्सचेंज स्क्रिप्ट के लिए एक बहुत ही समान समस्या पर काम कर रहा था जिस पर मैं काम कर रहा हूं, और मुझे परिवर्तनों के लिए डीओएम की निगरानी करने में सक्षम होना चाहिए। jQuery डॉक्स कुछ भी उपयोगी नहीं था, लेकिन मैं की खोज की थी कि DOMNodeInserted घटना क्रोम में काम करता है:

document.addEventListener("DOMNodeInserted", function(event){ 
    var element = event.target; 

    if (element.tagName == 'DIV') { 
     if (element.id == 'seContainerInbox') { 
      //alert($('#seContainerInbox').parent().get(0).tagName); 
      trimStoredItems(); 
      $('#seTabInbox').click(); 
      // var newCount = getNewCount(); 
      // if there are new inbox items, store them for later 
      storeNewInboxItems(); 
      applyNewStyleToItems(); 
     } 
    } 
}); 

मैं 100% यकीन नहीं है अगर यह फ़ायरफ़ॉक्स में काम करता है के रूप में मुझे लगता है कि अब तक अभी तक नहीं मिला है विकास प्रक्रिया में। उम्मीद है की यह मदद करेगा!

+0

मैं 'WebKitMutationObserver का उपयोग कर रहा हूं() 'जो मुझे लगता है कि नया और समर्थित है और पुरानी चीजें बहिष्कृत हैं। मुझे यकीन नहीं है कि 'DOMNodeInserted' उस "पुरानी सामग्री" का हिस्सा है। 'WebKitMutationObserver' आपको एक उत्परिवर्तन ऑब्जेक्ट पास करता है, जबकि मुझे लगता है कि यह स्वयं नहीं है DOM मूल रूप से डोम संदर्भों का एक पैकेट है। मैं जानना चाहता हूं कि क्या मैं इसे jQuery या jQuery के साथ उन संदर्भों में से कुछ को लपेट सकता हूं ... – hippietrail

+0

मैंने इसे स्वयं नहीं उपयोग किया है, लेकिन जिस तरह से आप इसका वर्णन करते हैं, मुझे संदेह है कि आपको शायद रॉ डोम तत्वों तक पहुंचना होगा ताकि आप उन्हें दो पहेली से टुकड़े जैसे jQuery ऑब्जेक्ट में पास कर सकें। मुझे लगता है कि यह वास्तव में वास्तविक डेटा प्रकारों पर निर्भर करेगा। शायद देखें कि "टाइपोफ" आपको यह देखने के लिए देता है कि यह ऐसा कुछ है जिसे आसानी से लपेटा जा सकता है। उम्मीद है की यह मदद करेगा! – jmort253

+5

'DOMNodeInserted' उत्परिवर्तन पर्यवेक्षकों का हिस्सा नहीं है। यह पुरानी, ​​छोटी गाड़ी, * बहिष्कृत *, उत्परिवर्तन-घटना प्रणाली है जो उत्परिवर्तन पर्यवेक्षकों की जगह लेती है! –

7

मैं इस एक के लिए किसी भी व्यक्तिगत कोड के टुकड़े की जरूरत नहीं है, लेकिन मैं तीन संसाधन सहायता कर सकते है:

उदाहरण 3 'jQuery-उत्परिवर्तन सारांश' पुस्तकालय:

// Use document to listen to all events on the page (you might want to be more specific) 
var $observerSummaryRoot = $(document); 

// Simplest callback, just logging to the console 
function callback(summaries){ 
    console.log(summaries); 
} 

// Connect mutation-summary 
$observerSummaryRoot.mutationSummary("connect", callback, [{ all: true }]); 

// Do something to trigger mutationSummary 
$("<a />", { href: "http://joelpurra.github.com/jquery-mutation-summary"}).text("Go to the jquery-mutation-summary website").appendTo("body"); 

// Disconnect when done listening 
$observerSummaryRoot.mutationSummary("disconnect"); 
+3

हाय वीटा, स्टैक ओवरफ़्लो उत्तरों में आमतौर पर कोड उदाहरण शामिल होते हैं, न केवल किसी तृतीय पक्ष के लिए एक लिंक। क्या आप यहां अपनी पोस्ट में एक [संपादित करें] बनाकर स्टैक ओवरफ़्लो में एक उदाहरण पोस्ट कर सकते हैं? यदि लिंक कभी तोड़ना था, तो आपका जवाब बेकार होगा। उदाहरण के साथ, आने वाले वर्षों के लिए, यह अन्य भविष्य के आगंतुकों के लिए उपयोगी होगा, जो एक ही समस्या का सामना कर रहे हैं। सौभाग्य! – jmort253

+0

ज़रूर! कुछ और संसाधन भी पाए गए जो मदद कर सकते हैं। –

+0

हम्म मैंने अभी [उत्परिवर्तन सारांश] (https://code.google.com/p/mutation-summary/) के गैर-jQuery मूल संस्करण का उपयोग करने का प्रयास किया है लेकिन यह पता चलता है कि यह उन पृष्ठों के साथ अच्छी तरह से काम नहीं करता है जिनके साथ डिज़ाइन नहीं किया गया है दिमाग में उपयोगकर्ता स्क्रिप्ट। 'Id' या 'class' द्वारा संदर्भित तत्वों में परिवर्तन देखने में अच्छा है, लेकिन जब आप जिन सभी परिवर्तनों की परवाह करते हैं, वे बहुत अच्छे नहीं होते हैं, तो वे कई तत्व गहरे होते हैं या' आईडी 'और' क्लासनाम 'उत्पन्न होते हैं। – hippietrail

2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन शायद यह वैकल्पिक समाधानों की खोज करने में दूसरों की मदद कर सकता है। मैंने हाल ही में उत्परिवर्तन पर्यवेक्षकों के बारे में सीखा और jQuery के साथ उनका उपयोग करने के साथ प्रयोग करना चाहता था। मैं दो संभावित दृष्टिकोण के साथ आया और उन्हें प्लगइन में बदल दिया। कोड here उपलब्ध है।

पहले दृष्टिकोण (jquery.observeWithEvents.js) या तो एक insertNode या removeNode घटना है जो jQuery के on() समारोह के माध्यम से करने के लिए बाध्य किया जा सकता है को गति प्रदान करने jQuery के trigger() समारोह उपयोग करता है। दूसरा दृष्टिकोण (jquery.observeWithCallbacks.js) पारंपरिक कॉलबैक पैरामीटर का उपयोग करता है। उदाहरण और उपयोग के लिए कृपया README पर एक नज़र डालें।

संबंधित मुद्दे