我使用的网站是用一些强大的javascript编写的。几乎没有任何全局,闭包,它使用严格的模式。这使我很难将自己的功能注入网站。
网站客户端对象在jQuery.ready()
调用中初始化:
$(window).ready(function () {
var a, b, c, d;
// Setup global data [...]
// Setup configuration [...]
a = GlobalFoo.ConstructorA();
b = GlobalFoo.ConstructorB(a);
// Really wish I could put stuff here
c = GlobalFoo.ConstructorC(a, b);
d = GlobalFoo.ConstructorD(b, c);
// etc.
});
例如,在调用其他构造函数之前,我如何用自己的代码替换b.someMethod()
?
我可以阻止就绪事件发生或用我自己的代码替换吗?由于它非常小,我可以在我的代码中复制修改后的版本。
答案 0 :(得分:2)
经过多次搜索后,我发现了dindog this wonderful page。 GreaseSpot wiki上还有this page描述@run-at
。
@run-at
允许您的用户脚本在所有其他代码之前运行。 beforescriptexecute
事件允许您在执行前检查每个脚本。然后,您可以跳过或修改它。
我的最终解决方案是:
// ==UserScript==
// @name ...
// @description ...
// @namespace ...
// @include ...
// @version 1
// @run-at document-start
// @grant none
// ==/UserScript==
(function (w) {
// Remove the current jQuery ready code
function pre_script_execute_handler (e) {
var target = e.target;
if (target.innerHTML.indexOf("$(window).ready(") != -1) {
console.log('Removed ready');
e.preventDefault();
e.stopPropagation();
addReady();
}
}
w.addEventListener('beforescriptexecute', pre_script_execute_handler);
// Add new jQuery ready code
function addReady () {
console.log('Adding new ready');
w.$(window).ready(function () {
console.log('Our ready called');
});
}
}) (unsafeWindow);