Google chrome 为什么我可以从控制台更改HTMLMediaElement.prototype.play,但不能通过用户脚本?

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

如果我打开Chrome开发者工具控制台并更改
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);