代码之家  ›  专栏  ›  技术社区  ›  James

JQuery AJAX事件问题

  •  0
  • James  · 技术社区  · 14 年前

    我在修复现有ASP.NET MVC网站中的错误时遇到问题。

    其中一个视图有一系列文本框,用户可以在其中输入数据。每个文本框都有一些附加到blur事件的javascript,以便在更改文本时发回服务器。更具体地说,代码使用JQuery$.ajax方法进行这些调用。这是为了将临时数据保存到会话中。

    我知道目前的设计不是很好,但我正在寻找最简单的解决方案。是否有可能将这两个事件排队,或者有其他解决方案?谢谢。

    3 回复  |  直到 14 年前
        1
  •  0
  •   mikefrey    14 年前

    当blur事件触发时,可以使用 setTimeout ,则当 激发,检查变量以查看是否首先单击了“保存”按钮:

    var isSaved = false;
    function onblur(ev) {
        setTimeout(function(){
            if (!isSaved) {
                // make ajax call
            }
        }, 200);
    }
    
    function onsave(ev) {
        isSaved = true;
        // make ajax call
    }
    
        2
  •  1
  •   Greg    14 年前

    您可以只使用实际队列,而不使用保持轮询的计时器。如果有人只是在字段间切换,这将确保每个ajax调用都以正确的顺序执行,而不是在正确的时刻触发计时器。

    var queue = new Array(0);
    $(function() { 
      $('#inputID').blur(function() { AjaxQueue(this); });
    });
    
    function AjaxQueue(element) { 
      var length = queue.push(element);
      if (length == 1) {
        ExecuteNextQueueItem();
      }
    }
    
    function ExecuteNextQueueItem() {
      var queueElement = queue.shift();
      if (queueElement != null) {
        // ajax call with queueElement
      }
    }
    

    然后在结果回调函数结束时,只需调用 ExecuteNextQueueItem();

        3
  •  0
  •   Aidas Bendoraitis Rob Sanderson    14 年前

    如果某个状态变量尚未设置为true,则可以在超时后将ajax调用onblur设置为true,并且可以在提交表单时将该状态变量设置为true。像这样的:

    $(document).ready(function() {
        var form_processed = false;
        $('input:text').blur(function() {
            var $el = $(this);
            setTimeout(function() {
                if (!form_processed) {
                    // do ajax call with $el ...
                }
            }, 500);
        })
        $('form').submit(function() {
            form_processed = true;
            // submit form via ajax ...
            return false;
        });
    });
    

    (此代码未经测试,但希望可以工作)