iOS Safari似乎永远不会触发滚动事件,如果鼠标下的元素只有"overflow-y: scroll&qu
iOS Safari appears to never fire scroll event if the element under mouse has only "overflow-y: scroll" and scrolling horizontally
我有两个元素,父节点和子节点。子节点只能垂直滚动(overflow: hidden; overflow-y: scroll;
)。父节点只能水平滚动(overflow: hidden; overflow-x: scroll;
)。当我在子节点上横向滑动时,尽管这样做了,但没有触发滚动事件:
//NEITHER of these are fired when swiping sideways on the child
child.addEventListener( "scroll", listener, true );
parent.addEventListener( "scroll", listener2, true );
浏览器只有触发一个滚动事件,如果我垂直滚动在孩子!listener
和 listener2
都没有被调用!如果子元素只有一个方向滚动,我如何让它为父元素触发水平滚动?
Fiddle Mobile示例:https://jsfiddle.net/cn2hfLok/2/embedded/result/
HTML:<div class="parent">
<div class="child">
content<br />content<br />content<br />content<br />content<br />content<br />content<br />
content<br />content<br />content<br />content<br />content<br />content<br />content<br />
content<br />content<br />content<br />content<br />content<br />content<br />content<br />
content<br />content<br />content<br />content<br />content<br />content<br />content<br />
content<br />content<br />content<br />content<br />content<br />content<br />content<br />
content<br />content<br />content<br />content<br />content<br />content<br />content<br />
content<br />content<br />content<br />content<br />content<br />content<br />content<br />
</div>
<div style="width: 5000px;">s</div>
</div>
CSS: .parent
{
position:relative;
width: 600px;
height: 100%;
background-color: yellow;
overflow: hidden;
overflow-x: scroll;
}
.child
{
position:relative;
width: 50%;
height: 200px;
background-color: blue;
overflow: hidden;
overflow-y: scroll;
}
JavaScript: function scrollC(e)
{
console.log( "child" );
}
function scrollP(e)
{
console.log( "parent" );
}
document.querySelector( ".child" ).addEventListener( "scroll", scrollC );
document.querySelector( ".parent" ).addEventListener( "scroll", scrollP );
编辑:它出现即使overflow: scroll
在孩子,如果没有什么可以水平滚动,它仍然不会触发滚动事件! https://jsfiddle.net/cn2hfLok/4/embedded/result/
如果孩子在你试图移动的方向上没有任何东西可以滚动,或者它不听那个方向,那么在iOS Safari上为父母捕获滚动事件是不可能的。为了克服这个问题,你需要监听子进程上的触摸事件,然后通过改变父进程的scrollLeft
或scrollTop
将该移动传递给父进程,这将触发父进程的滚动事件处理程序。
听:
touchstart
捕捉起始位置
touchmove
检查当前位置对开始,如果它水平移动(和足够小的垂直),然后通过parent.scrollLeft += startX - e.clientX;
传递给父,然后调用e.stopPropagation();e.preventDefault();
,使它不移动页面。(同时将startX
更新为e.clientX
)
touchend
和touchleave
设置一些变量来告诉你的touchmove
处理器停止监听,例如notDragging = true;
我认为你应该按以下方向去做:
-
为处理程序启用捕获阶段:
document.querySelector( ".parent" ).addEventListener( "scroll", scrollP, true );
-
停止父回调中的传播:
e.stopPropagation();
在这种情况下,父端的监听器将拦截包括horizontal scroll
在内的所有事件。但实际上你可以通过event.type
和其他一些可访问的属性来过滤它们。
下面是更新后的示例:https://jsfiddle.net/cn2hfLok/7/
- html,js-如何限制元素"范围“-命名空间
- 我如何选择/点击一个带有for=“”的元素"属性[量角器]
- "隐藏/显示”;元素和更改按钮背景图像
- 将元素添加到javascript中"字典“;大堆
- Javascript.替换元素“<termref/>"用规则的“;文本”;
- 使用javascript"随机引用“;脚本,但跨越两个独立的元素
- “间歇”;jqLite不支持通过选择器查找元素"当使用RequireJS加载AngularJS时
- 如何使用JQuery's”;.on()"方法来处理非本机jquery元素
- 为什么我的动画"重放的“;当通过innerHTML添加元素时
- jQuery:元素静止":隐藏的“;在.slideDown()之后
- 如何访问JSON元素-"JavaScript中名称中的字符
- "text长度"Internet Explorer中svg文本元素悬停时的更改
- ReactJS-将溢出的元素放入一个“"下拉按钮
- 浏览器中的观察者模式javascript:订阅事件"添加了Dom元素“;并处理这个元素
- Knockout.js"<!--ko if:-->"导致分离DOM元素的块
- 如何隐藏所有下一个"字段集“;元素使用jQuery
- 如何删除扩展属性“;jquery123456"来自元素
- 带错误的Onsen UI导航:您不能提供no"ons页”;元素到“;ons导航器”;当返回第一页时
- Javascript:如何检查一个元素是否是"显示”;在屏幕上
- HTML元素"中的URL文本.Split不是一个函数