6

我正在使用 jQuery Mobile 并创建了一些类似于 Android Holo Tabs 的东西:

http://note.io/18RNMRk

为了让滑动手势在选项卡之间切换时起作用,这是我添加的代码:

$("#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);
});

选项卡的 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>

我正在收听页面级别的滑动手势,因为div[data-role=content] 如果没有足够的内容,有时无法垂直填充屏幕。如果我在这个 div 上收听并且它没有覆盖屏幕,并且您向底部滑动,则该事件不会在该 div 上触发,它将在根页面 ( div[data-role=page]) 上。

这是 Firefox 对该页面的 3D 渲染,以证明上述断言。我已注释 div[data-role=content]

http://note.io/18RPhyK

出于这个原因,我在页面级别监听它;但由于选项卡的数量可以滚动到视口之外(如上所示:星期日在屏幕外右侧),我希望用户也能够水平滚动。我已经让水平滚动工作(这只是一些简单的 CSS),但问题是,即使我e.stopPropagation()在上面看到,滑动手势也会冒泡到页面元素,而我的滑动手势阻止了平滑滚动在我添加滑动手势之前可用。

我是否误解了事件冒泡的工作原理,或者在这种情况下如何阻止它?

4

1 回答 1

2

我找到了一种解决方法,但实际的解决方案会更好。

由于问题是我没有满足这两个要求的容器:

  1. 包含页面内容,但不包含选项卡
  2. 使用 min-height 始终垂直填充屏幕

我决定添加一个包装器:

<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>

我已将滑动手势附件移至此新包装器,并从选项卡栏中删除了滑动侦听器:

$(".contentWrapper").on('swipeleft', function(){
    ui.activities.swipe(1);
}).on('swiperight', function(){
    ui.activities.swipe(-1);
});

为了确保它始终填满屏幕,每次加载页面时,我将其最小高度设置为视口的计算高度减去包装器的顶部偏移量:

$("#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'});
});

这正是我想要的。我可以在页面内容上滑动来切换标签,并且我可以在不激活滑动手势的情况下水平滚动标签。

对于任何有兴趣实现相同效果的人,这是我的 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;
        }
    }
}
于 2013-08-01T04:44:41.173 回答