2013-04-03 9 views
23

Tôi đã sử dụng $ .mobile.changepage để thực hiện chuyển hướng trong các dự án điện thoại di động + jquerymobile của tôi. Tuy nhiên điều khiến tôi bối rối là tôi cần đặt kịch bản của tất cả các trang vào cùng một tệp index.html. Nếu không, trang chuyển hướng không thể thực thi hàm trong tiêu đề của nó.Tại sao tôi phải đặt tất cả tập lệnh vào index.html trong điện thoại di động jquery

ví dụ, index.html của tôi dường như $(document).bind("deviceready",function(){$.mobile.changepage("test.html");})

sau đó, điện thoại của tôi sẽ chuyển hướng đến test.html mà dường như là

$("#btnTest").click(function(){alert("123");}) 
<button id="btnTest">Test</button> 

Tuy nhiên, kịch bản sẽ không bao giờ thực hiện trong thử nghiệm .html. Sau đó, tôi đặt kịch bản vào index.html, những gì tôi mong đợi sẽ được thực hiện. Dù sao, nếu tôi đặt tất cả kịch bản vào cùng một trang, dự án sẽ trở nên khó khăn hơn và khó hơn để được bảo tồn. Đánh giá cao sự giúp đỡ của bạn.

Trả lời

57

Giới thiệu

Bài viết này cũng có thể được tìm thấy HERE như một phần của blog của tôi.

Làm thế nào jQuery Mobile xử lý trang thay đổi

Để hiểu tình trạng này bạn cần phải hiểu như thế nào jQuery Mobile hoạt động. Nó sử dụng ajax để tải các trang khác.

Trang đầu tiên được tải bình thường. Nó HEADBODY được nạp vào DOM, và họ đang có để chờ đợi những nội dung khác.Khi trang thứ hai được tải, chỉ nội dung BODY của bạn được tải vào DOM. Để chính xác hơn, ngay cả BODY chưa được tải đầy đủ. Chỉ div đầu tiên có thuộc tính data-role = "page" sẽ được tải, mọi thứ khác sẽ bị loại bỏ. Ngay cả khi bạn có nhiều trang hơn trong một số BODY chỉ trang đầu tiên sẽ được tải. Quy tắc này chỉ áp dụng cho các trang tiếp theo, nếu bạn có nhiều trang hơn trong một số HTML ban đầu, tất cả các trang sẽ được tải.

Đó là lý do tại sao nút của bạn hiển thị thành công nhưng sự kiện nhấp không hoạt động. Cùng một sự kiện nhấp chuột có phụ huynh HEAD bị bỏ qua trong quá trình chuyển đổi trang.

Dưới đây là một tài liệu chính thức: http://jquerymobile.com/demos/1.2.0/docs/pages/page-links.html

Đáng tiếc là bạn sẽ không tìm thấy điều này được mô tả trong tài liệu hướng dẫn của họ. Ether họ nghĩ rằng đây là một kiến ​​thức phổ biến hoặc họ quên để mô tả này giống như các chủ đề khác của tôi. (Tài liệu jQuery Mobile lớn nhưng thiếu nhiều thứ).

Giải pháp 1

Trong trang thứ hai của bạn, và tất cả các trang khác, di chuyển SCRIPT thẻ của bạn vào nội dung BODY, như thế này:

<body> 
    <div data-role="page"> 
     // And rest of your HTML content 
     <script> 
      // Your javascript will go here 
     </script> 
    </div> 
</body> 

Đây là một giải pháp nhanh chóng nhưng vẫn một cái xấu xí.

dụ làm việc có thể được tìm thấy trong câu trả lời khác của tôi ở đây: Pageshow not triggered after changepage

Một ví dụ làm việc: Page loaded differently with jQuery-mobile transition

Giải pháp 2

Move tất cả javascript của bạn vào HTML đầu tiên ban đầu. Thu thập mọi thứ và đặt nó bên trong một tệp js duy nhất, vào một số HEAD. Khởi tạo nó sau khi jQuery Mobile đã được tải.

<head> 
    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; minimum-scale=1.0; user-scalable=no; target-densityDpi=device-dpi"/> 
    <link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css" /> 
    <script src="http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>  
    <script src="index.js"></script> // Put your code into a new file 
</head> 

Cuối cùng, tôi sẽ mô tả lý do tại sao đây là một phần của giải pháp tốt.

Giải pháp 3

Sử dụng rel = "bên ngoài" tại các nút của bạn và tất cả các yếu tố mà bạn đang sử dụng để thay đổi trang. Bởi vì nó ajax sẽ không được sử dụng để tải trang và ứng dụng jQuery Mobile của bạn sẽ hoạt động như một ứng dụng web thông thường. Thật không may đây không phải là một giải pháp tốt trong trường hợp của bạn. Phonegap không bao giờ hoạt động như một ứng dụng web thông thường.

<a href="#second" class="ui-btn-right" rel="external">Next</a> 

tài liệu chính thức, tìm kiếm một chương: Linking without Ajax

giải pháp thực tế

giải pháp thực tế sẽ sử dụng Giải pháp 2. Nhưng không giống như giải pháp 2, tôi sẽ sử dụng cùng một tệp index.js đó và khởi tạo nó bên trong một HEAD của mọi trang khác có thể.

Bây giờ bạn có thể hỏi tôi TẠI SAO?

Phonegap như jQuery Mobile bị lỗi và sớm hay muộn sẽ có lỗi và ứng dụng của bạn sẽ không thành công (bao gồm DOM đã tải) nếu nội dung js của bạn nằm trong một tệp HTML. DOM có thể bị xóa và Phonegap sẽ làm mới trang hiện tại của bạn. Nếu trang đó không có javascript thì nó sẽ không hoạt động cho đến khi nó được khởi động lại.

Từ cuối cùng

Vấn đề này có thể dễ dàng được sửa với kiến ​​trúc trang tốt. Nếu có ai quan tâm, tôi đã viết ARTICLE về kiến ​​trúc trang jQuery Mobile tốt. Trong trình bao hạt, tôi đang thảo luận rằng kiến ​​thức về cách hoạt động của jQuery Mobile là điều quan trọng nhất bạn cần biết trước khi bạn có thể tạo thành công ứng dụng đầu tiên.

+0

câu trả lời khá hoàn hảo! Vì vậy, kết luận của chúng tôi là chúng tôi không thể tách từng tệp js thành từng trang? Điều đó làm cho ứng dụng của chúng tôi thực sự khó bảo tồn. Tôi sợ cho dù nó có nghĩa là một lỗi javascript sẽ làm cho toàn bộ ứng dụng xuống với JqueryMobile. –

+0

Trong giải pháp 1, có quá xấu khi bao gồm tệp tập lệnh bên ngoài không? – ogborstad

+0

Điều này chắc chắn không phải là một ý tưởng tồi, tôi thích có mọi thứ trong một tập tin bên ngoài. – Gajotres

1

Không giống như các trang HTML thông thường bình thường, jQuery Mobile sử dụng công nghệ ajax khi điều hướng giữa các trang. Vì vậy, hãy đảm bảo nhập tất cả các tệp JS và thư viện của bạn trong tất cả các trang html của bạn.

Nếu bạn nhận thấy chặt chẽ, bạn sẽ thấy rằng các tệp JS từ trang trước được xem xét khi tải trang thứ hai. Nhưng nếu bạn buộc rrefresh trang hiện tại thì các tệp js của trang hiện tại sẽ có hiệu lực.

Vì vậy, như tôi đã nói trước đó, hãy đảm bảo nhập tệp js trong tất cả các tệp html.

Cũng không cần phải gọi deviceready, sử dụng cú pháp sau để gọi trang của bạn js chức năng cụ thể

$(document).on('pageshow', '#YourPageID', function(){ 
    // Your code goes here 
}); 
1

Jquery Mobile sử dụng ajax để tải một "trang". Một "trang" ở đây là một div với data-role = page. Nếu bạn tải một index.html trang vật lý, bạn có thể điều hướng bằng cách sử dụng changePage đến bất kỳ div "trang" nào bên trong trang đó.

Tuy nhiên, nếu bạn muốn tải "trang" từ trang vật lý khác, jQM sẽ chỉ tải div "trang" đầu tiên từ trang đó. Điều thực sự xảy ra là bạn không thay đổi trang, jQM chỉ tải div "page" cụ thể đó bằng ajax và đưa nó vào trang hiện tại của bạn.

Bạn có hai kiến ​​trúc có thể có nơi bạn đặt tất cả "trang" của mình vào trang html và điều hướng từ đó. Hoặc bạn có thể có nhiều kiến ​​trúc trang. Bạn luôn có thể trộn nó.

Để thay đổi trang vật lý, bạn cần phải thêm rel = external vào liên kết của mình.