la fonction échoue jamais appelée si l'utilisateur refuse de partager la géolocalisation dans firefox
J'ai donc ce code javascript. Dans safari et chrome, si l'utilisateur refuse de partager la localisation, il va à l'échec de la fonction comme il se doit; toutefois, dans Firefox, il ne le fait pas.
Toute aide appréciée.
function initGeolocation()
{
if( navigator.geolocation )
{
//Call getCurrentPosition with success and failure callbacks
navigator.geolocation.getCurrentPosition( success, fail );
}
else
{
alert("Sorry, your browser does not support geolocation services.");
}
}
var map;
function success(position)
{
var longIDText = document.getElementById('longID');
var latIDText = document.getElementById('latID');
longIDText.value = position.coords.longitude;
latIDText.value = position.coords.latitude;
document.getElementById('coordSubmitID').click();
}
function fail(error)
{
alert("FAAAAAAAAAAIIIIIIIIIL")
var zip_code ;
while (true){
//Could not obtain location
zip_code = prompt("Please enter your current address or zip code","");
if ( zip_code == "" ) {
alert(zip_code +" is not a valid address. Please try again.");
}
else{
break;
}
}
var zipIDText = document.getElementById('zipID');
zipIDText.value = zip_code;
document.getElementById('coordSubmitID').click();
}
Vous devez vous connecter pour publier un commentaire.
Pour Firefox il semble que
PERMISSION_DENIED
est soulevée seulement si "Jamais" partager " est sélectionné; si la boîte de dialogue fermée, ou "Pas maintenant" est sélectionné, effectivement il ne se passe rien, même sur mozillas géolocalisation démo si vous fermez les autorisations de l'INTERFACE utilisateur, rien ne se passe.Cela signifie que
getCurrentPosition
peut renvoyer soit parce que l'utilisateur a fermé la confirmation de l'INTERFACE utilisateur, ou parce qu'il a lancé avec succès il demande asynchrone - il ne semble pas être un moyen de discrimination entre les deux.https://bugzilla.mozilla.org/show_bug.cgi?id=675533
C'est une vraie douleur, et certainement pas souhaitable de fonctionnalité.
La solution de contournement, je suis aide à économiser de l'utilisateur en attente pour jamais est de définir un délai d'attente de vérifier si l'attente spinner est, après 3 secondes, et, dans l'affirmative, de le cacher et de montrer un manuel zip code d'entrée:
Comme alexleonard souligné, la seule fiable, cross-browser solution que j'ai trouvé pour cela est d'avoir un
setTimeout()
de vérifier l'état de votrelatLng
objet/variables, comme letimeout
option degetCurrentPosition()
ne semble pas fonctionner de manière fiable. L'exemple ci-dessous a été testée dans IE11, Chrome33 et Firefox28.Pour une solution plus complète qui utilise jQuery promesse, consultez mon Résumé ici: https://gist.github.com/GFoley83/10092929
Exemple - tapez F12, collez-le dans la console et lancez
Ce n'est que par la conception et, apparemment, est un non-problème. Voir https://bugzilla.mozilla.org/show_bug.cgi?id=675533
Il est laissé aux développeurs d'utiliser la fonctionnalité à venir avec un navigateur spécifique à contourner pour Firefox.
De note, basée sur l'observation de la FF développeur sur la géolocalisation d'utilisation par les utilisateurs finaux, apparemment, les développeurs de Firefox sont la collecte de données détaillées sur ce que les utilisateurs finaux sont en train de faire avec leurs produits.
Noter que c'est en fait aussi un problème dans Chrome.
Dans google Chrome, un avis d'information s'affiche "site veut savoir votre position" - il propose ensuite "Autoriser" et "Refuser" options". Avec la conception de l'INTERFACE utilisateur, l'utilisateur est plus susceptibles de choisir d'Autoriser ou de Refuser, qui sera de retour une réponse au navigateur.la géolocalisation.getCurrentPosition fonction. Toutefois, l'utilisateur peut également cliquer sur un bouton "X" à l'extrême droite de l'avis. C'est essentiellement le même que de cliquer sur "Pas maintenant" dans Firefox.
Aucun résultat n'est retourné à la fonction.
Ressemble à une minuterie doit être mis en œuvre pour permettre ce résultat possible.
Utiliser une promesse. Je suis en utilisant angularjs qui a sa propre version de $q pour résoudre le même problème, nous sommes tous d'avoir.
Edit (après un downvote) 6-11-2013
Comme l'a remarqué en dessous de cette réponse, cela ne résout pas le problème lorsqu'un utilisateur refuse l'accès à l'emplacement. Pour le downvote est correct. Je garde la réponse ici, car le délai d'attente est soemthing on devrait de toute façon, et je ne le vois pas dans la réponse.
La fonction navigator.la géolocalisation.getCurrentPosition() a la possibilité d'envoyer le délai d'attente avec elle:
et quelques autres options, comme l'âge de la mise en cache de la position (maximumAge).
le délai d'attente et maximumage sont en millisecondes, donc 10000 = 10 secondes.
Par ailleurs, le délai d'expiration par défaut est infini... donc si vous ne définissez pas ce délai, il ne sera jamais appeler la fonction de rappel pour les erreurs....
donc dans l'option comme Jamie répondu, je dirais:
La seule solution à ce problème est comme suit:
J'espère que cela aide 🙂
Voici une solution à mon problème en utilisant la vanille es6
Promises
. Inspiré par @LeblancMeneses réponse.Handeld toutes mes erreurs 🙂
getCurrentPosition()
est asynchrone, donc tout ce que vous faites ici est la miselatlng
à57.718, 11.974
qui peut ou ne peut pas obtenir remplacée plus tard par le succès/échec/délai de rappels pourgetCurrentPosition()
.watchPosition et getCurrentPosition à la fois accepter une seconde de callback qui est appelée lorsqu'il y a une erreur. L'erreur de rappel fournit un argument en faveur d'une erreur de l'objet. Pour le refus d'une autorisation, d'erreur.code d'erreur.PERMISSION_DENIED (valeur numérique 1).
Lire la suite ici: https://developer.mozilla.org/en/Using_geolocation
Exemple:
});