2012-01-06 28 views
6

Tôi đã nghe sau thiết lập cho "pagebeforechange" (rất giống với mã riêng Tài liệu của jQuery Mobile) và một liên kết trên trang chủ được gọi http://localhost/#product?id=255979jQuery Mobile "pagebeforechange" được gọi là hai lần

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

Khi tôi mở ra bảng điều khiển JavaScript và nhấp vào liên kết tôi thấy như sau:

showProduct being called. 
showProduct being called. 

tôi dường như không thể tìm thấy bất cứ điều gì về việc tại sao nó sẽ được nhận được gọi là hai lần. Tôi đã thấy các lỗi khác, nơi vclicks được đăng ký hai lần do nhấp chuột cạnh, nhưng điều này không có ý nghĩa gì vì nó phụ thuộc vào thay đổi trang thực tế.

+0

Bạn đang chạy bố cục nhiều trang hoặc một trang? http://jquerymobile.com/demos/1.0/docs/pages/index.html Lý do tôi hỏi là bạn đang ràng buộc với $ (tài liệu) thay vì trangId –

+0

Bố cục nhiều trang - phương thức "showProduct()" tải thông tin lên trang thứ 2, sau đó chuyển tiếp. – Jack

+0

Tôi tự hỏi vì bạn đang ràng buộc $ (tài liệu) nó được gọi nhiều lần, bạn có thể chỉ sử dụng pageId thay thế và kiểm tra không? –

Trả lời

6

Vì bạn đang liên kết với các $ (document) và sử dụng một cách bố trí nhiều trang

Tôi nghĩ jQM đang tải các tài liệu nhiều lần (Chỉ cần một linh cảm)

Chuyển sang sử dụng pageid thay vào đó, ví dụ:

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

để

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

Đối với tôi sự kiện không được kích hoạt khi chèn trangId bằng cách sử dụng v1.0 ... (cũng xem http://stackoverflow.com/questions/8793403/jquery-mobile-cant-bind-pagebeforechange-to-page- id) – Lincoln

+0

ràng buộc với pageId không kích hoạt sự kiện –

+0

@JihoKang nếu bạn đăng câu hỏi với một số mã bạn đang sử dụng, có lẽ sẽ dễ dàng hơn để giúp bạn theo cách này –

4

lẽ muộn một chút, nhưng đây là suy đoán có học vấn của tôi:

Bất kỳ sự kiện pagechange gây nên hai hiệu ứng chuyển tiếp, một "chuyển tiếp" (pagechange) và một "lạc hậu" (hashchange). Nếu bạn tiếp tục, hashChange bị chặn, nếu bạn lạc hậu, nó sẽ là một cách khác.

Xem mã nguồn jqm và kiểm tra thuộc tính ignoreNextHashChange.

Điều này có trách nhiệm chặn hashChange khi chuyển tiếp chuyển tiếp, nếu không bạn sẽ chuyển qua lại.

Tôi đoán chức năng của bạn đang kích hoạt hai lần vì cả hai sự kiện đều được kích hoạt từ bên trong changePage và hashChange.

Nếu đúng như vậy, JQM sẽ phải chặn hàm băm trước hashChange trước khi kích hoạt sự kiện này.

+0

Tôi đang cho bạn một điểm vì đây là lời khuyên hữu ích, nhưng tôi thực sự đã tìm ra vấn đề khá lâu rồi :-). Vấn đề đã phải làm preventDefault() không chạy trong khi vẫn tự gọi một thay đổi trang. Tôi đã có một phương pháp với một cuộc gọi AJAX trong nó ở trên preventDefault() và một lỗi với AJAX đã không được xử lý đúng cách và preventDefault() không bao giờ được gọi. Sai lầm ngớ ngẩn, nhưng nó khiến tôi phát điên sau khi nhìn chằm chằm vào nó trong 6 giờ. Thực sự chỉ cần một bộ mắt khác để cho tôi biết những gì tôi đã bỏ qua. Cảm ơn! – Jack

3

Nó được gọi hai lần theo thiết kế. http://api.jquerymobile.com/pagebeforechange/

nếu data.toPage được đặt thành chuỗi, sự kiện cho biết rằng điều hướng sắp bắt đầu.

nếu data.toPage được đặt thành đối tượng jQuery, sự kiện cho biết rằng trang đích đã được tải.

+0

Đọc câu hỏi. Mã được đăng hiển thị lọc trên (typeof data.toPage === "string"). Sự kiện được hiển thị để vượt qua điều kiện hai lần. Vấn đề này phức tạp hơn. – janoside

+0

đây là thông tin hữu ích cho những người không biết điều này, nhưng vì cách nó đã được phrased tôi sẽ không upvote nó trở lại bằng không –

-1

Nếu bạn đọc tài liệu di động jquery https://api.jquerymobile.com/pagebeforechange/, nó cho biết nó được gọi hai lần, sau khi data.toPage là url đến trang mới, dữ liệu thời gian thứ hai.toPage là đối tượng jquery của trang mới.

Các vấn đề liên quan