Eu tenho um script que usa $(document).ready
, mas ele não usa mais nada do jQuery. Gostaria de aliviá-lo removendo a dependência do jQuery.
Como posso implementar minha própria $(document).ready
funcionalidade sem usar o jQuery? Eu sei que o uso window.onload
não será o mesmo, pois os window.onload
disparos depois que todas as imagens, quadros etc. foram carregados.
javascript
jquery
FlySwat
fonte
fonte
$(document).ready
, você pode resolver esse problema facilmente executando seu código na parte inferior da página e não na parte superior. O HTML5Boilerplate usa essa abordagem exata.Respostas:
Há uma substituição baseada em padrões,
DOMContentLoaded
suportada por mais de 98% dos navegadores , embora não o IE8:A função nativa do jQuery é muito mais complicada do que apenas window.onload, como mostrado abaixo.
fonte
Editar:
Aqui está um substituto viável para o jQuery pronto
Retirado de https://plainjs.com/javascript/events/running-code-when-the-document-is-ready-15/
Outra boa função domReady aqui retirada de https://stackoverflow.com/a/9899701/175071
Como a resposta aceita estava muito longe de ser completa, juntei uma função "pronta" como
jQuery.ready()
baseada na fonte jQuery 1.6.2:Como usar:
Não tenho certeza de quão funcional é esse código, mas funcionou bem com meus testes superficiais. Demorou um pouco, então espero que você e outras pessoas possam se beneficiar disso.
PS .: Sugiro compilá- lo.
Ou você pode usar http://dustindiaz.com/smallest-domready-ever :
ou a função nativa se você precisar apenas oferecer suporte aos novos navegadores (ao contrário do jQuery pronto, isso não será executado se você o adicionar após o carregamento da página)
fonte
Três opções:
script
for a última tag do corpo, o DOM estará pronto antes da execução da tag de scriptonreadystatechange
Fonte: MDN
DOMContentLoaded
Preocupado com os navegadores da idade da pedra: Vá para o código fonte do jQuery e use a
ready
função Nesse caso, você não está analisando + executando a biblioteca inteira, mas apenas uma parte muito pequena.fonte
Coloque seu
<script>/*JavaScript code*/</script>
direito antes da</body>
marca de fechamento .É certo que isso pode não servir aos propósitos de todos, pois exige a alteração do arquivo HTML em vez de apenas fazer algo no arquivo JavaScript a la
document.ready
, mas ainda assim ...fonte
</html>
etiqueta de fechamento ?html
tag deve conter apenashead
ebody
.Solução do pobre homem:
Exibir violino
Adicionado este, um pouco melhor, eu acho, próprio escopo e não recursivo
Exibir violino
fonte
setInterval
e remova a recursão completamente.Eu uso isso:
Nota: Isso provavelmente funciona apenas com navegadores mais recentes, especialmente estes: http://caniuse.com/#feat=domcontentloaded
fonte
Realmente, se você se preocupa apenas com o Internet Explorer 9+ , esse código seria suficiente para substituir
jQuery.ready
:Se você se preocupar com o Internet Explorer 6 e alguns navegadores realmente estranhos e raros, isso funcionará:
fonte
Esta pergunta foi feita há muito tempo. Para quem está apenas vendo essa pergunta, agora existe um site chamado "talvez você não precise do jquery", que detalha - por nível de suporte do IE necessário - toda a funcionalidade do jquery e fornece algumas bibliotecas alternativas e menores.
Script pronto para documentos do IE8 de acordo com você pode não precisar do jquery
fonte
'onreadystatechange'
é necessário, em vez dedocument.attachEvent('onload', fn);
Recentemente, eu estava usando isso para um site móvel. Esta é a versão simplificada de John Resig de "Pro JavaScript Techniques". Depende do addEvent.
fonte
Navegador cruzado (navegadores antigos também) e uma solução simples:
Mostrando alerta em jsfiddle
fonte
A resposta do jQuery foi bastante útil para mim. Com um pouco de refinação, atendeu bem às minhas necessidades. Espero que ajude mais alguém.
fonte
removeListener
será necessário chamar o documento como contexto, ou seja.removeListener.call(document, ...
Aqui está o menor trecho de código para testar o DOM pronto, que funciona em todos os navegadores (até o IE 8):
Veja esta resposta .
fonte
Basta adicionar isso na parte inferior da sua página HTML ...
Porque, documentos HTML são analisados de cima para baixo.
fonte
Vale a pena procurar em Rock Solid addEvent () e http://www.braksator.com/how-to-make-your-own-jquery .
Aqui está o código, caso o site seja desativado
fonte
Esse código entre navegadores chamará uma função assim que o DOM estiver pronto:
Veja como funciona:
domReady
chamada chama otoString
método da função para obter uma representação em seqüência da função que você passa e a envolve em uma expressão que chama imediatamente a função.domReady
cria um elemento de script com a expressão e o anexa aobody
documento.body
após o DOM estar pronto.Por exemplo, se você fizer isso
domReady(function(){alert();});
:, o seguinte será anexado aobody
elemento:Observe que isso funciona apenas para funções definidas pelo usuário. O seguinte não funcionará:
domReady(alert);
fonte
É ano 2020 e a
<script>
etiqueta temdefer
atributo.por exemplo:
especifica que o script é executado quando a página termina de analisar.
https://www.w3schools.com/tags/att_script_defer.asp
fonte
Que tal esta solução?
fonte
É sempre bom usar equivalentes JavaScript em comparação com o jQuery. Um dos motivos é a dependência de menos uma biblioteca e eles são muito mais rápidos que os equivalentes do jQuery.
Uma referência fantástica para os equivalentes do jQuery é http://youmightnotneedjquery.com/ .
No que diz respeito à sua pergunta, peguei o código abaixo no link acima :) Apenas uma ressalva é que ele funciona apenas com o Internet Explorer 9 e posterior.
fonte
O mínimo e 100% de trabalho
Eu escolhi a resposta do PlainJS e está funcionando bem para mim. Ele se estende
DOMContentLoaded
para que possa ser aceito em todos os navegadores.Esta função é equivalente ao
$(document).ready()
método jQuery :No entanto, ao contrário do jQuery, esse código será executado corretamente apenas em navegadores modernos (IE> 8) e não será, caso o documento já seja renderizado no momento em que esse script é inserido (por exemplo, via Ajax). Portanto, precisamos estender um pouco isso:
Isso cobre basicamente todas as possibilidades e é um substituto viável para o auxiliar do jQuery.
fonte
Encontramos uma implementação rápida e suja em vários navegadores, que pode fazer o truque para os casos mais simples com uma implementação mínima:
fonte
doc.body
?As soluções setTimeout / setInterval apresentadas aqui funcionarão apenas em circunstâncias específicas.
O problema aparece especialmente nas versões mais antigas do Internet Explorer até 8.
As variáveis que afetam o sucesso dessas soluções setTimeout / setInterval são:
o código original (Javascript nativo) que resolve esse problema específico está aqui:
este é o código a partir do qual a equipe do jQuery criou sua implementação.
fonte
Aqui está o que eu uso, é rápido e cobre todas as bases, eu acho; funciona para tudo, exceto IE <9.
Isso parece pegar todos os casos:
O evento DOMContentLoaded está disponível no IE9 e em todo o resto, então eu pessoalmente acho que é bom usar isso. Reescreva a declaração da função de seta para uma função anônima regular, se você não estiver transpilando seu código do ES2015 para o ES5.
Se você quiser esperar até que todos os ativos sejam carregados, todas as imagens exibidas etc, use window.onload.
fonte
Se você não precisa oferecer suporte a navegadores muito antigos, aqui está uma maneira de fazê-lo, mesmo quando seu script externo é carregado com o atributo async :
fonte
Para o IE9 +:
fonte
Se você estiver carregando o jQuery perto da parte inferior do BODY, mas estiver tendo problemas com o código que grava o jQuery (<func>) ou jQuery (document) .ready (<func>), consulte o jqShim no Github.
Em vez de recriar sua própria função pronta para documento, ela simplesmente mantém as funções até que o jQuery esteja disponível e prossiga com o jQuery conforme o esperado. O objetivo de mover o jQuery para a parte inferior do corpo é acelerar o carregamento da página, e você ainda pode realizá-lo incluindo o jqShim.min.js na cabeça do seu modelo.
Acabei escrevendo esse código para mover todos os scripts do WordPress para o rodapé, e agora esse código de shim fica diretamente no cabeçalho.
fonte
Tente o seguinte:
fonte
onDocReady fornece um retorno de chamada quando o dom HTML está pronto para acessar / analisar / manipular completamente.
onWinLoad fornece um retorno de chamada quando tudo foi carregado (imagens etc.)
fonte
fonte
A maioria das funções vanilla JS Ready NÃO considera o cenário em que o
DOMContentLoaded
manipulador é definido após o documento já estar carregado - o que significa que a função nunca será executada . Isso pode acontecer se você procurarDOMContentLoaded
dentro de umasync
script externo (<script async src="file.js"></script>
).O código abaixo verifica
DOMContentLoaded
apenas se o documentoreadyState
ainda não éinteractive
oucomplete
.Se você deseja oferecer suporte ao IE também:
fonte
Eu simplesmente uso:
E, diferentemente
document.addEventListener("DOMContentLoaded" //etc
da resposta mais importante, funciona desde o IE9 - http://caniuse.com/#search=DOMContentLoaded indica apenas recentemente no IE11.Curiosamente, me deparei com esta
setTimeout
solução em 2009: está verificando a disponibilidade do excesso de DOM? , que provavelmente poderia ter sido redigido um pouco melhor, pois eu quis dizer "é um exagero usar as abordagens mais complicadas de várias estruturas para verificar a disponibilidade do DOM".Minha melhor explicação para por que essa técnica funciona é que, quando o script com um setTimeout é atingido, o DOM está sendo analisado, portanto a execução do código no setTimeout é adiada até que a operação seja concluída.
fonte