【问题标题】:How to run the mousewheel event listener more than once?如何多次运行鼠标滚轮事件监听器?
【发布时间】:2018-08-23 17:12:37
【问题描述】:

当用户激活鼠标滚轮时,我的脚本会从其他 html 页面加载数据。

它应该像这样工作。向上滚动,将contact.html 加载到home.html,再次向上滚动,将legal.html 加载到home.html。但现在它只加载一次,因为鼠标滚轮事件监听器只工作一次。

如何让我的脚本在新页面加载到home.html 后再次监听鼠标滚轮?

javascript

$(document).ready(function() {
   bind_events();
   $(window).resize(function() {
      adjust_div_height();
   });
   adjust_div_height();
});

function bind_events() {
   var elem = $('.div-scrollable')[0];
   hammertime = new Hammer(elem);
   hammertime.get('swipe').set({ direction: Hammer.DIRECTION_VERTICAL 
});

hammertime.on("swipeup", function(ev) {
   load_page('next');
   adjust_div_height();
});

hammertime.on("swipedown", function(ev) {
    load_page('previous');
    adjust_div_height();
});

addWheelListener(elem, function(e) {
    var scrollUp = e.deltaY > 0;
    var scrollDown = e.deltaY < 0;

    if (scrollUp) {
        load_page('next');
    } else if (scrollDown) {
        load_page('previous');
    }
  });
}

function load_page(page_to_load) {
   // load contact page data
   var loadContactPage = $('#loaded_content').load('contact.html #contact');
   var loadHomePage = $('#loaded_content').load('home.html #home');
   var homeIsCurrentPage = "$('#home').length)";
   var contactIsCurrentPage = "$('#contact').length)";
   var legalIsCurrentPage = "$('#contact').length)";

   if (homeIsCurrentPage) {
      var next = loadContactPage;
      update_url('contact.html'); 
      console.log('contact page was loaded!');
   } 

   if (contactIsCurrentPage) {
      var next = loadLegalPage;
      update_url('legal.html'); 
      console.log('legal page was loaded!');
   } 

   if (legalIsCurrentPage) {
      var previous = loadContactPage;
      update_url('contact.html'); 
      console.log('contact page was loaded!');
   } 

wheel_listener.js

// creates a global "addWheelListener" method
// example: addWheelListener( elem, function( e ) { console.log( 
e.deltaY ); e.preventDefault(); } );
(function(window, document) {

var prefix = "",
    _addEventListener, support;

// detect event model
if (window.addEventListener) {
    _addEventListener = "addEventListener";
} else {
    _addEventListener = "attachEvent";
    prefix = "on";
}

// detect available wheel event
support = "onwheel" in document.createElement("div") ? "wheel" : // Modern browsers support "wheel"
    document.onmousewheel !== undefined ? "mousewheel" : // Webkit and IE support at least "mousewheel"
    "DOMMouseScroll"; // let's assume that remaining browsers are older Firefox

window.addWheelListener = function(elem, callback, useCapture) {
    _addWheelListener(elem, support, callback, useCapture);

    // handle MozMousePixelScroll in older Firefox
    if (support == "DOMMouseScroll") {
        _addWheelListener(elem, "MozMousePixelScroll", callback, useCapture);
    }
};

function _addWheelListener(elem, eventName, callback, useCapture) {
    elem[_addEventListener](prefix + eventName, support == "wheel" ? callback : function(originalEvent) {
        !originalEvent && (originalEvent = window.event);

        // create a normalized event object
        var event = {
            // keep a ref to the original event object
            originalEvent: originalEvent,
            target: originalEvent.target || originalEvent.srcElement,
            type: "wheel",
            deltaMode: originalEvent.type == "MozMousePixelScroll" ? 0 : 1,
            deltaX: 0,
            deltaY: 0,
            deltaZ: 0,
            preventDefault: function() {
                originalEvent.preventDefault ?
                    originalEvent.preventDefault() :
                    originalEvent.returnValue = false;
            }
        };

        // calculate deltaY (and deltaX) according to the event
        if (support == "mousewheel") {
            event.deltaY = -1 / 40 * originalEvent.wheelDelta;
            // Webkit also support wheelDeltaX
            originalEvent.wheelDeltaX && (event.deltaX = -1 / 40 * originalEvent.wheelDeltaX);
        } else {
            event.deltaY = originalEvent.deltaY || originalEvent.detail;
        }

        // it's time to fire the callback
        return callback(event);

    }, useCapture || false);
}

})(window, document);

【问题讨论】:

  • 我看到你在哪里定义了 addWheelListener,但我没有看到你在哪里调用它。
  • 设置在document.scroll事件上运行的监听器,它会在任何/每次用户滚动时被调用。
  • @AdamChubbuck 我在 document.ready 块内调用 bind_events()。
  • @brewpixels bind_events() 不包含对 addWheelListener() 的函数调用,或者至少在您发布的版本中不包含。

标签: javascript jquery mousewheel


【解决方案1】:

我能理解您对代码的尝试。

简要说明一下,您的代码对我来说并不透明。所以,我无法模拟

  • addWheelListener 函数已定义但未使用。我想你忘记发布了。
  • adjust_div_height 函数已使用但未定义。
  • update_urlloadContactPageloadLegalPage 相同。

我尽量在Code Snippet 上添加如下内容。

如果您需要更多帮助,请查看并告诉我。

谢谢

$(document).ready(function () {
  bind_events();
  $(window).resize(function () {
    adjust_div_height();
  });
  adjust_div_height();
});

function bind_events() {
  var elem = $('.div-scrollable')[0];

  hammertime = new Hammer(elem);
  hammertime.get('swipe').set({
    direction: Hammer.DIRECTION_VERTICAL
  });

  hammertime.on("swipeup", function (ev) {
    load_page('next');
    adjust_div_height();
  });

  hammertime.on("swipedown", function (ev) {
    load_page('previous');
    adjust_div_height();
  });

  addWheelListener(elem, function (e) {
    var scrollUp = e.deltaY > 0;
    var scrollDown = e.deltaY < 0;

    if (scrollUp) {
      load_page('next');
    } else if (scrollDown) {
      load_page('previous');
    }
  });
}

function adjust_div_height() {
  console.log('Adjust Div height function should be here.');
}

function addWheelListener(elem, callback) {
  elem.addEventListener("wheel", callback);
}

function update_url(url) {
  console.log('Update url to <' + url + '>');
}

function load_page(page_to_load) {
  console.log('Scrolled to <' + page_to_load + '> page!');
  
  // load contact page data
  var loadContactPage = $('#loaded_content').load('contact.html #contact');
  var loadHomePage = $('#loaded_content').load('home.html #home');
  var homeIsCurrentPage = "$('#home').length)";
  var contactIsCurrentPage = "$('#contact').length)";
  var legalIsCurrentPage = "$('#contact').length)";

  if (homeIsCurrentPage) {
    var next = loadContactPage;
    update_url('contact.html');
    console.log('contact page was loaded!');
  }

  if (contactIsCurrentPage) {
    var next = loadLegalPage;
    update_url('legal.html');
    console.log('legal page was loaded!');
  }

  if (legalIsCurrentPage) {
    var previous = loadContactPage;
    update_url('contact.html');
    console.log('contact page was loaded!');
  }
}

function loadContactPage() { /* Load Contact Page */ }
function loadLegalPage() { /* Load Legal Page */ }
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
  <script src="https://hammerjs.github.io/dist/hammer.min.js"></script>
  <script src="https://code.jquery.com/jquery-3.1.0.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/1.0.0/handlebars.js"></script>
</head>
<body>
  <div id="home">Home</div>
  <div class="div-scrollable" style="height: 200px; background: red;">
    This is scrollable Div
  </div>
</body>
</html>

【讨论】:

  • addWheelListener 函数在 wheel_listener.js 中定义。我将代码添加到我的原始帖子中,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2021-02-08
  • 1970-01-01
相关资源
最近更新 更多