标题是关于我的剧本出了什么问题的猜测:
这是在我的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
?
答案 0 :(得分:3)
你有两个问题:
您无法从jQuery.each
回调中返回数据。返回值表示是否停止迭代。来自documentation:
我们可以通过使回调函数返回false来在特定迭代中中断
$.each()
循环。返回非false与for循环中的continue语句相同;它将立即跳到下一次迭代。
您无法从Ajax回调中返回数据。 Ajax是异步,这意味着在你的情况下getLabelsNames
在之前返回,检索并处理响应。
幸运的是,autocomplete插件接受一个函数作为源。您已经在使用它,但不正确。让它接受第二个参数,这是一个回调。来自documentation:
第三种变体,即回调,提供了最大的灵活性,可用于将任何数据源连接到自动完成。回调得到两个参数:
一个请求对象,具有一个名为“term”的属性,它引用文本输入中当前的值。例如,当用户在城市字段中输入“new yo”时,自动填充术语将等于“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
混淆。
答案 1 :(得分:0)
this
取决于通话的上下文。在你的内在功能中,this
是不一样的。
根据dataObj的结构,您可能需要执行以下操作:
$.each(dataObj, function(key, value) {
alert(value.name); // value will correspond to the current item being looped over
return value.name;
})
答案 2 :(得分:0)
AJAX调用是异步的,这意味着你触发它们并且它们会稍后响应。你不能简单地从ajax调用中“返回”一个值 - 你需要在“成功”上将值传递给另一个函数。