<ul class="box">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
<li>item6</li>
<li>item7</li>
<li>item8</li>
<li>item9</li>
<li>item10</li>
<li>item11</li>
<li>item12</li>
<li>item13</li>
<li>item14</li>
<li>item15</li>
<li>item16</li>
<li>item17</li>
<li>item18</li>
<li>item19</li>
<li>item20</li>
</ul>
<script>
document.addEventListener('mousewheel', function(e){
e.preventDefault();
}, false);
document.querySelector('.box').addEventListener('mousewheel', function(e) {
// 如果不阻止冒泡,box就不能滚动
e.stopPropagation();
}, false);
</script>
如上,我在document上阻止了滚动默认引起页面滚动的行为,box元素如果不阻止冒泡,也不能滚动了,这是为什么?
首先一点:
如果一个事件有默认的触发动作,那么要等到冒泡过程执行完毕,才会执行-没有被中途阻止的话
代码修改下,能看的更清楚
1)mousewheel是支持事件冒泡的
2)mousewheel正常的事件冒泡顺序为li->ul->document
3)你在ul.box中添加了事件监听并执行了
e.stopPropagation()
;那么冒泡顺序变为li->ul,不会到达document,也就意味者document上绑定的mousewheel事件将不会被触发-能看到.box mouse wheel输出而看不到document mousewheel输出
,e.preventDefault()
无法执行到,默认的滚动行为没有被阻止,滚动自然就发生了4)那么当
e.stopPropagation()
注释掉,事件冒泡走正常的流程,document中mousewheel的事件回调将被执行-e.preventDefault()
被执行,默认滚动动作就被阻止,就不会发生了