Суть проблемы заключается в том, что пока cordova.device не определен, ваш код не может быть уверен, что это потому, что cordova установила, что ваше устройство не поддерживается, или потому, что cordova все еще готовится, а deviceready сработает позже. (или третий вариант: кордова не загрузилась должным образом).
Единственное решение - определить период ожидания и решить, что после этого периода ваш код должен предполагать, что устройство не поддерживается. Я бы хотел, чтобы кордова установила параметр где-нибудь, чтобы сказать «Мы пытались найти поддерживаемое устройство, но отказались», но похоже, что такого параметра нет.
Как только это будет установлено, вы можете захотеть сделать что-то конкретное именно в тех ситуациях, когда нет поддерживаемого устройства. В моем случае вроде скрытия ссылок на магазин приложений устройства.
Я собрал по кусочкам эту функцию, которая должна охватывать практически любую ситуацию. Он позволяет вам определять обработчик готовности устройства, обработчик готовности устройства и время ожидания.
//Deals with the possibility that the code will run on a non-phoneGap supported
//device such as desktop browsers. Gives several options including waiting a while
//for cordova to load after all.
//In:
//onceReady (function) - performed as soon as deviceready fires
//patience
// (int) - time to wait before establishing that cordova will never load
// (boolean false) - don't wait: assume that deviceready will never fire
//neverReady
// (function) - performed once it's established deviceready will never fire
// (boolean true) - if deviceready will never fire, run onceReady anyhow
// (boolean false or undefined) - if deviceready will never fire, do nothing
function deviceReadyOrNot(onceReady,patience,neverReady){
if (!window.cordova){
console.log('Cordova was not loaded when it should have been')
if (typeof neverReady == "function"){neverReady();}
//If phoneGap script loaded...
} else {
//And device is ready by now...
if (cordova.device){
callback();
//...or it's loaded but device is not ready
} else {
//...we might run the callback after
if (typeof patience == "number"){
//Run the callback as soon as deviceready fires
document.addEventListener('deviceready.patience',function(){
if (typeof onceReady == "function"){onceReady();}
})
//Set a timeout to disable the listener
window.setTimeout(function(){
//If patience has run out, unbind the handler
$(document).unbind('deviceready.patience');
//If desired, manually run the callback right now
if (typeof neverReady == 'function'){neverReady();}
},patience);
//...or we might just do nothing
} else {
//Don't bind a deviceready handler: assume it will never happen
if (typeof neverReady == 'function'){neverReady();}
else if (neverReady === true){onceReady();}
else {
//Do nothing
}
}
}
}
}