Das Wesentliche des Problems ist, dass Ihr Code, solange cordova.device nicht definiert ist, nicht sicher sein kann, ob Cordova festgestellt hat, dass Ihr Gerät nicht unterstützt wird, oder ob Cordova sich noch vorbereitet und deviceready später ausgelöst wird (oder dritte Option: Cordova wurde nicht richtig geladen).
Die einzige Lösung besteht darin, eine Wartezeit zu definieren und zu entscheiden, dass Ihr Code nach dieser Zeit davon ausgehen muss, dass das Gerät nicht unterstützt wird. Ich wünschte, Cordova würde irgendwo einen Parameter setzen, der besagt: "Wir haben versucht, ein unterstütztes Gerät zu finden und aufgegeben", aber es scheint, als gäbe es keinen solchen Parameter.
Sobald dies eingerichtet ist, möchten Sie möglicherweise genau in Situationen Situationen ausführen, in denen kein unterstütztes Gerät vorhanden ist. In meinem Fall wie das Verstecken von Links zum App-Markt des Geräts.
Ich habe diese Funktion zusammengestellt, die so ziemlich jede Situation abdecken sollte. Hier können Sie einen Geräte-Handler, einen Handler, der niemals bereit ist, und eine Wartezeit definieren.
//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
}
}
}
}
}