Ada*_*tle 6 javascript jquery event-bubbling jquery-mobile
我正在使用jQuery Mobile并创建了一些类似于Android Holo Tabs的东西:
为了使滑动手势能够在标签之间切换,这是我添加的代码:
$("#myPage #pageTabs").on('swipeleft swiperight', function(e){
e.stopPropagation();
e.preventDefault();
});
$("#myPage").on('swipeleft', function(){
ui.activities.swipe(1);
}).on('swiperight', function(){
ui.activities.swipe(-1);
});
Run Code Online (Sandbox Code Playgroud)
标签的HTML类似于:
<div id="pageTabs">
<div class="tab">
<a href="#" data-dayOfMonth="26">Thu</a>
</div>
<div class="tab">
<a href="#" data-dayOfMonth="27">Fri</a>
</div>
<div class="tab">
<a href="#" data-dayOfMonth="28" data-meridian="am">Sat AM</a>
</div>
<div class="tab">
<a href="#" data-dayOfMonth="28" data-meridian="pm">Sat PM</a>
</div>
<div class="tab">
<a href="#" data-dayOfMonth="29">Sun</a>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我正在侦听页面级别的滑动手势,因为div[data-role=content] 如果没有足够的内容,有时可能无法垂直填充屏幕.如果我听了这个div并且没有覆盖屏幕,并且你靠近底部滑动,事件将不会触发此div,它将在根页面上(div[data-role=page]).
这是Firefox对该页面的3D渲染,用于证明上述断言.我注释了 div[data-role=content]:
出于这个原因,我正在页面层面上听它; 但由于标签的数量可以滚出视口(如上图所示:星期日在屏幕右侧),我希望用户能够水平滚动它.我已经有了水平滚动工作(这只是一些简单的CSS),但问题是,即使我e.stopPropagation()上面看到,滑动手势冒泡到页面元素,我的滑动手势阻止了平滑滚动在我添加滑动手势之前可用.
我是否误解了事件冒泡是如何工作的,或者在这种情况下如何阻止事件冒泡?
我找到了解决方法,但实际的解决方案会更好。
由于问题是我没有满足这两个要求的容器:
我决定添加一个包装器:
<div id="pageTabs">
<div class="tab">
<a href="#" data-dayOfMonth="26">Thu</a>
</div>
<div class="tab">
<a href="#" data-dayOfMonth="27">Fri</a>
</div>
<div class="tab">
<a href="#" data-dayOfMonth="28" data-meridian="am">Sat AM</a>
</div>
<div class="tab">
<a href="#" data-dayOfMonth="28" data-meridian="pm">Sat PM</a>
</div>
<div class="tab">
<a href="#" data-dayOfMonth="29">Sun</a>
</div>
</div>
<div class="contentWrapper">
<!-- ... -->
</div>
Run Code Online (Sandbox Code Playgroud)
我已将滑动手势附件移至此新包装器,并从选项卡栏中删除了滑动侦听器:
$(".contentWrapper").on('swipeleft', function(){
ui.activities.swipe(1);
}).on('swiperight', function(){
ui.activities.swipe(-1);
});
Run Code Online (Sandbox Code Playgroud)
为了确保它始终填充屏幕,每次加载页面时,我将其最小高度设置为计算出的视口高度减去包装器的顶部偏移量:
$("#myPage").on('pageshow', function(){
var viewPortHeight = document.documentElement.clientHeight;
var offset = $(".contentWrapper", this)[0].offsetTop;
$(".contentWrapper", this).css({'min-height': viewPortHeight - offset + 'px', 'display': 'block'});
});
Run Code Online (Sandbox Code Playgroud)
这正是我想要的。我可以在页面内容上滑动来切换选项卡,并且可以水平滚动选项卡而无需激活滑动手势。
对于任何有兴趣实现相同效果的人,这是我的 LESSCSS:
#pageTabs {
@tab-highlight: @lightblue;
margin: -15px -15px 15px -15px;
padding: 0;
height: 38px;
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
border-bottom: 2px solid @tab-highlight;
.tab {
display: inline-block;
vertical-align: top;
border-left: 1px solid @tab-highlight;
margin-left: -5px;
height: 100%;
&:first-child {
margin-left: 0;
}
&.active {
height: 32px;
border-bottom: 8px solid @tab-highlight;
}
a {
padding: 12px 20px 0px 20px;
display: block;
height: 100%;
text-decoration: none;
}
}
}
Run Code Online (Sandbox Code Playgroud)