quinta-feira, 12 de março de 2009

IE Fails - "O Internet Explorer não pode exibir a página da Web http://xxx.yyy.zzz Operação anulada

Passei horas pra resolver esse erro outro dia no serviço, mas vou descrever aqui a solução, quem sabe alguem passa algumas horas a menos resolvendo.

Pra começar fui encontrar a solução no lugar mais óbvio: No site da Microsoft.

O mais curioso é que a própria MS informa que a solução é atualizar o IE para a versão 8 que, até o momento desta postagem, é um browser em versão beta!!! Ou seja, o solução para que o navegador deles funcione é instalar uma versão que eles não garantem que funcionem.
Tudo bem, não dava pra esperar algo melhor deles mesmo.

Se você é um desenvolvedor e não quer (ou não pode) falar pro usuário usar qualquer navegador que não seja o IE(não que você não devesse falar isso) tem outra forma de solucionar o problema.

Observando nó próprio site da MS existe a possibilidade de mudar o seu JavaScript para que um elemento HTML filho não tente modificar o elemento de contêiner pai através do innerHTML ou appendChild.

Claro que nem sempre isso é possível ou como no meu caso, vc nem esteja fazendo isso.

Qual a outra possibilidade? É possível que no seu ambiente de desenvolvimento você nunca tenha visto isto ocorrer mas ao ir para a produção o problema começou.

Não precisa por a culpa na rede e nem olhar todas a linhas de configuração do seu apache para verificar o que está errado, a solução pode ser bem mais simples.

No meu caso, o problema ocorria quando o usuário clicava duas vezes no mesmo botão. Algo como um clique duplo. Por que ocorria? Simples.

O que ocorria na verdade é que o ao clicar no botão a primeira vez o sistema recarregava a página e no segundo clique o browser não havia terminado de carregar os dados(devido a lentidão da rede). Com isso o javascript tentava modificar um código html ainda inexistente na página(situação não citada no site da MS) e o erro ocorria.

Como foi corrigido? Fizemos o que deveria ter sido feito desde o início: mudamos o código para executar um comando assíncrono(ou seja, mudamos para AJAX ) e com isso o problema parou de ocorrer. Não havíamos feito isso desde o início pois o framework que usamos na época do desenvolvimento não nos dava essa opção.

Bom, foi isso. Espero ter sido útil para alguém e se alguém tiver problema parecido ou quiser compartilhar algo, deixa o recado aí.