desenv-web-rp.com

Por que você usaria document.location.protocol em vez de urls simples / com prefixo?

Por exemplo, o Google Analytics usa document.location.protocol no padrão para rastreamento:

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.Push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.Push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

ao invés de

<script type="text/javascript">

  var _gaq = _gaq || [];
  _gaq.Push(['_setAccount', 'UA-XXXXX-X']);
  _gaq.Push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = '//www.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

O ssl. subdomínio é um argumento mudo, pois https://www.google-analytics.com/ga.js funciona perfeitamente bem.

Conhecer o Google provavelmente não é um descuido. Há algum problema com certos navegadores que não suportam o protocolo // que honra a abreviação ou há algo mais que estou faltando?

EDIT: Isso não se aplica apenas ao Google Analytics (exemplo de subdomínio diferente). O mesmo aparece na página da API do carregador de fontes :

wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
    '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
11
Metalshark

De fato, não foi uma supervisão da Equipe GA!
O carregador GA carrega um script, para que não seja afetado pelo bug de download duplo em um <link> ou @import para uma folha de estilo no IE7/IE8.

Eles usam o operador condicional (ternário) em document.location.protocol devido a um bug do Edge-case no IE6 que faz com que um diálogo de segurança apareça sob certas configurações de segurança quando solicita ao não subdomínio -'ssl ',
IE6 security security-dialog image, source: http://paulirish.com/i/7b01.png
, conforme explicado por Paul Irish (que trabalhou em conjunto com o desenvolvedor líder de javascript do Google Analytics sobre esse assunto) em seu blog: https://www.paulirish.com/2010/the-protocol-relative -url / , da qual cito abaixo:

01.01.2011: Mas ... e quanto a sando isso no snippet do Google Analytics ?
Sim, claro, isso não seria legal ... Então, trabalhei com o desenvolvedor líder de javascript do Google Analytics (Deus, adoro trabalhar no google) para ver se poderíamos fazer isso ... acontece que não podemos. Há um bug do edgecase no IE6 que faz com que uma caixa de diálogo seja explodida ... sob algumas configurações de segurança (sem saber se elas são padrão) ao solicitar o subdomínio não 'ssl'. captura de tela aqui . Portanto, sinta-se à vontade para remover 40 bytes do seu snippet GA se você não se importa com o IE6 .. caso contrário, precisará desse operador ternário. `:)`
24.12.2011. Eric Law (da equipe IE) fala por que o IE6 não joga bem GA ...
O motivo para isso não funcionar no IE6 é que o servidor está usando o SNI para deduzir qual certificado retornar. XP (e, portanto, o IE6) não suporta SNI na pilha HTTPS. Veja para detalhes .
3
GitaarLAB

Há pelo menos um problema em IE porque causa downloads duplos: http://www.stevesouders.com/blog/2010/02/10/5/5missmiss-schema-double-download /

4
AlfonsoML

Você já apontou a diferença no caso do Google Analytics, a saber, que a versão segura está em https://ssl. em vez de http://www.. Embora uma versão segura do www possa funcionar, também pode ser diferente da versão ssl:

  • Certificados diferentes para a versão ssl e a versão www.
  • Código diferente em cada versão.
  • Conjunto de cookies diferentes, específico para o domínio SSL.

Não sei se algum deles se aplica ao Google. À primeira vista, o código parecia o mesmo.

1
DisgruntledGoat

//www.google-analytics.com/ga.js não é um URL por seu padrão, pois não possui o esquema, que é obrigatório. Ele funciona e é usado, mas permanece não conforme com o padrão de URL.

Veja RFC3986 §3:

Os componentes do esquema e caminho são necessários, embora o caminho possa estar vazio (sem caracteres). Quando a autoridade está presente, o caminho deve estar vazio ou começar com um caractere de barra ("/"). Quando a autoridade não está presente, o caminho não pode começar com dois caracteres de barra ("//").

0
Patrick Mevzek

Este estouro de pilha resposta faz alguns pontos positivos.

Seria importante especificar explicitamente o protocolo para que o ativo de destino seja carregado corretamente em um documento aberto a partir de uma unidade local (file:) ou ao usar "iframe magic" (about:).

0
Andrew Ashbacher