jQuery Mobile "pagebeforechange" вызывается дважды - PullRequest
6 голосов
/ 06 января 2012

У меня есть следующий прослушиватель, настроенный для "pagebeforechange" (очень похожий на собственный код jQuery Mobile Documentation) и ссылка на домашней странице, которая вызывает http://localhost/#product?id=255979

//Bind Listener for Product Details
$(document).bind( "pagebeforechange", function( e, data ) {
    //Only Run If Site is Initialized
    if( ajaxSite.options.initialized ) {
        if ( typeof data.toPage === "string" ) {
            var u = $.mobile.path.parseUrl( data.toPage ),
                pl = /^#product/;

            if ( u.hash.search(pl) !== -1 ) {
                console.log("showProduct being called.");
                ajaxSite.showProduct( u, data.options );
                e.preventDefault();
            }
        }
    }
});

Когда я открываю консоль JavaScript и нажимаю на ссылку, я вижу следующее:

showProduct being called.
showProduct being called.

Кажется, я не могу найти что-нибудь о том, почему это будет вызвано дважды. Я видел другие ошибки, когда vclicks регистрировались дважды из-за щелчка по краю, но это не имеет никакого смысла, поскольку полагается на фактическое изменение страницы.

Ответы [ 4 ]

6 голосов
/ 06 января 2012

Поскольку вы привязываетесь к $ (документу) и используете многостраничный макет

Я думаю, что jQM загружает документ несколько разраз (только догадка)

Переключитесь на использование идентификатора страницы, например:

$(document).bind( "pagebeforechange", function( e, data ) { ...

на

$('#pageId').bind( "pagebeforechange", function( e, data ) { ...
4 голосов
/ 04 февраля 2012

Может быть, немного поздно, но вот мое образованное предположение:

Любое событие смены страницы вызывает два перехода, один «вперед» (pagechange) и один «назад» (hashchange).Если вы идете вперёд, hashChange блокируется, если вы идете назад, это наоборот.

Просмотрите исходный код jqm и проверьте свойство ignoreNextHashChange .

Это отвечает за блокировку hashChange при переходах вперед, иначе вы будете переходить туда-сюда.

Полагаю, ваша функция запускается дважды, потому что оба события запускаются изнутри changePage и hashChange.

Если бы это было так, JQM пришлось бы блокировать рутину hashChange, прежде чем запускать это событие.

3 голосов
/ 24 января 2014

Он вызывается дважды по замыслу. http://api.jquerymobile.com/pagebeforechange/

, если data.toPage установлено в строку, событие указывает, что навигация скоро начнется.

, если data.toPage установлено для объекта jQuery, событие указывает, что страница назначения была загружена.

0 голосов
/ 10 мая 2014

Если вы читаете документацию jquery для мобильных устройств https://api.jquerymobile.com/pagebeforechange/, он говорит, что он вызывается дважды, когда data.toPage ссылается на новую страницу, второй раз data.toPage уже является объектом jquery новой страницы.

...