Do site de documentos da API jQuery paraready
Todas as três sintaxes a seguir são equivalentes:
- $ (documento) .ready (manipulador)
- $ (). ready (handler) (isso não é recomendado)
- $ (manipulador)
Depois de fazer o dever de casa - ler e brincar com o código-fonte , não tenho ideia do por que
$().ready(handler)
não é recomendado. A primeira e a terceira maneiras são exatamente as mesmas, a terceira opção chama a função pronta em um objeto jQuery em cache com document
:
rootjQuery = jQuery(document);
...
...
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
Mas a função pronta não tem interação com o seletor dos elementos de nó selecionados, o ready
código-fonte:
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// Add the callback
readyList.add( fn );
return this;
},
Como você pode ver, ele apenas adiciona o retorno de chamada a uma fila interna ( readyList
) e não altera ou usa os elementos do conjunto. Isso permite que você chame a ready
função em cada objeto jQuery.
Gostar:
- seletor regular :
$('a').ready(handler)
DEMO - Seletor sem sentido :
$('fdhjhjkdafdsjkjriohfjdnfj').ready(handler)
DEMO - Seletor indefinido :
$().ready(handler)
DEMO
Finalmente ... à minha pergunta: Por que $().ready(handler)
não é recomendado?
javascript
jquery
callback
document-ready
gdoron está apoiando Monica
fonte
fonte
$.ready
por exemplo) e não requer a construção de um objeto jQuery em primeiro lugar..ready()
capacidade para elementos individuais, não deve haver razão para construir um objeto jQuery.$.ready
já é usado por uma função jQuery interna, procure o código-fonteready:
.Respostas:
Recebi uma resposta oficial de um dos desenvolvedores jQuery:
$().ready(fn)
só funciona porque$()
costumava ser um atalho para$(document)
(jQuery <1.4)Então
$().ready(fn)
era um código legível.Mas as pessoas costumavam fazer coisas assim
$().mouseover()
e todo tipo de loucura.e as pessoas tiveram que fazer
$([])
para obter um objeto jQuery vazioEntão, em 1.4 nós o mudamos para
$()
dar um jQuery vazio e nós apenas$().ready(fn)
trabalhamos para não quebrar muito código$().ready(fn)
agora é literalmente apenas corrigido no núcleo para fazê-lo funcionar corretamente para o caso legado.O melhor lugar para a
ready
função é$.ready(fn)
, mas é uma decisão de design muito antiga e é isso que temos agora.Eu perguntei a ele:
Sua resposta foi:
fonte
$()
em primeiro lugar (por mais bobo que esse comportamento possa ter sido) . Por outro lado, você está certo. Eles nem sempre estão inclinados a fazer alterações significativas, como foi mostrado quando tentaram alterar e.attr()
, em seguida, fizeram uma reversão rápida alguns dias depois. Isso os vinculou a algumas de suas infelizes decisões de design no início (e na meia-idade).$(selector[, context])
e também$(html[, ownerDocument])
. Na verdade, você também pode usar, emjQuery()
vez de$()
se o problema for ter que saber que funciona. Ou por que usar o jQuery?Uma vez que as diferentes opções fazem praticamente a mesma coisa que você apontou, é hora de colocar o chapéu do escritor da biblioteca e fazer algumas suposições.
Talvez o pessoal da jQuery gostaria de ter
$()
disponível para uso futuro (duvidoso, pois$().ready
está documentado para funcionar, mesmo que não seja recomendado; também poluiria a semântica de$
se fosse especial).Um motivo muito mais prático: a segunda versão é a única que não acaba embrulhando
document
, por isso é mais fácil quebrá-la na manutenção do código. Exemplo:Compare isso com
Relacionado ao acima:
ready
é uma aberração no sentido de que é (o único?) Método que funcionará da mesma forma, não importa o que o objeto jQuery envolve (mesmo que não envolva nada como é o caso aqui). Esta é uma grande diferença da semântica de outros métodos jQuery, portanto, confiar especificamente nisso é corretamente desencorajado.Atualização: Como o comentário de Esailija aponta, de uma perspectiva de engenharia
ready
deveria realmente ser um método estático exatamente porque funciona assim.Atualização # 2: Explorando a fonte, parece que em algum ponto no branch 1.4
$()
foi alterado para corresponder$([])
, enquanto no 1.3 ele se comportou como$(document)
. Essa mudança reforçaria as justificativas acima.fonte
$(document).ready( function(){ //your code here } );
selector = selector || document
paraif(!selector) return this
.Eu diria que é simplesmente o fato de que
$()
retorna um objeto vazio, ao passo$(document)
que não o faz sua aplicaçãoready()
a coisas diferentes; ainda funciona, mas eu diria que não é intuitivo.fonte
$()
.ready
porque é um idioma bem estabelecido não fazer isso. Claro, há uma chance teórica de alguém fazer isso, mas nunca vi um código fazendo isso (o que não é um bom argumento, mas você sabe: D).Mais do que provavelmente, este é apenas um bug de documentação e deve ser corrigido, a única desvantagem de usar
$().ready(handler)
é a sua legibilidade. Claro, argumente que isso$(handler)
é igualmente ilegível. Eu concordo, é por isso que não uso .Você também pode argumentar que um método é mais rápido do que outro. No entanto, com que frequência você chama esse método vezes suficientes em uma linha em uma única página para notar a diferença?
Em última análise, tudo se resume à preferência pessoal. Não há nenhuma desvantagem em usar
$().ready(handler)
outro argumento além da legibilidade. Eu acho que a documentação está levando mal neste caso.fonte
Só para deixar óbvio que há alguma inconsistência nos três, acrescentei a quarta forma frequentemente usada:
(function($) {}(jQuery));
Com esta marcação:
e este código:
Os resultados exibidos do div da última instrução são: 0: 9: 9: 9: indefinido
SO, apenas as versões Handler e Doc são consistentes com a convenção jQuery de retornar algo útil conforme eles obtêm o seletor de documentos e com o formulário Aprovado você deve retornar algo (eu não faria isso, eu acho, mas coloque apenas para mostrar "por dentro" tem algo).
Aqui está uma versão violenta disso para os curiosos: http://jsfiddle.net/az85G/
fonte
null
então.find('*').length
retorne 0 . Você acha algo ruim com esse comportamento (óbvio)?if(!selector) return this
se você der algo mais, háregex
e outras coisas acontecendo ... Obrigado por palavras gentis ... Acho que posso pedir à equipe jQuery para responda isso (inferno, não é minha biblioteca:-)
).jQuery(document).ready(function(){});
formulário em nossa base de código no momento, pois há diferentes níveis de experiência em jQuery e é "mais óbvio" para as pessoas novas que é uma função de manipulador de eventos para jQuery.Acho que isso é mais para facilitar a leitura do que qualquer outra coisa.
Este não é tão expressivo
Como
Talvez eles estejam tentando promover alguma forma de jQuery idiomática.
fonte
$(document).ready(handler)
é mais legível do$(handler)
que o recomendado ...