标题是猜测我的脚本出了什么问题:
这是在我的global.js
脚本:
alert(search.getLabelsNames(); //alerts as undefined.
$('#search').autocomplete({
source: function( request ) {
search.getLabelsNames();
},
minLength:1
});
这是在我的functions.js
脚本:
var search;
window.search = {
getLabelsNames:function( search ) {
$.ajax({
url : '../db_scripts/get_labels_names.php',
type: "POST",
data: { id: search }, //this defaults to nothing. not a problem
success : function( data ) {
var dataObj = jQuery.parseJSON( data );
$.each(dataObj, function() {
alert(this.name);
return this.name;
})
}
});
}
}
在每个函数this.name
中,从数据库中正确返回每个标签名称。但是当我从globals.js
调用它时,它返回为undefined
。如果我返回数字1,search.getLabelsNames()
警报1..所以找到全局函数没有问题。
这个脚本有什么问题,为什么global.js
找不到正在返回的this.name
?
你有两个问题:
-
不能从
jQuery.each
回调返回数据。返回值指示是否停止迭代。来自文档:可以通过使回调函数返回false,在特定的迭代中中断
$.each()
循环。返回非false与for循环中的continue语句相同;它将立即跳转到下一次迭代。 -
你不能从Ajax回调返回数据。Ajax是异步的,这意味着在您的示例中,
getLabelsNames
在响应被检索和处理之前返回。
第三种变体,回调,提供了最大的灵活性,可用于将任何数据源连接到Autocomplete。回调得到两个参数:
一个请求对象,有一个名为" ter"的属性,它指的是当前文本输入中的值。例如,当用户输入"new york "在城市字段中,自动补全词将等于"new yo"。
一个响应回调,它期望一个参数包含要建议给用户的数据。应该根据提供的术语对该数据进行过滤,并且可以采用上述简单本地数据(具有标签/值/两者属性的String-Array或Object-Array)的任何格式。在提供自定义源回调以处理请求期间的错误时,这一点非常重要。即使遇到错误,也必须始终调用响应回调。这可确保小部件始终具有正确的状态。
所以你要做的就是把这个回调传递给getLabelsNames
这样它就可以在Ajax调用的success
方法中被调用了
$('#search').autocomplete({
source: function(request, callback) {
// pass the callback along
search.getLabelsNames(request.term, callback);
},
minLength:1
});
window.search = {
getLabelsNames:function(search, callback) { // accept callback as argument
$.ajax({
url : '../db_scripts/get_labels_names.php',
type: "POST",
data: { id: search }, //this defaults to nothing. not a problem
success : function( data ) {
// format the data
data = $.map(jQuery.parseJSON(data), function(obj) {
return obj.name;
});
// pass the data to the callback
callback(data);
}
});
}
}
请注意,我在这里使用jQuery.map
[docs],其中从回调返回值具有不同的含义。不要与jQuery.each
混淆
this
取决于调用的上下文。所以在你的内部函数中,this
是不一样的。
根据您的dataObj的结构,您可能希望这样做:
$.each(dataObj, function(key, value) {
alert(value.name); // value will correspond to the current item being looped over
return value.name;
})
AJAX调用是异步的,这意味着您触发它们,它们稍后响应。您不能简单地从ajax调用中"返回"一个值——您需要在"成功"时将值传递给另一个函数。