Google chrome 为什么我可以从控制台更改HTMLMediaElement.prototype.play,但不能通过用户脚本?
如果我打开Chrome开发者工具控制台并更改Google chrome 为什么我可以从控制台更改HTMLMediaElement.prototype.play,但不能通过用户脚本?,google-chrome,html5-video,google-chrome-devtools,userscripts,Google Chrome,Html5 Video,Google Chrome Devtools,Userscripts,如果我打开Chrome开发者工具控制台并更改HTMLMediaElement.prototype.play,它就可以正常工作 > HTMLMediaElement.prototype.play = function(){debugger;} function (){debugger;} > HTMLMediaElement.prototype.play function (){debugger;} 但是,如果我从用户脚本更改它,该函数似乎总是还原为本机实现 > HTMLMed
HTMLMediaElement.prototype.play
,它就可以正常工作
> HTMLMediaElement.prototype.play = function(){debugger;}
function (){debugger;}
> HTMLMediaElement.prototype.play
function (){debugger;}
但是,如果我从用户脚本更改它,该函数似乎总是还原为本机实现
> HTMLMediaElement.prototype.play
function play() { [native code] }
我已经验证了用户脚本是否正确加载,我甚至尝试了一种丑陋的setInterval方法,以查看是否至少能正常工作:
var myFunction = function(){debugger;};
window.setInterval(function(){
if (window.HTMLMediaElement.prototype.play != myFunction)
window.HTMLMediaElement.prototype.play = myFunction;
}, 900);
但即使这样,我也总是以本机实现作为结束。来自:
> HTMLMediaElement.prototype.play
function play() { [native code] }
与中页面上运行的代码通信的唯一方法
Chrome是通过DOM的,所以你必须使用像插入
带有代码的标记。请注意,如果您的
脚本需要在页面上的所有内容之前运行
编辑:以下是Nice警报扩展如何做到这一点:
function main () {
// ...
window.alert = function() {/* ... */};
// ...
}
var script = document.createElement('script');
script.appendChild(document.createTextNode('('+ main +')();'));
(document.body || document.head || document.documentElement).appendChild(script);