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 回答
2

这是第一个版本中的时间问题,当所有 jquery 模块都已加载且 DOM 完成时,您在 pageshow 之后搜索标签“#searchField”

在第二个版本中,每当加载 javascript 时,您都在搜索标记,如果 javascript 在同一文件的标题中,有时甚至可能找不到 #searchfield。

要完成答案:需要考虑到 JQuery 选择器返回对象而不是 DOM 元素检查此代码以查看您得到两个不同的对象:

 var cached = $("#searchField");
 cached.test = 1;
 $("#p2").on("pageshow", function(e) {
     var test2 = $("#searchField");
 test2.test =2; alert(cached.test +"!="+ test2.test);
 });​ 
于 2012-09-06T19:40:15.747 回答
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 回答