对于这个特定问题,我使用Tag-it https://github.com/aehlke/tag-it,一个特定于使用标签的jQuery插件
我有一个标签列表我正在使用ajax来填充使用jQuery ui autocomplete
我需要做的是在ajax调用返回false时向特定函数BeforeTagAdded发出return false,实质上是说数据库拒绝了这个标记条目,不在客户端浏览器中显示标记
开发人员声明"要澄清,只需在回调中返回false以拒绝标记。"这就是我想要完成的事情
除了以下代码之外,我还尝试了什么:
ajax调用返回的唯一结果是:true或result:false 与此同时,除了下面的代码
,我还会编写一个jsfiddle beforeTagAdded: function(event, ui) {
if ( !ui.duringInitialization){ //do not fire on page initialization
$.ajax({
url: "handlers/tags.ashx",
dataType: "json",
data: {
idnumber: entity_id,
tag: ui.tagLabel,
operation:"tag"
}
}).done(function(data){
if(data.result == false){
event.preventDefault();
event.stopPropagation();
}
}).complete(function(data){
});
}
},
答案 0 :(得分:1)
Ajax是异步的。 complete
/ done
/ success
/ etc是事件处理程序。在代表收到HTTP响应的事件到来之前,他们不会被激活。
您无法从这些事件处理程序内部返回,或者从beforeTagAdded
函数修改事件,因为beforeTagAdded
将在收到HTTP响应之前完成并返回。
您需要重新考虑您的方法。这可能涉及始终取消beforeTagAdded
事件,但是从Ajax事件处理程序内部以编程方式重新启动。
beforeTagAdded: function(event, ui) {
if ( !ui.duringInitialization){ //do not fire on page initialization
event.preventDefault();
event.stopPropagation();
$.ajax({
url: "handlers/tags.ashx",
dataType: "json",
data: {
idnumber: entity_id,
tag: ui.tagLabel,
operation:"tag"
}
}).done(function(data){
if(data.result != false){
something(); // that would have happened if you hadn't called preventDefault before
}
}).complete(function(data){
});
}
},
答案 1 :(得分:0)
为什么不直接将您的AJAX与beforeTagAdded函数分开并使用beforeTagAdded作为回调?
这样的事情:
beforeTagAdded : function (event, ui, data) {
if (!ui.duringInitialization) {
// do something with the data
}
},
initAjax : function(event, ui) {
// make sure entity_id is defined
var entity_id = '';
$.ajax({
url: "handlers/tags.ashx",
dataType: "json",
data: {
idnumber: entity_id,
tag: ui.tagLabel,
operation:"tag"
}
}).complete(function (data) {
beforeTagAdded(event, ui, data);
});
}
然后,只要您致电beforeTagAdded()
,代码中的其他地方就会将其切换为initAjax()
。现在你在beforeTagAdded中有ajax数据来做你需要做的任何事情。