2012-01-06 3 views
6

Mam następujący słuchacz skonfigurować dla „pagebeforechange” (bardzo podobny do własnego kodu dokumentacji jQuery Mobile) i link na stronie głównej, że dzwoni http://localhost/#product?id=255979jQuery Mobile „pagebeforechange” miano dwukrotnie

//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(); 
      } 
     } 
    } 
}); 

Kiedy otworzyć konsolę JavaScript i kliknij link widzę następujące:

showProduct being called. 
showProduct being called. 

ja nie mogę znaleźć nic na temat, dlaczego to nazwać coraz dwukrotnie. Widziałem inne błędy, w których vclicks są rejestrowane dwukrotnie z powodu kliknięcia krawędzi, ale to nie ma sensu, ponieważ polega na faktycznej zmianie strony.

+0

Czy używasz układu wielostronicowego lub pojedynczej strony? http://jquerymobile.com/demos/1.0/docs/pages/index.html Powodem, dla którego pytam, jest powiązanie z $ (dokumentem) zamiast z układem stronicowania –

+0

Układ wielu stron - metoda "showProduct()" ładuje informacje na drugą stronę, a następnie przechodzi. – Jack

+0

Zastanawiam się, skoro wiążesz $ (dokument), że jest on wywoływany wiele razy, czy mógłbyś zamiast tego użyć strony ID i przetestować? –

Odpowiedz

6

Skoro jesteś wiążące do $ (document) i stosując układ Wielu stronę

myślę jQM jest wczytywanie dokumentu wiele razy (po prostu przeczucie)

przełączenie się na IdStrony zamiast przykład:

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

do

$('#pageId').bind("pagebeforechange", function(e, data) { ... 
+3

Dla mnie zdarzenie nie zostanie wywołane podczas wstawiania strony id za pomocą v1.0 ... (zobacz także http://stackoverflow.com/questions/8793403/jquery-mobile-cant-bind-pagebeforechange-to-page- id) – Lincoln

+0

Wiązanie z pageId nie wywołuje zdarzenia –

+0

@JihoKang, jeśli zamieścisz pytanie zawierające część kodu, którego używasz, prawdopodobnie będzie ci łatwiej pomóc w ten sposób –

4

Może trochę późno, ale tutaj jest mój zgaduje:

Każde wydarzenie pagechange wyzwala dwa przejścia, jeden "do przodu" (pagechange) i jeden "do tyłu" (hashchange). Jeśli przejdziesz dalej, hashChange jest zablokowany, jeśli cofniesz się, jest odwrotnie.

Sprawdź kod źródłowy jqm i sprawdź właściwość ignoreNextHashChange.

ten jest odpowiedzialny za blokowanie hashChange na przemian do przodu, inaczej byłbyś tam iz powrotem.

Chyba twoja funkcja wypalania dwa razy, ponieważ oba zdarzenia są wywoływane zarówno od wewnątrz changePage i hashChange.

Jeśli tak było, JQM musiałaby zablokować rountine hashChange przed wywołaniem tego zdarzenia.

+0

Daję ci punkt, ponieważ jest to pomocna rada, ale w rzeczywistości odkryłem problem jakiś czas temu :-). Problem polegał na tym, że preventDefault() nie działał, nadal wywołując ręcznie zmianę strony. Miałem metodę z wywołaniem AJAX w nim powyżej preventDefault() i błąd z AJAX nie był poprawnie obsługiwany i preventDefault() nigdy nie został wywołany. Głupia pomyłka, ale doprowadzało mnie to do szału, gdy wpatrywał się w nią przez 6 godzin. Naprawdę po prostu potrzebowałem kolejnego zestawu oczu, by powiedzieć mi, co ciągle przeskakuję. Dzięki! – Jack

3

To jest wywoływana dwukrotnie z projektem. http://api.jquerymobile.com/pagebeforechange/

jeśli data.toPage jest ustawiony na ciąg znaków, zdarzenie wskazuje, że nawigacja ma się rozpocząć.

jeśli data.toPage jest ustawiony na obiekt jQuery, zdarzenie wskazuje, że strona docelowa została załadowana.

+0

Przeczytaj pytanie. Opublikowany kod pokazuje filtrowanie (typeof data.toPage === "string"). Wydarzenie to zdaje się przechodzić dwa razy. Ten problem jest bardziej złożony. – janoside

+0

jest to przydatna informacja dla tych, którzy o tym nie wiedzą, ale ze względu na sposób, w jaki została sformułowana, nie zamierzam jej odzyskać do zera –