我使用的是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
});
});
答案 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
});
}
})());