Para que é " var gaq = gaq | | [];"?
o código de rastreamento Async no Google Analytics parece-se com isto:
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);
})();
Sobre a primeira linha:
var _gaq = _gaq || [];
acho que garante que, se _gaq
já está definido, devemos usá-lo caso contrário, devemos usar um array.
também, importa se _gaq
for renomeado? Em outras palavras, o Google Analytics depende de um objeto global chamado _gaq
?
7 answers
_gaq
é definido, para que _gaq.push()
nunca falhe.
Eu não mexeria com o nome das variáveis no código do GA... tens alguma razão para isso? Entra em conflito com alguma das tuas variáveis? (Então eu mudaria a minha...)
Esta linha existe para permitir vários excertos GA na mesma página. Garante que o segundo trecho não sobrepõe um _gaq definido pelo primeiro.
O rastreamento assíncrono funciona definindo primeiro o _gaq como um array. Esta lista funciona como uma fila, que lhe permite carregar (anexar) a configuração e seguir os "comandos" (como _trackPageview) para o fim da fila. Seus comandos são armazenados neste array até ga.o js descarrega tudo.Quando o ga.o js está pronto. executa todos os comandos na lista _gaq e substitui o _gaq por um objecto. Este objeto também tem um método de push, mas em vez de fazer fila de comandos, executa-os imediatamente, porque ga.js está disponível para processá-los.
Este mecanismo permite-lhe criar comandos de configuração e seguimento sem saber se o navegador terminou de transferir o ga.js. Isto é necessário porque o async snippet downloads ga.js sem bloquear outro código na página de correr. As coisas iriam ficar cabeludo se esse outro código (os seus comandos de configuração) necessitasse de saber o estado de ga.js a ser baixado.
Tudo isto depende absolutamente do uso do nome _gaq. Não devias tentar dar-lhe um nome se queres que o rastreamento assíncrono funcione.
Usar ||
Em atribuição é um truque de programação comum que tira vantagem da direção de avaliação do operador, que é da esquerda para a direita. Isso significa que avalia o lado esquerdo primeiro. Então, e somente se isso for Falso (ou um falso equivalente), ele avalia o lado direito.
Você também pode tirar proveito dos operadores ||
ou &&
numa simples declaração if, de modo que
if (a > 5) {
do_a();
}
if (!some_boolean) {
do_b();
}
Torna-se
a > 5 && do_a();
some_boolean || do_b(); // Note that the negation operator `!` is gone!
Que são muito mais bonitas de se ver em.
A razão pela qual as línguas permitem isso, é porque é uma perda de tempo avaliando o lado direito se o lado esquerdo vai fazer toda a linha falhar de qualquer maneira. Por isso ignora-a a não ser que seja necessária.
Editar:
Vou adicionar mais detalhes
_gaq é simplesmente um array de javascript, como definido pela primeira vez. você adiciona eventos a ele, como rastreamento de eventos callbacks
Quando o ga.o script js é carregado, no entanto, o google pega esse array e o transforma em um objeto, que o ga USA.
É por isso que introduz funções na matriz _gaq e depois liga para a ga.o programa js depois de si;terminou de novo a construção da lista.
O Gaq é a fila do Google analytics. é uma pilha para métodos GA, como rastreamento de eventos, atribuição de páginas, etc. você usa o método push() para colocar coisas GA lá. reduz a interferência do evento, todos devem fazer isso, ou pelo menos aprender o conceito.
Primeiro, já foi explicado, mas a resposta tem de ser completa, por isso eu explico também, o código começa por:
var _gaq = _gaq || [];
Garante que o _gaq está definido. Se não estiver definido, é inicializado para um array vazio.
Pensa como o equivalente:
var _gaq;
/* ... */
if(!_gaq)
_gaq = [];
O valor de javascript undefined
é "falsish" / "falsy", ou seja, ele avalia como falso quando convertido para um booleano, então _gaq é inicializado com []
neste caso.
O que importa é que:
- se _gaq contém um array nesta fase, _gaq é "verdadeiro", por isso vai manter o seu valor (e não ser esvaziado)
- se _gaq contém outro tipo de objecto nesta fase, _gaq também pode manter o seu valor
_gaq.push(['command', 'argument']); // is very interesting too
Se o _gaq for um array, todos vocês irão adivinhar que o item ['command', 'argument']
é adicionado ao array. O Google analytics armazena isso em sua fila para posterior processamento. O array _gaq é usado como uma fila.
Mas a parte realmente interessante é que _gaq.push(/*...*/)
pode ser feito sem ter um array chamado _gaq. É apenas uma chamada de método, e não arrays também pode ter um " push
" metodo.
- desde que o ficheiro javascript externo não seja carregado assíncronamente, _gaq é um array usado como uma fila.
- the external ga.js então processa a fila.
- ga.js então substitui _gaq por um objeto que fornece um método de push.
- uma vez que o _gaq é substituído por um objecto, os comandos {[[7]} não precisam mais de ser adiados, podem ser executados.
Para aqueles que falhou a parte de carregamento de script assíncrono, é:
(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);
})();
Usar temporariamente um array como uma fila e o método de push é um óptimo código. É uma maneira muito interessante de lidar com o fato de que quando _gaq.push(/*...*/)
é executado, nós nem sempre agora se a dependência foi assíncronamente carregada ainda ou não.
ga(/*...*/)
parece ainda mais intuitivo para chamadas que _gaq.push(/*...*/)
, mas continua a lidar com as alegrias relacionadas com o carregamento de dependências de uma forma assíncrona.
Alguém pode explicar para que é isto?([14]) espero que a minha resposta acima o tenha feito. O que eu queria compartilhar aqui é que a primeira linha é feita de uma forma particular para se encaixar com a coisa toda: inicialização que nunca prejudica se feita duas vezes, uso inteligente do método push...
Sim. faz, quando usa este ga.excerto de js.O Google Analytics depende de um objecto global chamado _gaq?
if(!_gaq){ var _gaq = [] }
Isto significa que se o _gaq já estiver definido, use o que for, declara um array vazio. Com o push você pode anular as configurações. Se o objeto _gaq não foi definido as 2 "linhas" depois disso resultaria em um erro.
SIM o objecto _gaq é esperado no script que você inclui no código ali (ga.js).