【发布时间】:2018-05-19 12:42:18
【问题描述】:
我正在编写一个 Chrome 扩展程序,它需要防止网页触发 document visibilitychange 事件。至少我需要能够覆盖 document.visibilityState(即使它是只读属性)。如果不可能,因为这个扩展仅用于我的目的,不会出现在 Chrome 扩展商店中,有没有办法可以配置我的 Chrome 浏览器来实现我想要的?我只需要在 Chrome 的“开发者模式”开启时使用此扩展程序,其他时间都不需要。
我希望有人能想出一种创造性的方式来实现这一目标。谢谢。
请注意! 4年前的答案中有一个解决方案不再在较新版本的Chrome中生效: Spoof or disable the Page Visibility API
自己测试一下:
// This codes worked 4 years ago but not anymore
var c='(function(){var a=Node.prototype.addEventListener;Node.prototype.addEventListener=function(e){if(e=="visibilitychange"||e=="webkitvisibilitychange"){}else a.apply(this,arguments)}})()'
, E=document.documentElement;
E.setAttribute('onreset', c);
E.dispatchEvent(new CustomEvent('reset'));
E.removeAttribute('onreset');
// THIS WILL STILL LOG THE STATES EVEN WITH THE ABOVE CODE RUNNING
document.addEventListener("visibilitychange", function() {
console.log( document.visibilityState );
});
如果在 Chrome 中无法实现,是否有 Firefox/Safari/Opera 浏览器代码可以实现这一点?
【问题讨论】:
-
没有测试,但代码应该使用
EventTarget.prototype,而不是Node。 -
此外,该页面可能禁止内联代码,因此我会尝试将
c文本插入到由 Chrome 扩展程序的内容脚本添加时从页面 CSP 中排除的script元素中。 -
我尝试用 EventTarget.prototype 替换 Node.prototype,但仍然没有成功。该代码位于一个单独的文件中,尽管名为 dont.js,我通过在其中抛出一个 alert() 来确保它正在运行,并且我确认它正在运行。
标签: javascript jquery html google-chrome google-chrome-extension