有没有办法通过Javascript检测到document.title
/ head > title
的更改?我希望通过Google Chrome扩展程序内容脚本检测到这一点,因此我无法在目标页面的JS中实际连接代码,以便执行实际的标题更改。
我发现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 :(得分:30)
我找到了一个完全有效的解决方案,这只是对我在原帖中发布的示例的一个小修改。
// 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 :(得分:2)
您的代码示例中同时包含JQuery和Javascript。不确定你是否仅限于JavaScript,但这里是你如何使用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");
});