Por que o IE não está exibindo este alerta ()?
-
20-09-2019 - |
Pergunta
Eu tenho a seguinte parte do código:
// setup the AJAX request
var pageRequest = false;
if(window.XMLHttpRequest) pageRequest = new XMLHttpRequest();
else if(window.ActiveXObject) pageRequest = new ActiveXObject("Microsoft.XMLHTTP");
// callback
pageRequest.onreadystatechange = function() {
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
}
pageRequest.open('POST','ajax.php',true);
// q_str contains something like 'data=value...'
pageRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
pageRequest.setRequestHeader("Content-length", q_str.length);
pageRequest.setRequestHeader("Connection", "close");
pageRequest.send(q_str);
Isso funciona bem no Chrome, mas ou seja, engasga, cuspindo um "erro não especificado". e aponta para a linha com o alerta () nele. Por que não pode exibir o alerta?
EDIT: Ok, depois de descartar a caixa de diálogo do erro, recebo os três alertas como esperado ....
EDIT: Agora está realmente ficando estranho. Se eu mudar
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
para
alert('pageRequest.readyState: ' + pageRequest.readyState);
Então funciona e eu recebo 5 alertas. (1,1,2,3,4)
Solução
O status é a resposta HTTP nas duas primeiras vezes em que o método é chamado, você recebe 1 e 1 como o Estado Ready. ReadyState 1 significa "O objeto foi criado, mas o método de envio não foi chamado".. Naquela época, não há resposta de status do servidor, pois não recebeu nenhuma solicitação, portanto, usando o status em seu alerta, deu um erro.
Outras dicas
O Chrome 4 também leva um erro (invalid_state_err: DOM Exceção 11). Você verá o erro se abrir o Chrome JavaScript Console.
O Firefox 3.6 também levanta um erro, mas parece descartá -lo silenciosamente (não é visível no console de erro). Se você envolver a função em um try..catch
Bloco Você verá a mensagem de erro (Componente retornado Código de falha: 0x80040111 (NS_ERROR_NOT_AVALELE)):
pageRequest.onreadystatechange = function() {
try {
alert('pageRequest.readyState: ' + pageRequest.readyState
+ '\npageRequest.status: ' + pageRequest.status);
}
catch (e) {
alert(e);
}
}
As duas primeiras vezes onreadystatechange
é invocado no Internet Explorer, readyState
é 1 (aberto). Nesse estado, a solicitação está sendo enviada, mas a resposta ainda não foi recebida. O erro é levantado ao chamar de status
propriedade nisso readyState
Porque não há resposta HTTP para ler o status de.
Este comportamento é compatível com versões antigas do Especificação W3C XMLHTTPREQUEST, qual estado:
Se o
status
O atributo não está disponível, ele deve aumentar uma exceção. Deve estar disponível quandoreadyState
é 3 (recebendo) ou 4 (carregado). Quando disponível, ele deve representar o código de status HTTP (normalmente 200 para uma conexão bem -sucedida).Exceções sobre recuperação
Domexception
INVALID_STATE_ERR
Deve ser aumentado se esse atributo for acessado quando o ReadyState tiver um valor inadequado.
Versões mais recentes da especificação, no entanto, afirme que status
deve sempre retornar um valor:
o
status
O atributo deve retornar o resultado da execução estas etapas:
- Se o estado não estiver descendo ou aberto, retorne 0 e encerre estas etapas.
- Se o sinalizador de erro for verdadeiro retornar 0 e encerrar essas etapas.
- Retorne o código de status HTTP.
Eu acho que você tem um problema de concatenação de string, ao avaliar o pagerequest.status (que é um número inteiro). Apenas tente o seguinte:
status = pageRequest.status;
status += '';
alert('pageRequest.readyState: ' + pageRequest.readyState \
+ '\npageRequest.status: ' + status);