【问题标题】:jquery - problem with synchronize ajax and dialogbox in functionjquery - 函数中同步ajax和对话框的问题
【发布时间】:2010-08-31 04:50:50
【问题描述】:

我在将使用 AJAX 获得的函数结果与该函数同步时遇到问题。 这个想法是我发送 AJAX 请求,然后在收到答案后打开对话框,并在用户确认函数返回正确的值后。问题是我的函数(即使我将 ajax 请求设置为不异步)在捕获用户操作之前不会等待响应并返回值。 这是一个代码:

checkColisions = function(event) {
        var parsedStart = Date.parse(event.start);
        var parsedEnd = Date.parse(event.end);
        var returnValue = true;

        returnValue = $.ajax({
          async: false,
          url: '<?php echo url_for('lecture/ajaxCheckColisions')?>',
          data: ({id: event.eid, name:event.title, start: parsedStart, end: parsedEnd}),
          success: function(data) {
              if(data == 'no-colisions')
              {
                  returnValue = false; //do nothing
              }
              else
              {
                  $("#dialog-colisions").dialog({
                        resizable: false,
                        open: function() {
                            $('#dialog-colisions').text()
                            $('#dialog-colisions').append('<p>Found colisions:</p>');
                            $('#dialog-colisions').append(data);
                        },
                        height:300,
                        modal: true,
                        buttons: {
                            'Continue': function(){                                    
                                $(this).dialog('close');
                                returnValue = false;
                            },
                            'Cancel': function() {
                                $(this).dialog('close');
                                returnValue = true;
                            }
                        }

                  });
              }
          },
          error: function(data) {
          alert('error' +data);
          }
        });
        return returnValue;
    };

enter code here

returnValue 应该由对话框设置,但不是。 你有什么想法吗?

【问题讨论】:

    标签: jquery ajax jquery-ui jquery-ui-dialog


    【解决方案1】:

    您不应尝试在浏览器中“阻止”线程。更好的解决方案是打开对话框并从 jquery 提供给您的回调中触发适当的操作。

    你现在有类似的东西

    var returnValue= checkColisions(e);//go to server and open a popup
    if(returnValue==true){
     doCollistionStuff(); 
    }else{
     noCollitionDetected();
    }
    

    我的建议是将对话框更改为:

    $("#dialog-colisions").dialog({
                            resizable: false,
                            open: function() {
                                $('#dialog-colisions').text()
                                $('#dialog-colisions').append('<p>Found colisions:</p>');
                                $('#dialog-colisions').append(data);
                            },
                            height:300,
                            modal: true,
                            buttons: {
                                'Continue': function(){                                    
                                   doCollistionStuff();
                                },
                                'Cancel': function() {
                                   noCollitionDetected();
                                }
                            }
    
                      });
    

    【讨论】:

    • 感谢您的建议,但在我的情况下,我似乎必须像在您的第一个代码中那样使用它,因为这个主函数(checkColisions)由 FullCalendar 的几个不同函数调用(比如drop、eventDrop 和 eventClick),它们中的每一个都会产生其他的碰撞。
    • 我的意思是函数 checkColisions 用于代码的几个不同部分,并且每个部分在得到结果后都会做不同的事情。因此,据此,不可能在例如继续按钮功能中采取行动,因为它的主体取决于称为 checkCollisions 功能的代码部分。返回值似乎很好 - 就像现在一样,并允许这部分代码决定如何处理结果,就像你的一样: var returnValue= checkColisions(e); if(returnValue==true){ doCollistionStuff(); }else{ noColitionDetected(); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    相关资源
    最近更新 更多