Phonegap deviceready не стреляет с помощью Cordova 2.2.0 в iOS
Я создаю приложение PhoneGap. К сожалению, при развертывании на устройствах iOS и симуляторах deviceready
событие никогда не срабатывает. Я использую Phonegap 2.2.0.
когда я развертываю тот же код на Android (используя Android-specific cordova.js
файл, конечно) приложение будет работать отлично.
когда я заменить deviceready
с jQuery -ready()
приложение также будет загружаться на iOS, но тогда у него не будет доступа к API-интерфейсам устройства.
на cordova.js
is загружен, поскольку я увижу простое предупреждающее сообщение, которое я положил внутри него, но deviceready
никогда не срабатывает, и API никогда не подвергаются воздействию.
Мои HTMLs head
:
<script type="text/javascript" charset="utf-8" src="js/cordova.js"></script> <!-- yes it is the iOS version -->
<script src="js/jquery-1.8.2.min.js"></script>
<script src="js/app.js"></script>
мой JS:
function doStuff(){
//app functionality
}
document.addEventListener('deviceready', doStuff, false);
но как-то все будет сделано только на Android...
5 ответов
в моем html у меня есть onload, который запускает добавление прослушивателя событий в deviceready
function onDeviceReady() {
console.log("we are an app");
MyApp.initialize_phonegap();
}
function onBodyLoad() {
document.addEventListener("deviceready", onDeviceReady, false);
}
</script>
</head>
<body onload="onBodyLoad()">
чтобы добавить к ответу olore, я в конечном итоге использовал подход, который код в проекте по умолчанию (который строится из ./create
скрипт) использует (который отличается от кода в событие документы).
основные различия (я действительно не знаю, какой из них на самом деле следует принимать во внимание):
-
cordova-2.2.0.js
находится в корневой папке -
<script>
s включены прямо перед закрытием</body>
- tag, а не в документеhead
-
deviceready
-разгрузочных работ, как:var app = { // Application Constructor initialize: function() { this.bindEvents(); }, // Bind Event Listeners // // Bind any events that are required on startup. Common events are: // 'load', 'deviceready', 'offline', and 'online'. bindEvents: function() { document.addEventListener('deviceready', this.onDeviceReady, false); }, // deviceready Event Handler // // The scope of 'this' is the event. In order to call the 'receivedEvent' // function, we must explicity call 'app.receivedEvent(...);' onDeviceReady: function() { app.receivedEvent('deviceready'); myApp.start(); //this is where I put the call to my App's functionality relying on device APIs }, // Update DOM on a Received Event receivedEvent: function(id) { // I didn't really use this, yet I left it in here as it's in the demo var parentElement = document.getElementById(id); var listeningElement = parentElement.querySelector('.listening'); var receivedElement = parentElement.querySelector('.received'); listeningElement.setAttribute('style', 'display:none;'); receivedElement.setAttribute('style', 'display:block;'); console.log('Received Event: ' + id); } };
последние
<script>
тег просто называетapp.initialize()
это, кажется, работает довольно хорошо на iOS и Android и немного более понятно для меня, чем двойной обработчик вложенности из документов.
Кажется, что это имеет значение, если вы добавляете функция deviceready сработала слушатель до или после на Кордова.js:
Я не смог найти никакой документации по этому вопросу, но Кордова.js перехватывает вызовы addEventListener + removeEventListener и вызывает только deviceready обратные вызовы, которые были добавлены до Кордова.js.
решение в моем случае было просто переставить скрипт порядок:
<script>
document.addEventListener('deviceready', ...)
</script>
<script src="cordova.js"></script>
Я обнаружил, что если вы случайно включите Кордова.сценарий js дважды, затем событие deviceready не запускается.
у меня была та же проблема. Я получил его для работы, добавив плагин устройства.
$ cordova plugin add org.apache.cordova.device
проверка:
$ cordova plugin ls