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

时间:2013-06-07 13:33:41

标签: google-chrome html5-video google-chrome-devtools userscripts

如果我打开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);

但即便如此,我总是以本机实现结束。

1 个答案:

答案 0 :(得分:0)

来自Injecting JS functions into the page from a Greasemonkey script on Chrome

  

与页面上运行的代码进行通信的唯一方法   Chrome是通过DOM进行的,所以你必须使用像插入这样的黑客   包含代码的标记。请注意,如果你的话,这可能是错误的   脚本需要在页面上的其他所有内容之前运行。

     

编辑:以下是Nice Alert扩展程序如何执行此操作:

function main () {
  // ...
  window.alert = function() {/* ... */};
  // ...
}

var script = document.createElement('script');
script.appendChild(document.createTextNode('('+ main +')();'));
(document.body || document.head || document.documentElement).appendChild(script);