1

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

但即便如此,我最终还是会使用本机实现。

4

1 回答 1

0

Chrome 上的 Greasemonkey 脚本将 JS 函数注入页面

与 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);
于 2013-06-07T13:44:03.510 回答