1

我有点卡在一个我无法解决的问题上,我在互联网和这个网站上进行了调查,但我找不到我的问题的答案。

所以基本上我有一个无法修改的 javascript 文件,所以我有另一个 javascript 文件,它应该在调用该方法时捕获并覆盖它。

通常我知道它是如何工作的,并且我已经完成了函数覆盖,但我不知道如何解决这个问题。

我有一个非常大的脚本,但我只展示其中的一小部分:

Microsoft.Office.Server.Ajax.NavResizer.prototype = {
    $6: null,
    $7: null,
......
$20:function ($p0) {
    if (this.$1E) {
        $p0.preventDefault();
    } 
},
$21: function ($p0) {
    var $0 = $p0.target;
    this.$1F = ($0 === this.$A);
    if (this.$1F || $0 === this.$B) {
        this.$1E = $0;
        this.$18 = $p0.clientX;
        this.$19 = $p0.clientY;
        Sys.UI.DomEvent.removeHandler(this.$1E, 'mousedown', this.$12);
        var $1 = document.body; Sys.UI.DomEvent.addHandler($1, 'mouseup', this.$13);
        Sys.UI.DomEvent.addHandler($1, 'mousemove', this.$14);
        $1.style.cursor = (this.$1F) ? 'e-resize' : 'n-resize';
        this.$1A = this.get_$42();
        this.$1B = this.get_$43();
        $1.focus();
        Sys.UI.DomEvent.addHandler($1, 'selectstart', this.$15);
        $p0.preventDefault();
    } 
},
$22: function ($p0) {
    this.$34($p0);
    var $0 = document.body;
    Sys.UI.DomEvent.removeHandler($0, 'mouseup', this.$13);
    Sys.UI.DomEvent.removeHandler($0, 'mousemove', this.$14);
    Sys.UI.DomEvent.addHandler($0, 'selectstart', this.$15); 
    $0.style.cursor = 'default';
    Sys.UI.DomEvent.addHandler(this.$1E, 'mousedown', this.$12);
    this.$1E = null;
},
$23: function ($p0) {
    this.$34($p0);
},
$24: function ($p0) {
    this.$26();
},
....

基本上这是脚本的一部分:所以假设我想覆盖函数:$22: function ($p0) in the script in another javascript file,我该怎么做?

我将不胜感激任何帮助。

一个小的更新,提供了一些很好的例子,但它们不起作用。我运行这个 sript 的环境是 SharePoint,通常当我重写时,我使用了这个方法:

var oldFixRibbonAndWorkspaceDimensions = window.FixRibbonAndWorkspaceDimensions;
window.FixRibbonAndWorkspaceDimensions = function () {
    this.MyFixRibbonAndWorkspaceDimensions();
};

function MyFixRibbonAndWorkspaceDimensions(){...}

当我加载脚本时也没关系,因为这个函数只在默认函数被调用时才被调用,而不是之前而不是之后。就在同一时间。但是对于此处提供的示例,该函数正在尝试在 document.ready() 上执行

4

4 回答 4

2

你想永久覆盖它吗?只需这样做:

Microsoft.Office.Server.Ajax.NavResizer.prototype.$22 = function($p0) {
    // your code.
};

只要在定义原始脚本后执行您的脚本,就可以了。

于 2012-10-12T13:01:29.840 回答
2

Old post.. but this works for me:

ExecuteOrDelayUntilScriptLoaded(overrideNavResizer, "NavResizer.js");

function overrideNavResizer(){

    Microsoft.Office.Server.Ajax.NavResizer.prototype.$22 = function($p0) {
    // your code.
};
}
于 2013-07-24T02:06:11.870 回答
1

在您的新脚本中:

Microsoft.Office.Server.Ajax.NavResizer.prototype.$22 = function () {//your function code}
于 2012-10-12T13:03:10.373 回答
1

假设您可以访问原型对象(它在全局范围内)并且您的脚本在它之后运行,这很容易:

var proto = Microsoft.Office.Server.Ajax.NavResizer.prototype,
    oldMethod = proto.$22;
proto.$22 = function newMethod(args, …){
    …
};
于 2012-10-12T13:03:54.213 回答