使用Javascript模拟滚动事件
我正在尝试使用Javascript为Mobile Safari模拟一个滚动事件。 我正在使用以下代码使用Javascript模拟滚动事件,javascript,jquery,ipad,mobile-safari,jquery-events,Javascript,Jquery,Ipad,Mobile Safari,Jquery Events,我正在尝试使用Javascript为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.Ip
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的一部分,它基本上将触摸事件(如touchstart
,touchmove
,touchend
)映射到鼠标事件(如mouseover
,mousedown
)等
但是由于某些原因,用于模拟滚动事件的代码不起作用。。。请帮帮我。因此,本质上我的问题是如何模拟滚动事件。我认为人们对为什么要跳过滚动控件感到困惑。我可以理解为什么你想模仿鼠标事件,但滚动可能不应该是其中之一 通常,对于滚动更改,您可以使用以下工具获取滚动:
var top = document.body.scrollTop;
并设置:
document.body.scrollLeft = sX;
document.body.scrollTop = sY;
所以,我知道我也需要模拟它。对我来说,当你有一个带有溢流盒的灯箱时,你会需要它。只是我能想到的众多案例中的一个。寻找答案。我只是想和大家分享一下我的现状,而不是用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;
});
又一次不完美,正在寻找解决方法。。但它至少起作用了。现在请注意,这是一个div,它使用jqueryui滑块作为滚动条(在我的视图中是垂直的),如中所示
希望这能激发一些想法。如果我得到一个超级稳定的答案,我会回来的。
干杯-Jeremy我需要这个来编写单元测试,为此我需要模拟一个滚动事件
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);
}
有关更多详细信息:对我有效的事件是
mouseweel
,第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
。这可能是什么?window.document.body.onscroll=doSomething;甚至?滚动到(0,1);