Cuối cùng tôi đã làm việc đó mà không cần sử dụng bất kỳ thư viện bên ngoài nào.
CÁC VẤN ĐỀ
Đối với một dự án PhoneGap đa nền, hai là các phần khác nhau từ một nền tảng khác:
- Dự án Encapsulating
- File javacript PhoneGap.
Các dự án đóng gói này thường không thay đổi nhiều trong quá trình của dự án. Nó sẽ là mong muốn để có một mã HTML đơn mà người ta có thể trực tiếp dán (hoặc sử dụng các kịch bản xây dựng) vào các dự án dựa trên nền tảng. Vì thư viện javascript phonegap nằm bên trong tập hợp các tập tin web, nên thật sự rất khó để thay thế đúng tập tin mỗi lần.
GIẢI PHÁP CỦA TÔI
Trong dự án của tôi, tôi có một vài file cordova, một cho mỗi nền tảng mục tiêu:
- cordova.android.js
- cordova.ios.js
- cordoba.bb .js ...
(Lưu ý cách mọi tệp này được bao gồm trong ap p ngay cả khi nó không được sử dụng. Đối với tôi nó không phải là một vấn đề, kể từ khi các kịch bản được gói trong ứng dụng và chỉ có một cho nền tảng chính xác được nạp vào bộ nhớ).
Trong trang của tôi, thay vì một thẻ script cho PhoneGap, tôi đặt các module loader:
<script src="phonegap-loader.js"></script>
Và đây sẽ là kịch bản PhoneGap-loader.js. Tôi sử dụng tính năng phát hiện tác nhân người dùng để tải động và đồng bộ tập lệnh:
(function(){
var useragent = navigator.userAgent;
if(/Android/i.test(useragent)){
loadScript('cordova.android.js');
} else if((/iPhone/i.test(useragent)) || (/iPad/i.test(useragent))){
loadScript('cordova.ios.js');
}
...
// Else desktop browser is assumed and no phonegap js is loaded
function loadScript(url){
// synchronous load by @Sean Kinsey
// https://stackoverflow.com/a/2880147/813951
var xhrObj = new XMLHttpRequest();
xhrObj.open('GET', url, false);
xhrObj.send('');
var se = document.createElement('script');
se.text = xhrObj.responseText;
document.getElementsByTagName('head')[0].appendChild(se);
}
})();
Điều quan trọng là tải tập lệnh SYNCHRONOUSLY. Điều này đã cho tôi vô số đau đầu. Trước khi nhận ra điều này, tôi đã thử thêm các thẻ script ở cuối đầu và sử dụng $ .getScript, nhưng không có thẻ nào hoạt động, vì ondeviceReady
không được kích hoạt. Có vẻ như cách tiếp cận hợp lệ duy nhất để đảm bảo tập lệnh Phonegap được thực hiện khi được nạp động là hình được hiển thị trong số amazing answer by @Sean Kinsey này (tất cả các kudo cho anh ta).
Hạn chế duy nhất là tập lệnh được gạch chân, nhưng đối với tôi là một mức giá rẻ để trả tiền để ứng dụng HTML5 cốt lõi cuối cùng bị cô lập khỏi các vùng chứa.
cuộc gọi addEventListener phải ở trong cuộc gọi lại của bạn với cảnh báo –
@Joseph - Tôi không nghĩ điều đó nên tạo sự khác biệt ... (đã thử và không) – Max
@Max bạn đã tìm thấy giải pháp nào chưa, tôi có vấn đề tương tự. Tôi đã thử tải phonegap với Yabble, RequireJS, LABjs và với javascript đơn giản nhưng nó không hoạt động – dhaval