1

我有一个 MVC 应用程序,我在文本框模糊函数上调用 jquery post 方法。问题是表单有很多输入字段,并且在每个输入字段上模糊调用相同的ajax方法,如果用户在不同的文本框中快速点击进出,ajax方法调用两次,导致错误的结果。

这是一个例子

    Flight 1
    Airline     Flight #    Class         Date
S1  TextBox1    TextBox2    TextBox3      TextBox4 
S2  TextBox1    TextBox2    TextBox3      TextBox4 
S3  TextBox1    TextBox2    TextBox3      TextBox4

我厌倦的一个解决方案是在像这样调用 ajax 时禁用所有输入文件

function Submit() {
     $('input').attr("disabled", "disabled");
     $.post("/ItineraryBuilder/GetFlightData", { opportunityId: oppID}, function (data) 
     {
          $("#DivResult").html(data);
          $('input').removeAttr("disabled");
     }
}

这会禁用所有输入字段并限制用户频繁地从文本框输入输出,这反过来又不会一次又一次地调用 Ajax 发布。但是一旦输入字段被禁用,焦点也会丢失,在这种情况下很难使用 TAB。

那么有什么方法可以锁定 ajax 调用或 Controller/Action 一段时间,直到一个操作正在进行中,另一个操作不会启动,或者有其他更好的方法来做到这一点?

希望我能澄清我的观点。

4

3 回答 3

3

请改用叠加层。

我创建了一个名为 ElementOverlay 的小插件。你可以像这样使用它:

function Submit() {
     $('#yourForm').elementOverlay();

     $('input').attr("disabled", "disabled");
     $.post("/ItineraryBuilder/GetFlightData", { opportunityId: oppID}, function (data) 
     {
          $('#yourForm').elementOverlay('destroy');

          $("#DivResult").html(data);
          $('input').removeAttr("disabled");
     }
}

这只会覆盖表单,因此用户可以使用页面的其余部分。

脚本:https ://github.com/jgauffin/griffin.jquery.tools/blob/master/Source/jquery.griffin.elementoverlay.js (点击“Raw”按钮下载)

于 2012-08-20T07:15:47.733 回答
1
if($.active){ 
  //there's an ajax function running
}else{ 
  //there's no ajax function running
} 
于 2012-08-20T07:17:04.410 回答
0

如果您喜欢自己的解决方案,除了失去焦点,您可以执行以下操作。

我使用复杂的“each”函数来确定下一个输入,因为“next()”可能不起作用,因为您似乎将表单放在了表格中。顺便说一句,你错过了一个结束“);” 在你的电话后。

    $('input').on('blur', function(){
      $('input').attr('disabled', true);
      $(this).addClass('last-edited');
      var tagnext = false;
      $('input').each(function(){
          if(tagnext){
             $(this).addClass('next-focus');
             tagnext = false;
          }
          if($(this).hasClass('last-edited')){
             $(this).removeClass('last-edited');
             tagnext = true;
          }
      });
      Submit();           
    });



   function Submit(){
      $.post('/ItineraryBuilder/GetFlightData', { opportunityId: oppID}, function (data) 
      {
         $('#DivResult').html(data);
         $('.next-focus').focus();
         $('input').removeAttr('disabled');
      });
   }
于 2012-08-20T08:23:00.423 回答