Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 停止滚动绑定功能,直到AJAX请求成功_Jquery_Asynchronous_Semaphore - Fatal编程技术网

Jquery 停止滚动绑定功能,直到AJAX请求成功

Jquery 停止滚动绑定功能,直到AJAX请求成功,jquery,asynchronous,semaphore,Jquery,Asynchronous,Semaphore,我正在jQuery中执行一个无限滚动脚本,如下所示: $(window).scroll(function(){ if($(window).scrollTop() >= $(document).height() - $(window).height() - 50){ // If we have not loaded all pages yet if($('#feed').data('pagesloaded') != 0){ var toload = $('#

我正在jQuery中执行一个无限滚动脚本,如下所示:

$(window).scroll(function(){
  if($(window).scrollTop() >= $(document).height() - $(window).height() - 50){

    // If we have not loaded all pages yet
    if($('#feed').data('pagesloaded') != 0){
      var toload = $('#feed').data('pagesloaded') + 1;

      $.post("/feed/" + toload, { 'ignore': showed_posts_id }, function(html){
        if(html){
          $('#feed')
            .data('pagesloaded', toload)
            .append(html);
        }else{
          // If all pages are loaded, disable infinite scrolling
          $('#feed').data('pagesloaded', 0);
        }
      });

    }
  }
});
其中
50
是从触发事件的底部开始的像素偏移量。但是,当滚动到页面底部时,当偏移量从50变为0时,会多次触发该函数,从而导致所有页面同时加载

我听说过将事件绑定到$(window).ajaxStart()和.ajaxStop()的技术,但由于在我的应用程序中使用了大量异步ajax,它会干扰无限滚动。这就是我要说的:

var ajaxRunning = false;
$(window).ajaxStart(function () {
  ajaxRunning = true;
}).ajaxStop(function () {
  ajaxRunning = false;
});

我曾考虑过使用一个简单的二进制信号量来检查$.post是否仍在运行,但我想知道这是否是一种不好的做法。最好的方法是什么?

我终于在$(窗口)上添加了一个简单的数据标志。如果有人认为这是一种不好的练习,并且知道一种更有效的方法,我很乐意听到

$(window).scroll(function(){
  if($('#feed').data('pagesloaded') != 0 && !$(window).data('infinite-scroll-async')){
    if($(window).scrollTop() >= $(document).height() - $(window).height() - 50){

      // Locks the function
      $(window).data('infinite-scroll-async', true);

      var toload = $('#feed').data('pagesloaded') + 1;

      $.post("/feed/" + toload, { 'ignore': showed_posts_id }, function(html){

        if(html){
          $('#feed')
            .data('pagesloaded', toload)
            .append(html);
        }else{
          // If all pages are loaded, disable infinite scrolling
          $('#feed').data('pagesloaded', 0);
        }

      }).complete(function(){

        // Unlocks the function
        $(window).data('infinite-scroll-async', false);

      });

    }
  }
});