C'est l'emplacement.protocole jamais invalide?
Je veux construire des URLs avec le même schéma (sans doute, "http" ou "https:") que la page qui a chargé le cours d'exécution JavaScript. Les navigateurs modernes soutien simplement en omettant le schéma (par exemple, src="//example.com/test.js"
), mais ce n'est pas entièrement compatible avec tous les navigateurs. (J'ai lu que IE 6 est le seul navigateur qui ne prend pas en charge, mais j'ai encore besoin de compatibilité avec cette version.)
La croix-navigateur façon de faire semble être de vérifier location.protocol
. Par exemple, Google Analytics utilise des:
('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + ...
Dans le cas de Google, ils ont voulu utiliser des domaines différents selon que la demande qui utilise le protocole SSL, de sorte que le motif de sens. Mais j'ai vu que d'autres utilisent le même modèle, même lorsque seul le protocole est différent:
('https:' == location.protocol ? 'https:' : 'http:') + "//example.com"
(Un exemple est dans le "Final Wufoo Extrait de" au http://css-tricks.com/thinking-async/.)
Je préfère utiliser ce plus simple expression à la place:
location.protocol + "//example.com"
Dois-je vraiment être préoccupé par la possibilité de location.protocol
prendre sur une valeur autre que "https:" ou de la "http:" quand mon code est utilisé sur les sites je ne les contrôle pas?
OriginalL'auteur Jamey Sharp | 2012-11-03
Vous devez vous connecter pour publier un commentaire.
Il sera toujours quelque chose, mais parfois il peut être réglé à une valeur qui n'est ni "http" ou "https". Les trois autres valeurs que vous avez le plus de chances de voir des
file:
(pour les fichiers HTML),about:
(pour iframe magie impliquantabout:blank
), et peut-êtreftp:
.file:
et peut-êtreftp:
à venir de temps en temps, je parie iframe magie est le cas le plus fréquent.Corriger-c'est exactement là que vous avez le plus de chances de le
about:
protocole.OriginalL'auteur duskwuff
Remarque: Ce n'est pas à proprement parler du document.emplacement.du protocole de retour étant valide ou pas, mais décrit une très difficile à repérer bug (vous pouvez remplacer le comportement de document.emplacement.protocole sans écrire de code javascript).
J'ai repoussé à une étrange en apparence cas où document.emplacement.protocole ne semble pas fonctionner comme il le devrait. Le site a un suivi-Javascript qui a utilisé le code suivant pour résoudre le protocole actuel:
Le site est en HTTPS, mais sur certaines pages, le protocole sera http à la place de l' https.
Après beaucoup de temps passé à Googler et l'examen de l'application de configuration de la pile, un développeur remarqué que les pages le protocole de résolution de problème se produit, ont un HTML avec l'attribut suivant:
Cela a provoqué le protocole de résolution à faire des siennes et de manière incorrecte en déduire que le protocole http au lieu de https (non, la forme n'a pas de protocole ni de il devrait avoir).
Parce que si il y a un formulaire avec le nom
location
, puisdocument.location
est l'élément de formulaire, qui n'a pas deprotocol
bien à tous. Ainsi,'https:' === document.location.protocol
est faux.Uese le bon
location
global à la place de la vieilledocument.location
. Les navigateurs toujours eu les deux, il n'y a pas de point à l'aide dedocument.location
.OriginalL'auteur heikkim
Pas particulièrement, mais là encore, il n'y a aucun mal dans votre approche (pré-pendantes quel que soit le protocole est) à la place. Google Analytics n'a probablement la détection autant parce qu'ils utilisent un autre hôte à autre chose.
OriginalL'auteur T.J. Crowder