1

$.mobile.changePage を拡張して、ページの読み込みが完了したときのコールバック関数の追加や、contentType などの AJAX 呼び出しのオプションを追加するなど、より多くのオプションを受け入れたいと考えています。ソースコードを変更せずにこれを行う方法はありますか? そうでない場合は、教育目的でソース コードを変更しても構いませんが、jQuery Mobile GitHub: https://github.com/jquery/jquery-mobileで見つけることができませんでした。ヘルプやガイダンスをありがとう。

4

1 に答える 1

2

JavaScript の最も興味深い部分の 1 つは、一般にモンキー パッチと呼ばれる手法を使用して任意の関数を再定義できることです。(さておき、ES5 は、開発者がそのような変更を防止できるようにする新しいフリーズメソッドを提供します。)

以下は、ソースを編集せずに関数の動作を変更できる JavaScript MonkeyPatch の例です。

// A namespace object.
var Example = {};

// Sums two values.
Example.sum = function (a, b) {
    return a + b;
}

// Usage:
var result = Example.sum(1, 2);

sum メソッドにロギングを追加したいとしconsole.logます。関数に行を追加するだけで済みますが、モンキー パッチを適用することもできます。

// Store a reference to the current 'Example.sum' function.
var originalSum = Example.sum;

// Now redeclare Example.sum...
Example.sum = function (a, b) { 

    // Call the originalSum function first...
    var result = originalSum(a, b);

    // Now add some logging...
    console.log("Example.sum(" + a + ", " + b + ") yields " + result);

    return result;
};

Example.sumが呼び出されると、以前のように結果が得られるだけでなく、コンソール メッセージも書き込まれます。$.mobile.changePageこれを念頭に置いて、同じ方法でメソッドにモンキー パッチを適用できます。

var originalChangePage = $.mobile.changePage;

// Redefine `changePage` so it accepts a 'complete' function in the options
// object which will be invoked when the page change is complete.
$.mobile.changePage = function (to, options) {
    if (typeof options.complete === "function") {
        $(body).one("pagechange", function (event) { 
            options.complete(event);
        });
    }

    originalChangePage(to, options);
};
于 2012-08-15T13:47:34.010 に答える