使用 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