变量在函数中定义,但需要重新定义

时间:2012-09-06 19:28:26

标签: javascript jquery jquery-mobile

我使用的是JQuery mobile plugin并且遇到了奇怪的问题。

如果我像下面一样使用它,它就可以了。

    $("#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
        });
    });

3 个答案:

答案 0 :(得分:3)

这似乎有效: http://jsfiddle.net/9uxtT/ 它与你的情况有什么不同?

答案 1 :(得分: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);
 });​ 

答案 2 :(得分: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
        });
    }
})());