3

JQuery モバイル プラグインを使用していますが、奇妙な問題が発生しています。

以下のように使えばうまくいきます。

    $("#mainPage").on("pageshow", function(e) {

        var availableTags = ['some', 'about', 'tags'];

        $("#searchField").autocomplete({
            target: $('#suggestions'),
            source: availableTags
        });
    });

ただし、以下のように使用すると機能しません。ただしcached、関数で定義されており、ID が正しく表示されます。関数を再定義cachedすると、再び機能します。誰でも理由を説明できますか?

    var cached = $("#searchField");

    $("#mainPage").on("pageshow", function(e) {

        var availableTags = ['some', 'about', 'tags'];

        //Alert says searchField
        alert(cached.attr('id'));

        //If I uncomment below line it works.
        //cached = $("#searchField");

        cached.autocomplete({
            target: $('#suggestions'),
            source: availableTags
        });
    });
4

3 に答える 3

3

これはうまくいくようです: http://jsfiddle.net/9uxtT/ あなたの状況とどう違うのですか?

于 2012-09-06T19:53:56.507 に答える
1

$("#searchField")関数の外部で呼び出す場合は定義されません。ハンドラーが最初に呼び出されたときにキャッシュする簡単な方法は次のとおりです。

var cached;

$("#mainPage").on("pageshow", function(e) {
    // This line will only call jQuery once
    cached = cached ||  $("#searchField");

    var availableTags = ['some', 'about', 'tags'];

    alert(cached.attr('id'));

    cached.autocomplete({
        target: $('#suggestions'),
        source: availableTags
    });
});

自己呼び出し関数を使用してその変数をクロージャでラップすることにより、グローバル変数なしでそれを行う方法は次のとおりです。

$("#mainPage").on("pageshow", (function(){
    var cached;
    return function(e) {
        // This line will only call jQuery once
        cached = cached ||  $("#searchField");

        var availableTags = ['some', 'about', 'tags'];

        alert(cached.attr('id'));

        cached.autocomplete({
            target: $('#suggestions'),
            source: availableTags
        });
    }
})());
于 2012-09-06T19:45:22.420 に答える