Construindo uma aplicação complexa para a web, me deparei várias vezes com o erro código: 0x80040111 (NS_ERROR_NOT_AVAILABLE) no Firefox. Gastei bastante tempo procurando no Google alguma página ou post que me explicasse o porque deste erro.
Depois de muita procura, me deparei com o Eric's weblog. Nele, Eric explica que o erro é causado por:
Mozilla calls onload() for all HTTP transactions that succeeded. The only time it calls onerror() is when a network error happened. Inside the onerror handler, accessing the status attribute results in this exception:
Error: [Exception... "Component returned failure code: 0x80040111
(NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.status]" nsresult: "0x80040111
(NS_ERROR_NOT_AVAILABLE)" location: "JS frame ::
file:///Users/chuck/errtest.html :: anonymous :: line 114" data: no]
Source File: file:///Users/chuck/errtest.html
Line: 114
E que uma solução rápida seria adicionar um try/catch quando estivesse lendo a propriedade status do objeto.
Para aquele problema específico, funcionou perfeitamente e como eu estava fazendo apenas insert no banco de dados para salvar as preferências de usuário, que era executado cada vez que o usuário executasse alguma função, achei que não era absolutamente necessário tratar um possível erro.
O problema reapareceu quando eu precisei tratar um select que era acionado dentro de um iFrame, mas que seu resultado deveria aparecer no parent. Eu simplesmente precisava de todos os dados, inclusive da propriedade status.
Então voltei a procurar no Google algo que me ajudasse. Depois de muito tempo achei uma dica no site matthom que me ajudou a entender melhor problema e me deu uma solução.
Segundo o texto, o problema ocorre quando você tenta realzar uma requisição AJAX e submete e formulário ao mesmo tempo. Então era só trocar o INPUT TYPE='submit' para INPUT TYPE='button' e o problema seria resolvido.
Entretanto, no meu caso eu não estava enviando dados de um formulário. A função era executada em um link no evento onClick. Então essa solução não se aplicava ao meu caso.
Por sorte, ao ler um dos comentários vi que se utilizasse um 'return false;' teria mesmo efeito e resolvi tentar colocar o 'return false;' após a chamada da função no link.
Funcionou perfeitamente. Parei de receber o erro, pois o link, apesar de ter 'href="#"', causa o mesmo impacto no Firefox que tentar submeter um formulário mesmo sem o atributo action.
Isso me ajudou a entender porque eu não recebia essa mensagem de erro ao tentar submeter meus formulários com AJAX. Na minha TAG FORM eu sempre coloco onSubmit='return false;'. Se vocês querem enviar dados de um formulário por AJAX, eu recomendo o uso do evento onSubmit. Fica mais elegante do que mudar o INPUT para button.
Espero que este texto ajude vocês com o mesmo problema.
0 comentários:
Postar um comentário