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:別のjavascriptファイルのスクリプトの関数($ p0)、どうすればいいですか?

助けていただければ幸いです。

小さな更新、いくつかの良い例が提供されましたが、それらは機能していません。このスクリプトを実行する環境は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

古い投稿..しかし、これは私にとってはうまくいきます:

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 に答える