通过Chrome中的Userscript替换页面函数?
-
30-09-2019 - |
题
我已经创建了一个替换页面函数的GreaseMonKey脚本:
(function() {
var oldFunc = func;
func = function() {
oldFunc();
// other stuff
};
)();
我一直打算在Gresemonkey和Chrome中使用此脚本,并读到Chrome不支持 unsafeWindow
, ,因此,通过将函数转换为字符串并使用 setTimeout
:
setTimeout("(function(){var old=func;func=function(){old();/*other stuff*/}}())", 0);
这在Greasemonkey中很好地效果很好,但是在Chrome中绝对没有给我。显然不是发射,但也没有出现日志。我还尝试了许多其他注射样式,但无法实现任何工作。 (对于测试,我还添加了 alert()
到功能的顶部。)
setTimeout(..., 0)
- 没有- 在范围内运行该函数,没有注入页面 - 没有警报,但是在控制台中“未定义func”
document.href = "javascript:..."
- 没有document.body.addEventListener("load", ...)
- 没有
所有这些都与 @run-at document-end
.
不幸的是,这是我的第一个Chrome Usercript,即使经过一个小时左右的谷歌搜索和戳戳之后,我也很茫然。有帮助吗?
实际脚本,目前在GreasemonKey工作: http://pastebin.com/htlvjyhg
解决方案
最后,我发现在Chrome中工作的唯一技术是创建一个 <script>
使用DOM方法的节点。幸运的是,这似乎在Firefox和Opera中同样奏效,并且使其无痛 <func>.toString()
:
function embed() {
var oldFunc = window.func;
window.func = function() {
oldFunc();
// other stuff
};
}
var inject = document.createElement("script");
inject.setAttribute("type", "text/javascript");
inject.appendChild(document.createTextNode("(" + embed + ")()"));
document.body.appendChild(inject);
不隶属于 StackOverflow