jQuery:在调用ajax的函数内返回false

时间:2014-05-28 19:37:42

标签: javascript jquery ajax tag-it

对于这个特定问题,我使用Tag-it https://github.com/aehlke/tag-it,一个特定于使用标签的jQuery插件

我有一个标签列表我正在使用ajax来填充使用jQuery ui autocomplete

我需要做的是在ajax调用返回false时向特定函数BeforeTagAdded发出return false,实质上是说数据库拒绝了这个标记条目,不在客户端浏览器中显示标记

开发人员声明"要澄清,只需在回调中返回false以拒绝标记。"这就是我想要完成的事情

除了以下代码之外,我还尝试了什么:

  1. 将结果全局化为变量,然后让ajax将结果放入,只返回undefined
  2. 使用return false和/或event.preventDefault()+ stopPropagation()的组合
  3. 使用ajax调用的完成或完整方法
  4. 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){
    
                    });
    
             }
     },
    

2 个答案:

答案 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数据来做你需要做的任何事情。