【问题标题】:How to disable drag and drop and browse events while an ajax request is in process?如何在 ajax 请求正在进行时禁用拖放和浏览事件?
【发布时间】:2014-08-09 15:04:07
【问题描述】:

我想阻止用户在上一个 ajax 请求正在进行时停止选择或拖放。

我该怎么做...

这里是代码js代码:

#drag为拖放区的div id

$( '#drag ' ).bind( 'dragover',function(event) {
  event.stopPropagation();  
  event.preventDefault();   
 });

$( '#drag ' ).bind( 'drop',function(event) {
     event.stopPropagation();   
     event.preventDefault();
     if( upfiles == 0 )
     {
         upfiles = event.originalEvent.dataTransfer.files;
         console.dir(upfiles);
         upfiles = Array.prototype.slice.call(upfiles, 0);
      }
      else {
      if(confirm( "Drop: Do you want to clear files selected already?" ) == true) {
          upfiles = event.originalEvent.dataTransfer.files;
          upfiles = Array.prototype.slice.call(upfiles, 0);
          $('#fileToUpload').val('');
      }
      else
          return;
      }
      $( "#fileToUpload" ).trigger( 'change' );
        });

点击上传按钮后:

$("#upload_btn").click( function() {
 if ( upfiles ) {
 $( '#fileToUpload' ).trigger('upload'); // trigger the first 'upload' - custom event.
  $(this).prop("disabled", true);
  }
});

这里是 ajax 请求:

$( '#container' ).on( 'upload', '#fileToUpload' , function( ) {
   if ( typeof upfiles[count] === 'undefined') return false;
    var data = new FormData();
    var fileIn = $( "#fileToUpload" )[0];
    if( !upfiles ) 
        upfiles = fileIn.files; 
      $(upfiles).each(function(index, file) 
      {
           data.append( 'file'+index, file );
      });
   var request = $.ajax({
        url: 'files.php',
        type: 'POST',
        data: data,
        cache: false,
        contentType: false,
        processData: false,
        beforeSend: function( ) {
                    $(".progressbar").show();
            },
        xhr: function() {  
                var xhr = $.ajaxSettings.xhr();
                if(xhr.upload){ 
                        xhr.upload.addEventListener( 'progress', showProgress, false);
                }
                return xhr;
        },
        success: function(data){
            if( percentComplete <= 100 ) {
                    $('#pb div').animate({ width: '100%' }, { step: function(now) {
                            $(this).text( Math.round(now) + '%' );
                    },  duration: 10});
                    }
           $('#uplcomp').append( data );
        }
    });

如何在之前的文件上传过程中阻止用户。

更新

ok 到一定程度(但这也不是一个好主意,用户可以从 firebug 中添加 div 并再次发送文件)

我用过

 $( document ).ajaxStart(function() {
   $( "#total" ).remove();
 });

并在 ajax 开始:

 $(document).ajaxStop( function( ) {

//how can i add div back say : add <div id='total'></div> after <div id='someid'></div>

});

是否有可能在第一个 ajax 正在进行时停止第二个 ajax 请求?

【问题讨论】:

  • 您可以在调用 ajax 时禁用可拖动,并在收到响应时重新启用它:“OK”。
  • 是的,我该如何实现...? @EdgarGodyuk
  • 如果您使用的是 jQuery Draggable 。我相信你可以在ajax调用之前禁用它 - $(element).draggable('disable') 。并在 ajax 调用返回成功后 - $(element).draggable('enable')
  • 我已经清楚地提到了我一直在使用的代码,但我不知道你们为什么要提供 $(element).draggable( 'enable' ) ,有什么可以我这样做,如果这是正确的方法,我如何集成到我发布的上述代码中
  • 好吧,我实际上不确定您是如何创建这些可拖动对象的,但是.. 如果您使用 jquery draggable - 在您的 ajax 调用中调用 .draggable( 'disable' ),在发送之前应该可以工作。像这样: beforeSend: function( ) { $(".progressbar").show(); $("your_draggable_element").draggable( 'disable' ) }, ... .... 并且成功:function(data){} 你重新启用它

标签: php jquery ajax file-upload drag-and-drop


【解决方案1】:

除了 enabling/disabling 在 ajax 进行时拖放之外,我相信更好的解决方案是显示覆盖该区域的透明或半透明叠加层,并防止用户选择任何可拖动的对象。

使用 jquery 禁用/启用

在ajax的beforeSend()函数中使用$( "#total" ).draggable( "disable" );

在函数ajax的success()内使用$( "#total" ).draggable( "enable" );

使用 CSS:

演示:http://jsfiddle.net/lotusgodkk/GCu2D/184/

CSS:

.checked {
    position:fixed;
    top:0;
    left:0;
    right:0;
    bottom:0;
    background:#BFBFBF;
    opacity:0.5;
    text-align:center;
}
.checked div {
    margin:0 auto;
    top:50%;
    left:50%;
    position:absolute;
}

HTML:

<div class="checked">
    <div>Please wait...</div>
</div>

只需在 ajax 期间切换隐藏/显示

beforeShow() 中使用$('.checked').show();,在success() 中使用$('.checked').hide();

【讨论】:

  • 我已经清楚地提到了我一直在使用的代码,但我不知道你们为什么要提供 $(element).draggable('enable'),如果这个我该怎么办是我如何集成到我发布的上述代码中的正确方法
  • 不,这不是一个好方法......用户可以从萤火虫中改变它,解决方案是不可接受的
  • 我认为你不应该使用 remove。如果您真的想从 DOM 中删除该 div 并再次重新插入,请尝试使用 jQuery 分离:api.jquery.com/detach
  • 是的,可以做到。首先检测 ajax 是否正在进行,并根据结果触发下一个 ajax。请参阅此解决方案以检查待处理的请求:stackoverflow.com/questions/3148225/jquery-active-functionstackoverflow.com/questions/1822913/…
  • 您可以尝试在中止请求时手动将其设置为零。比如 $.active=0 或 1,随便你
【解决方案2】:

终于用上了

if($.active === 0)
{
   call ajax
}
else
{
   alert("please wait previous request is in process");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2012-04-14
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多