2012-07-27 10 views
13

के माध्यम से दस्तावेज़ शीर्षक में परिवर्तन का पता लगाएं क्या जावास्क्रिप्ट के माध्यम से document.title/head > title में परिवर्तन का पता लगाने का कोई तरीका है? मैं इसे Google क्रोम एक्सटेंशन सामग्री स्क्रिप्ट के माध्यम से पहचानना चाहता हूं, इसलिए मैं वास्तव में लक्ष्य पृष्ठ के जेएस में कोड को वायरस नहीं कर सकता जहां वास्तविक शीर्षक परिवर्तन किया जाता है।जावास्क्रिप्ट

मैं WebKitMutationObserver जो सैद्धांतिक रूप से head > title में होने वाले बदलाव का पता लगाने के लिए सक्षम होना चाहिए मिल गया है, लेकिन यह सभी मामलों के लिए काम नहीं करता:

// set up an observer for the title element 
var target = document.querySelector('title'); 
var observer = new WebKitMutationObserver(function(mutations) { 
    mutations.forEach(function(mutation) { 
     console.log(mutation); 
    }); 
}); 
var config = { attributes: true, childList: true, characterData: true }; 
observer.observe(target, config); 

// this jQuery statement fires the observer as expected ... 
$('head > title').text('foo'); 

// ... but this doesn't: 
document.querySelector('title').innerText = 'cheezburger'; 

// ... and neither does this: 
document.title = 'lorem ipsum'; 

कोई भी विचार?

+0

आप जावास्क्रिप्ट का उल्लेख करते हैं, लेकिन मुझे लगता है कि आप JQuery का उपयोग कर रहे हैं। क्या आप या तो jQuery या सीधे जावास्क्रिप्ट के लिए खुले हैं? – anAgent

+0

मैंने कभी उत्परिवर्तन पर्यवेक्षकों को शरीर के भीतर परिवर्तनों पर आग लग गई है। – Utkanos

उत्तर

28

मुझे एक पूरी तरह से काम करने वाला समाधान मिला है जो मूल पोस्ट में पोस्ट किए गए उदाहरण के लिए केवल एक छोटा सा संशोधन है।

// set up an observer for the title element 
var target = document.querySelector('head > title'); 
var observer = new window.WebKitMutationObserver(function(mutations) { 
    mutations.forEach(function(mutation) { 
     console.log('new title:', mutation.target.textContent); 
    }); 
}); 
observer.observe(target, { subtree: true, characterData: true, childList: true }); 

// all three of these methods correctly fire the mutation observer 
setTimeout(function() { document.title = 'foo'; }, 1000); // the usual method 
setTimeout(function() { document.querySelector('head > title').innerText = 'bar'; }, 2000); // DOM method 
setTimeout(function() { $('head > title').text('cheezburger'); }, 3000); // jQuery-only method 

subtree: true के अलावा सभी कि यह सही काम करना आरंभ करने के लिए आवश्यक किया गया था।

अंत में setTimeout कॉल में तीन शीर्षक-बदलते तरीकों की रैपिंग केवल प्रदर्शन उद्देश्यों के लिए है; इसके बिना शीर्षक मूल्य इतनी तेज़ी से बदलता है कि WebKitMutationObserver व्यक्तिगत रूप से प्रत्येक परिवर्तन की रिपोर्ट नहीं करता है, क्योंकि उत्परिवर्ती कॉलबैक निष्पादित करने से पहले एक छोटी अवधि में परिवर्तन जमा करने के लिए MutationObserver को डिज़ाइन किया गया है।

यदि किसी को अंतिम jQuery-only विधि के माध्यम से किए गए शीर्षक परिवर्तनों की पहचान करने की आवश्यकता नहीं है, तो childList: true संपत्ति observer.observe लाइन से छोड़ी जा सकती है; पहले दो शीर्षक-बदलते तरीकों का पता लगाने के लिए केवल characterData: true की आवश्यकता है।

+1

बस एक त्वरित नोट है कि इसके लिए कोई समस्या है: http://code.google.com/p/chromium/issues/detail?id=134322 – psema4

+0

+1 केवल '$ (' head> title ') के लिए +1। ('चेज़बर्गर'); ':') –

2

आपके पास आपके कोड उदाहरण में JQuery और जावास्क्रिप्ट दोनों हैं। सुनिश्चित नहीं हैं कि यदि आपके केवल जावास्क्रिप्ट तक ही सीमित है, लेकिन इस तरीके से jQuery

साथ यह कर सकते हैं आप परिवर्तन को गति प्रदान करना चाहते हैं, पर एक नज़र है: http://api.jquery.com/trigger/

jQuery

$(document).ready(function() { 
    $("title", "head").change(function() { 
     console.log("Title has changed"); 
    }); 
    //Trigger Change 
    $("title","head").text("New Title").trigger("change"); 
}); 
+0

दुर्भाग्यवश यह केवल तभी काम करता है जब परिवर्तन आपके उदाहरण के अनुसार मैन्युअल रूप से ट्रिगर किया गया हो; यदि 'document.title = 'foobar';' इवेंट श्रोता का उपयोग नहीं किया जाता है। – joelpt

+0

सुनिश्चित नहीं है कि आपका इरादा क्या है, लेकिन इस पर एक नज़र डालें: http://stackoverflow.com/a/413455/1220302 और देखें कि क्या यह आपको भविष्य के किसी भी मुद्दे का कारण बनता है। इस पर बस एक नोट, शायद आप अपने प्रश्न को detials के साथ अद्यतन कर सकते हैं; आप दस्तावेज़ का शीर्षक क्यों बदल रहे हैं? – anAgent

+0

मैं दस्तावेज़ शीर्षक को स्वयं नहीं बदल रहा हूं, बल्कि चाहते हैं कि मेरा क्रोम एक्सटेंशन यह पता लगाने में सक्षम हो कि किसी भी दिए गए पृष्ठ का अपना शीर्षक अपडेट हो। – joelpt