Суть проблеми полягає в тому, що, поки cordova.device не визначено, ваш код не може бути впевнений, чи це тому, що cordova встановила, що ваш пристрій не підтримується, або якщо це тому, що cordova все ще готується і пристрій вже запуститься пізніше (або третій варіант: кордова неправильно завантажується).
Єдине рішення - визначити період очікування та вирішити, що після цього періоду ваш код повинен вважати, що пристрій не підтримується. Я хотів би, щоб cordova десь встановив параметр, щоб сказати "Ми намагалися знайти підтримуваний пристрій і відмовилися", але, схоже, такого параметра немає.
Після того, як це буде встановлено, ви можете зробити щось конкретне саме в тих ситуаціях, коли немає підтримуваного пристрою. Як і приховування посилань на ринок додатків пристрою, в моєму випадку.
Я склав разом цю функцію, яка майже повинна охоплювати кожну ситуацію. Це дозволяє визначити обробник пристрою, пристрій, який не буде готовий, і час очікування.
//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
}
}
}
}
}