Попытка предотвратить пузырение жеста смахивания jQueryMobile, но это не работает

Я использую jQuery Mobile и создал что-то, чем-то напоминающее вкладки Android Holo:

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]).

Вот 3D-рендеринг этой страницы в Firefox для доказательства приведенного выше утверждения. Я прокомментировал div[data-role=content]:

http://note.io/18RPhyK

По этой причине я слушаю его на уровне страницы; но поскольку количество вкладок может прокручиваться за пределы области просмотра (как показано выше: воскресенье находится за пределами экрана справа), я хотел бы, чтобы пользователь также мог прокручивать это по горизонтали. У меня уже работает горизонтальная прокрутка (это просто какой-то простой CSS), но проблема в том, что даже с моим e.stopPropagation(), показанным выше, жест смахивания всплывает к элементу страницы, а мой жест смахивания препятствует плавной прокрутке, которая был доступен до того, как я добавил жест смахивания.

Я неправильно понимаю, как работает всплытие событий или как его остановить в этом сценарии?


person Adam Tuttle    schedule 31.07.2013    source источник
comment
e.target может помочь?   -  person Omar    schedule 01.08.2013
comment
В каком смысле? Можете быть более конкретными?   -  person Adam Tuttle    schedule 01.08.2013
comment
Я имею в виду, что вы слушаете целевой элемент, в котором произошло событие, и соответственно выполняете код fiddle.jshell.net /Палестинский/збПЖ/шоу   -  person Omar    schedule 01.08.2013
comment
В вашем примере вообще не рассматривается отмена пузырьков событий. Мне нужно, чтобы жест не влиял на нормальное поведение, а не просто обнаруживал, что он произошел.   -  person Adam Tuttle    schedule 01.08.2013
comment
Тогда я неправильно понял ваш вопрос.   -  person Omar    schedule 01.08.2013
comment
Спасибо за попытку! :)   -  person Adam Tuttle    schedule 01.08.2013
comment
давайте продолжим это обсуждение в чате   -  person Omar    schedule 01.08.2013


Ответы (1)


Я нашел обходной путь, но фактическое решение было бы лучше.

Поскольку проблема в том, что у меня нет контейнера, удовлетворяющего этим двум требованиям:

  1. содержать содержимое страницы, но не вкладки
  2. используйте минимальную высоту, чтобы всегда заполнять экран по вертикали

Я решил добавить обертку:

<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;
        }
    }
}
person Adam Tuttle    schedule 01.08.2013
comment
Не могли бы вы опубликовать свой полный код прокручиваемой панели навигации.. Я хотел бы -если вы не возражаете- вырвать его =) - person Omar; 20.09.2013
comment
@Omar Добавил свой LESS. Надеюсь, это поможет. - person Adam Tuttle; 20.09.2013
comment
Спасибо большое, это мило с вашей стороны :) - person Omar; 20.09.2013