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)

Foi útil?

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 quando readyState é 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:

  1. Se o estado não estiver descendo ou aberto, retorne 0 e encerre estas etapas.
  2. Se o sinalizador de erro for verdadeiro retornar 0 e encerrar essas etapas.
  3. 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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top