【问题标题】:jQuery: return false inside of a function that calls ajaxjQuery:在调用 ajax 的函数内返回 false
【发布时间】:2014-05-28 19:37:42
【问题描述】:

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

我有一个标签列表,我正在使用 ajax 使用 jQuery ui 自动完成来填充

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

开发人员声明“为了澄清,只需在回调中返回 false 即可拒绝标签。”这就是我想要实现的目标

除了以下代码之外我还尝试过:

  1. 将结果全局化到一个变量中,然后让ajax把结果放进去,只返回未定义的
  2. 使用 return false 或 event.preventDefault() + stopPropagation() 的组合
  3. 使用 ajax 调用的 done 或 complete 方法

ajax 调用返回的唯一内容是 result: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){

                });

         }
 },

【问题讨论】:

  • 您阻止默认操作为时已晚。当 done 回调发生时,事件默认动作已经发生。

标签: javascript jquery ajax tag-it


【解决方案1】:

Ajax 是异步的。 complete / done / success / 等是事件处理程序。在表示收到 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){

                });

         }

},

【讨论】:

  • 好的,我按照你所说的为什么我在这里失败了,但我不明白新方法,你可以指出我的任何好的参考或例子吗?
  • 所以,这是我的困境,我需要先调用 beforeTagAdded() 的 createTag(),如果我总是阻止/停止 beforeTagAdded(),我不会总是阻止/停止 createTag(),因为这是它的第一个电话?
【解决方案2】:

为什么不将 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 数据,可以对它进行任何操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多