javascript - 通过 Javascript 检测文档标题的变化

标签 javascript jquery google-chrome-extension webkit

<分区>

有什么方法可以通过 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';

有什么想法吗?

最佳答案

我找到了一个完全有效的解决方案,它只是对我在原始帖子中发布的示例的一个小修改。

// 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 方法所做的标题更改,则可以从 observer.observe 行中省略 childList: true 属性;只需要 characterData: true 来检测前两个标题更改方法。

关于javascript - 通过 Javascript 检测文档标题的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11693618/

相关文章:

javascript - 从嵌套私有(private)函数中设置全局变量

jquery - 在垂直菜单中,如果我将鼠标悬停在每个菜单上,则应使用 Bootstrap Material 设计显示三列子菜单

javascript - Opera vs Firefox 关注输入问题

javascript - 浏览网站时,页面未更新 Chrome 开发工具中的网址或源代码

javascript - 尝试在 chrome 扩展程序(JavaScript)中从 default_script 到 content_script 的通信不起作用

javascript - 使用 javascript 检测安装或未安装的 chrome 扩展时出错

javascript - 如何使用 javascript 和 asp.net 在不选择下拉列表值的情况下显示验证

javascript - 如果以字符开头,正则表达式不匹配?

javascript - 传播语法返回意外的对象

javascript - Ajax Laravel 返回 View 500 错误