Как запустить событие deviceready в браузере Chrome (попытка отладки проекта phonegap)
Я разрабатываю приложение PhoneGap, и я хотел бы иметь возможность отлаживать его в Chrome, а не на телефоне. Однако я инициализирую свой код в функции onDeviceReady(), которая срабатывает, когда PhoneGap запускает событие "deviceready". Поскольку Chrome не запускает это событие, мой код никогда не инициализируется.
Вот урезанная версия моего кода:
var dashboard = {};
$(document).ready(function() {
document.addEventListener("deviceready", dashboard.onDeviceReady, false);
});
dashboard.onDeviceReady = function() {
alert("hello!"); //this is never fired in Chrome
};
Я пробовал использовать StopGap код, который в основном просто делает следующее:
var e = document.createEvent('Events');
e.initEvent("deviceready");
document.dispatchEvent(e);
Но когда я запускаю этот код в консоли javascript Chrome, предупреждение "привет" все равно не запускается. Что я делаю не так? Или хром просто не поддерживает запуск "обычных" событий, таких как deviceready?
Ответы
Ответ 1
Добавьте этот код в свою функцию обработчика onLoad:
if (navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/)) {
document.addEventListener("deviceready", onDeviceReady, false);
} else {
onDeviceReady();
}
Событие "deviceready" запускается в cordova.js, поэтому я не знаю способа обнаружить существование этого события в коде приложения.
Ответ 2
Закончено вытащить код StopGap и ввести небольшую задержку (этот код работает в отдельном script, чем код, специфичный для страницы):
window.setTimeout(function() {
var e = document.createEvent('Events');
e.initEvent("deviceready", true, false);
document.dispatchEvent(e);
}, 50);
Ответ 3
Используйте Мобильный эмулятор Ripple. Это бесплатно в Интернет-магазине Chrome. Когда он будет установлен, перейдите к странице, на которой вы хотите ее протестировать, щелкните правой кнопкой мыши на странице и выберите Ripple Mobile Emulator > Enable. При появлении запроса выберите PhoneGap.
Эмулятор хорош, но он все еще в бета-версии, но не все еще реализовано.
Ad @м
Ответ 4
Я использую Safari для отладки и делаю это:
//my standard PG device ready
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
//debug("onDeviceReady")
getDefaultPageSetup();
}
//then add this (for safari
window.onload = function () {
if(! window.device)
onDeviceReady()
}
Ответ 5
Для моего мобильного сайта и мобильного приложения я использую следующий код с jQuery:
function init() { ... };
if ("cordova" in window) {
$(document).on("deviceready", init);
} else {
$(init);
}
Ответ 6
user318696 имел волшебство, которое я искал. "устройство" определено в кордове и не определяется в браузере (не-phoneGap app wrapper).
Редакция:
Я столкнулся с сценарием, когда Кордове потребовалось довольно много времени для инициализации устройства, и "оригинальный" ответ здесь больше недействителен. Я перешел к требованию параметра URL-адреса при запуске тестов в браузере. (в примере, который я ищу "testing =" в URL исходной страницы)
$(document).ready(function () {
// ALWAYS LISTEN
document.addEventListener("deviceready", main, false);
// WEB BROWSER
var url = window.location.href;
if ( url.indexOf("testing=") > -1 ) {
setTimeout(main, 500);
}
});
ОРИГИНАЛ:
Я не вырыл достаточно глубоко, чтобы узнать, как долго доверять этому (могли ли они начать определять "устройство" в браузере в будущей версии?] Но, по крайней мере, до 2.6.0 это безопасно:
$(document).ready(function () {
// call main from Cordova
if ( window.device ) {
document.addEventListener("deviceready", main, false);
}
// from browser
else {
main();
}
});
Ответ 7
user318696 обнаружение window.device работает хорошо. Если вы используете Kendo UI Mobile и PhoneGap, следующий script включит функции как в сборках PhoneGap, так и в веб-браузерах. Это основано на Burke Holland PhoneGap Build Bootstrap Project для Kendo UI Mobile и предназначен для размещения в нижней части страницы перед тегом закрывающего тега.
<script type="text/javascript">
var tkj = tkj || {};
tkj.run = (function () {
// create the Kendo UI Mobile application
tkj.app = new kendo.mobile.Application(document.body);
});
// this is called when the intial view shows. it prevents the flash of unstyled content (FOUC)
tkj.show = (function () {
$(document.body).show();
});
(function () {
if (!window.device) {
//initialize immediately for web browsers
tkj.run();
}
else if (navigator.userAgent.indexOf('Browzr') > -1) {
// blackberry
setTimeout(tkj.run, 250)
} else {
// attach to deviceready event, which is fired when phonegap is all good to go.
document.addEventListener('deviceready', tkj.run, false);
}
})();
</script>
Ответ 8
Усиление предложения химика. В следующем коде используется строка navigator.userAgent для общего определения, находится ли клиентский браузер на мобильной платформе.
Цель разделения от настольных браузеров - разрешить проверку кода перед компиляцией/установкой android apk и т.д. Гораздо быстрее сделать быстрое изменение кода, обновить настольный браузер и компиляцию в eclipse и загрузку на Android. Еще один дополнительный бонус - возможность использовать weinre на одной вкладке и index.html из активов android на другой вкладке (и использовать firebug).
PS: код weinre исключается, так как он имеет мою личную информацию VPS и UUID.
ТНХ!
<!-- Framework:jQuery -->
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.2, minimum-scale=1.0, maximum-scale=3.0, user-scalable=yes" >
<link href="./framework/jquery/mobile/1.2.0/jquery.mobile-1.2.0.min.css" type="text/css" media="screen" rel="stylesheet" title="JQuery Mobile">
<script src="./framework/jquery/jquery-1.8.2.min.js"></script>
<script src="./framework/jquery/mobile/1.2.0/jquery.mobile-1.2.0.min.js"></script>
<!-- Framework:Weinre -->
<!-- Framework:PhoneGap -->
<script src="./framework/phonegap/cordova-2.0.0.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript" charset="utf-8">
var mobile = false;
if (navigator.userAgent.match(/(iPhone|iPod|iPad|Android|BlackBerry)/)) {
document.addEventListener("deviceready", function(){mobile = true; onDeviceReady();}, false);
} else {
$(document).ready(onDeviceReady);
}
function onDeviceReady() {
setEvents();
test();
if (mobile) {
navigator.notification.alert("Debugging-ready for\n" + navigator.userAgent);
} else {
alert("Debugging-ready for\n" + navigator.userAgent);
}
};
</script>
Ответ 9
Вы моделируете такие события:
const simulateEvent = (eventName, attrs = {customData:"data"}, time = 1000, target = document) => {
let event = new CustomEvent(eventName, { detail: attrs });
setTimeout(() => {
target.dispatchEvent(event);
}, time);
};
var divReady = document.querySelector('div#ready');
document.addEventListener('deviceready', (e) => {
console.log("triggered with:", e.detail);
divReady.innerHTML = `Ready! ${JSON.stringify(e.detail)}`;
});
simulateEvent('deviceready', {customData:"My custom data goes in event.detail"});
<div id="ready"> Wait for ready... </div>