0

在我的 Web 应用程序中,我为文本框定义了一个更改事件,该事件正在调用 ajax 方法并将文本框值存储到会话中。我有一个名为“test”的按钮,它将检查文本框中输入文本的验证,它从会话中获取字符串并进行验证。

<html>
<head>  
<script type="text/javascript">
$(document).ready(function(){    
    $("input", form).change(function() {
            //using ajax to store the text value to session
        });

    $("#validateAmt").click(function() {
            //using another ajax to check the value stored in session
        });
});
</script>
</head>
<body>
  <input type="text" id="amount">
  <input type="button" id="validateAmt" value="validate"/>
</body>
</html> 

但是有时发生的情况是,当我在文本框中输入内容并且没有单击外部任何地方时,如果我直接单击“测试”按钮,则按钮事件首先触发(在会话中使用旧值进行验证)和文本框更改事件触发。所以目前我想在 JavaScript 中使用布尔标志并调用第一个文本框更改事件。这种情况有什么有效或好的解决方案吗?以及这些方法将如何执行?它会并行发生还是一个接一个地发生?

4

2 回答 2

1

默认情况下,Ajax 请求是异步执行的,因此您无法保证哪个请求将在何时发送。由于change应该在之前触发click并且所有 javascript 都在单个上执行,因此您可以:

  • $.ajax使用该选项拨打电话{ async : false },但这会使您的电话阻塞

  • 您跟踪正在运行的 Ajax 查询,并在前一个 ajax 查询完成时执行剩余的 ajax 查询

这是保持异步行为的可能解决方案:

​Service=new function(){
  var onGoingAjax = null;
  var onComplete = null;

  this.change = function () {
    // Cancel previous call
    if (onGoingAjax) onGoingAjax.abort();
    // Run the new Ajax call
    onGoingAjax = $ajax( { /* options */ });
    onGoingAjax.done( function() {
      // mark the ajax call as finished
      onGoingAjax=null;
      // process the second call (if any)
      processComplete();
    });
  };

  this.click = function (){
    endFunc = function() { $ajax( { /* options */ }); };
    processComplete();
  };

  function processComplete()
  {
    // check if ajax still executing => the skip this call
    if (onGoingAjax != null) return;
    // check if a complete function is set => call it
    if (onComplete) onComplete();
    // reset the complete function
    onComplete = null;
  };
}()​;

$(document).ready(function(){
  $("input", form).change(Service.change);
  $("#validateAmt").click(Service.click); 
});
于 2012-08-07T22:42:07.687 回答
0

不要依赖更改事件总是在其他事情发生之前触发。在发送到服务器之前始终验证您的数据(并且始终在服务器上进行验证)。

如果验证成本很高(例如,它需要一个 ajax 调用),那么您可以添加一个优化来跟踪特定值是否已经过验证,但这只是性能优化,而不是您的核心逻辑的一部分。

于 2012-08-07T18:13:26.510 回答