【问题标题】:Simulate scroll event using Javascript使用 Javascript 模拟滚动事件
【发布时间】:2011-07-20 12:10:17
【问题描述】:

我正在尝试使用 Javascript for Mobile Safari 模拟滚动事件。 我正在使用以下代码

var evt = document.createEvent("MouseEvents");    
evt.initMouseEvent("scroll", true, true, window,0, 0, 0, 0, 0, false, false, false, false, 0, null);

上面的代码是 jQuery 插件 jQuery.UI.Ipad 的一部分,它基本上将触摸事件(如 touchstarttouchmovetouchend)映射到鼠标事件(如 mouseovermousedown 等)

但是由于某些原因,模拟滚动事件的代码无法正常工作...请帮助我。所以本质上我的问题是如何模拟滚动事件。

【问题讨论】:

    标签: javascript jquery ipad mobile-safari jquery-events


    【解决方案1】:

    我认为人们对您为什么要覆盖滚动控件感到困惑。我明白你为什么要模仿鼠标事件,但滚动可能不应该是其中之一。

    通常对于滚动更改,您可以通过以下方式获取滚动:

    var top = document.body.scrollTop;
    

    并设置:

    document.body.scrollLeft = sX;
    document.body.scrollTop = sY;
    

    【讨论】:

    • 这可能吗? window.document.body.onscroll = doSomething;
    • 甚至? window.scrollTo(0, 1);
    【解决方案2】:

    所以,我知道我也需要模拟它。对我来说,当你有一个带有溢出框的灯箱时,你会需要它。只是我能想到的众多案例中的一个。寻找答案。只是想我会分享我在哪里,你不是用 jQuery.Ui.Ipad 我会用谷歌搜索..但这是我到目前为止得到的并且确实有效但并不完美。

        var inTouch=false;
        var timers_arr = new Array();
        var c=0;
        var t;
        var timer_is_on=0;
        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
        // jeremy's timer functions
        //-------------------------------------------------------------------------------------------------------------------------------------------------------------
            function clearCount(timer){
                    /// clear the time from timer
                    clearTimeout(timers_arr[timer]);
                    /// Make sure it's clear  
                    timers_arr[''+timer+'']=0;
                    delete timers_arr[''+timer+''];
    
            }
            function setCount(timer,time,func){
                    clearCount(timer);
                    if(timers_arr[timer]==0||typeof(timers_arr[timer]) === 'undefined'){
                      timers_arr[timer]=setTimeout(function(){
                                            func();                                                 
                            },time);
                    }
            }
    
        function updatePos(evt,startY){
            setCount('touchmove',1,function(){
                var orig = evt.originalEvent;
                var curY = orig.changedTouches[0].pageY;
                var y = curY - startY;
                var sliderVal = $("#slider-vertical").slider("value");
                sliderVal += (y*.008);
                $("#slider-vertical").slider("value", sliderVal);
                updatePos(evt,startY);
            });
            setCount('touchmove_anitMotion',200,function(){
                clearCount('touchmove');
                clearCount('touchmove_anitMotion');
            });
        }
        var startX=0;
        var startY=0;
        var x=0;
        var y=0;
        var direction='';
        $('body').bind("onorientationchange", updateOrientation, false);
        $('#scroll-pane').live("touchstart", function(evt){
           inTouch=true;
           startX = event.targetTouches[0].pageX; 
           startY = event.targetTouches[0].pageY; 
        }); 
        $('#scroll-pane').live("touchmove", function(evt){
            evt.stopPropagation();
            evt.preventDefault();
            updatePos(evt,startY);
        }); 
        $('#scroll-pane').live("touchend", function(evt){
            startX=0;
            startY=0;
            clearCount('touchmove');
            inTouch=false;
        }); 
        $('#scroll-pane').live("touchcancel", function(evt){
            startX=0;
            startY=0;
            clearCount('touchmove');
            inTouch=false;
        });
    

    再次不完美并希望修复它..但它至少可以正常工作。现在请注意,这是一个使用 jQuery UI 滑块作为滚动条的 div,如

    所示(在我的情况下它是垂直的)

    http://jqueryui.com/demos/slider/#side-scroll

    希望能激发一些想法。如果我得到一个超级稳定的答案,我会回来的。 干杯-杰里米

    【讨论】:

      【解决方案3】:

      我需要这个来编写一个单元测试,为此我需要模拟一个滚动事件

      function dispatchScroll(target,newScrollTop) {
            target.scrollTop = newScrollTop;
            var e = document.createEvent("UIEvents");
            // creates a scroll event that bubbles, can be cancelled,
            // and with its view and detail property initialized to window and 1,
            // respectively
            e.initUIEvent("scroll", true, true, window, 1);
            target.dispatchEvent(e);
          }
      

      更多详情:https://developer.mozilla.org/en-US/docs/Web/API/event.initUIEvent

      【讨论】:

        【解决方案4】:

        对我有用的事件是mousewheel,第 5 个参数对于向下滚动需要为正,对于向上滚动需要为负。

        var evt = document.createEvent("MouseEvents");    
        evt.initMouseEvent("mousewheel", true, true, window, 1, 0, 0, 0, 0, false, false, false, false, 0, null);
        

        请注意,对于 FireFox,事件类型为 DOMMouseScroll

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-07
          • 2016-07-03
          • 1970-01-01
          • 2011-02-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多