Pergunta

Estou desenvolvendo uma plataforma para desenvolver aplicativos de desktop com tecnologias da Web. Ao fazer isso, tenho tentado obter alguma funcionalidade de documento/pronto para trabalhar com o navegador que irei integrar na plataforma. É por isso que eu já havia feito essa pergunta aqui em So: JavaScript-framework-that-primariamente provide-apenas-documental-funionalidade

No entanto, não consegui obter meu navegador de escolha (Shush, é um segredo;) utilizar com sucesso a funcionalidade sugerida por uma e apenas uma resposta ao exposto acima. Então, no decorrer apenas de tentar descobrir o que poderia funcionar, tropecei no seguinte.

O código abaixo tem o mesmo efeito dentro deste navegador que estou usando simplesmente executando uma função após um tempo limite de 1 milissegundo: posso escrever no DOM enquanto a imagem grande está carregando. Essa pode não ser a solução final para mim, posso escrever algo específico para como a funcionalidade DOM é implementada pelo mecanismo JavaScript para este navegador.

No entanto, decidi ver se isso funciona em navegadores padrão e, para minha surpresa, funciona! À luz, minha pergunta: várias implementações da funcionalidade DOM/prontidão fornecidas por várias estruturas JavaScript, simplesmente exageram?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script>
setTimeout(function() {
    var txtNode = document.createTextNode("ready_yet?");
    var ready_yet_el = document.getElementById("ready_yet");
    ready_yet_el.appendChild(txtNode);
},1);
</script>
</head>

<body>
<div id="ready_yet"></div>
<img src="http://www.ryanmorr.com/tests/ondomready/pic.jpg" />
</body>

</html>

Editar/adicionar pensamentos sobre a página vinculada pela resposta à minha pergunta relacionada anterior Ele afirma "para o Firefox e o Opera, uma verificação simples do tipo de evento determinará se é o DomContentLoaded. " Talvez um setInterval semelhante ao meu Settimeout acima possa ser o penúltimo curso de ação, antes de confiar na ONLOAD como último recurso? De qualquer forma, com o navegador incorporável que escolhi, nem o evento DomContentLoaded, nem Document.ReadyState parecem ser suportados.

Foi útil?

Solução

Seu palpite é bom e bem fundado na IMO. Mas alguém já venceu você com o soco. Resposta curta é que setTimeout é não uma implementação funcional da detecção de prontidão DOM em todos os casos. Pode ser bom para o seu navegador de interesse, mas o IE falha em algumas situações.

Pode lhe interessar saber que o próprio ASP.NET AJAX Framework da Microsoft usa o setTimeout truque para detectar a prontidão do DOM. E surpresa, surpresa: também falha em certos casos de uso.

Em suma, o problema parece estar no IE com scripts de carregamento lento, devido ao tamanho grande do arquivo (por exemplo, 500k) ou latência de rede/servidor.

Outras dicas

Não, porque quando os bugs de 'não -lindidade' de Dom se manifestam, o fazem de forma incrivelmente incomum e difícil de prever e rastrear maneiras - cada um (é claro) exclusivo do navegador em que isso acontece.

É muito mais fácil evitar completamente esses problemas e saber que você sempre estará lidando com um DOM pronto.

Como exemplo, há algum tempo, eu tinha um bug sem prontidade no navegador favorito de todos do que se manifestou trabalhando perfeitamente 99% das vezes, mas morreu com erros se o conteúdo da página tivesse um elemento IMG com atributo src nele e se o O conteúdo também tinha um elemento UL com qualquer número de Li em ... não se incomodou se alguma dessas coisas não fosse verdadeira.

É fácil para mim dizer agora 'Oh, era uma questão de DOM', mas na época ... não, não é tão fácil.

Simplesmente, não. Alguém com uma conexão mais lenta e vários arquivos a serem carregados não apreciará seu navegador tentando executar scripts em elementos que ainda não existem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top