使用 GreaseMonkey 替换对象内的 javascript 函数
Replacing a javascript function inside an object using GreaseMonkey
我在寻找一种方法来替换定义为对象的 属性 的 javascript 函数时遇到了一些麻烦。我用谷歌搜索了 2 天,查看了堆栈溢出中与使用 javascript 覆盖函数相关的所有问题,但解决方案的 none 有效。
我目前有一个网页(http://gefs-online.com 如果它有帮助),并且有一个名为 "multiplayer" 的对象在某处声明如下:
var multiplayer = window.multiplayer || {};
在那之后,多人游戏下的一些属性是这样声明的:
multiplayer.nbUsers = 0;
multiplayer.users = {};
multiplayer.visibleUsers = {};
multiplayer.minUpdateDelay = 500;
multiplayer.updateTimeout = null ;
multiplayer.hearbeatTimeout;
multiplayer.hearbeatLife = 9000;
multiplayer.userLife = 10000;
multiplayer.userHalfLife = 4000;
multiplayer.mapUpdatePeriod = 10000;
multiplayer.myId = '';
multiplayer.lastRequest = null ;
multiplayer.lastRequestTime = 0;
multiplayer.localTime = new Date().getTime();
multiplayer.farVisibilityRange = 10000;
multiplayer.lowVisibilityRange = 1000;
multiplayer.nearVisibilityRange = 20;
multiplayer.chatMessage = '';
multiplayer.chatMessageId = 0;
multiplayer.on = false;
multiplayer.started = false;
multiplayer.callsignPlacemarkAltitude = 4;
multiplayer.updateFunctions = [];
multiplayer.init = function() {};
我想要重写的函数是 multiplayer.loadModel() 声明如下:
multiplayer.loadModel = function(oPlayer, oData, lod, callbackFunction) {
... //the code of the function
};
现在我想使用 GreaseMonkey 重写该函数,但没有成功。我不能使用 unsafeWindow 的常规方法 - 因为它不起作用,即使它起作用,也只有 firefox 支持它。
我已经阅读了所有与该主题相关的问题,但仍然没有找到任何内容,所以请不要给它打分。
感谢帮助过我的人
更新:我再次尝试像那样实现 unsafeWindow:
unsafeWindow.multiplayer.loadModel = function (oPlayer, oData, lod, callbackFunction) {
console.log ("loadModel()");
}
但它只说:"ReferenceError: unsafeWindow is not defined"
// ==UserScript==
// @name Multiplayer
// @version 1
// @description
// @include http://gefs-online.com/map.html*
// @grant none
// @run-at document-end
// ==/UserScript==
var interval = setInterval(function () {
if(window.multiplayer && window.multiplayer.loadModel) {
clearInterval(interval);
window.multiplayer.loadModel = function (oPlayer, oData, lod, callbackFunction) {
console.log("loadModel()");
};
console.log("multiplayer.loadModel changed to: ");
console.log(window.multiplayer.loadModel.toString());
}
}, 1000);
最终,==UserScript== 定义错误。
使用Greasemonkey(Firefox)时,应该是这样的:
// @grant none
但是使用Tampermonkey/ViolentMonkay(Chrome/Opera)时应该是这样的:
// @grant unsafeWindow
我在寻找一种方法来替换定义为对象的 属性 的 javascript 函数时遇到了一些麻烦。我用谷歌搜索了 2 天,查看了堆栈溢出中与使用 javascript 覆盖函数相关的所有问题,但解决方案的 none 有效。 我目前有一个网页(http://gefs-online.com 如果它有帮助),并且有一个名为 "multiplayer" 的对象在某处声明如下:
var multiplayer = window.multiplayer || {};
在那之后,多人游戏下的一些属性是这样声明的:
multiplayer.nbUsers = 0;
multiplayer.users = {};
multiplayer.visibleUsers = {};
multiplayer.minUpdateDelay = 500;
multiplayer.updateTimeout = null ;
multiplayer.hearbeatTimeout;
multiplayer.hearbeatLife = 9000;
multiplayer.userLife = 10000;
multiplayer.userHalfLife = 4000;
multiplayer.mapUpdatePeriod = 10000;
multiplayer.myId = '';
multiplayer.lastRequest = null ;
multiplayer.lastRequestTime = 0;
multiplayer.localTime = new Date().getTime();
multiplayer.farVisibilityRange = 10000;
multiplayer.lowVisibilityRange = 1000;
multiplayer.nearVisibilityRange = 20;
multiplayer.chatMessage = '';
multiplayer.chatMessageId = 0;
multiplayer.on = false;
multiplayer.started = false;
multiplayer.callsignPlacemarkAltitude = 4;
multiplayer.updateFunctions = [];
multiplayer.init = function() {};
我想要重写的函数是 multiplayer.loadModel() 声明如下:
multiplayer.loadModel = function(oPlayer, oData, lod, callbackFunction) {
... //the code of the function
};
现在我想使用 GreaseMonkey 重写该函数,但没有成功。我不能使用 unsafeWindow 的常规方法 - 因为它不起作用,即使它起作用,也只有 firefox 支持它。
我已经阅读了所有与该主题相关的问题,但仍然没有找到任何内容,所以请不要给它打分。
感谢帮助过我的人
更新:我再次尝试像那样实现 unsafeWindow:
unsafeWindow.multiplayer.loadModel = function (oPlayer, oData, lod, callbackFunction) {
console.log ("loadModel()");
}
但它只说:"ReferenceError: unsafeWindow is not defined"
// ==UserScript==
// @name Multiplayer
// @version 1
// @description
// @include http://gefs-online.com/map.html*
// @grant none
// @run-at document-end
// ==/UserScript==
var interval = setInterval(function () {
if(window.multiplayer && window.multiplayer.loadModel) {
clearInterval(interval);
window.multiplayer.loadModel = function (oPlayer, oData, lod, callbackFunction) {
console.log("loadModel()");
};
console.log("multiplayer.loadModel changed to: ");
console.log(window.multiplayer.loadModel.toString());
}
}, 1000);
最终,==UserScript== 定义错误。 使用Greasemonkey(Firefox)时,应该是这样的:
// @grant none
但是使用Tampermonkey/ViolentMonkay(Chrome/Opera)时应该是这样的:
// @grant unsafeWindow