Página web de solicitud del cliente del servidor. Clent luego solicita que se hagan cálculos adicionales; el servidor realiza una serie de cálculos y envía resultados parciales tan pronto como estén disponibles (formato de texto, cada línea contiene un elemento completo por separado). Página web de actualizaciones del cliente (con JavaScript y DOM) utilizando la información proporcionada por el servidor.Implementación en varios navegadores de "HTTP Streaming" (push) Patrón AJAX
Esto parece ajustarse al modelo HTTP Streaming (current) del sitio Ajaxpatterns.
La pregunta es cómo hacerlo en modo cross-browser (navegador independiente), preferiblemente sin utilizar frameworks de JavaScript, o usando algún framework liviano como jQuery.
El problema comienza con la generación de XMLHttpRequest en la forma de navegador cruzado, pero creo que el elemento principal es que no todos los navegadores implementan correctamente onreadystatechange
de XMLHttpRequest; no todos los navegadores llaman al evento onreadystatechange
en cada descarga del servidor (por cierto, ¿cómo forzar el flujo del servidor desde el script CGI (en Perl)?). El código de ejemplo en Ajaxpatterns trata esto usando el temporizador; ¿Debo soltar la solución del temporizador si detecto una respuesta parcial de onreadystatechange
?
Agregado 11-08-2009
solución actual:
utilizo la siguiente función para crear el objeto XMLHttpRequest:
function createRequestObject() {
var ro;
if (window.XMLHttpRequest) {
ro = new XMLHttpRequest();
} else {
ro = new ActiveXObject("Microsoft.XMLHTTP");
}
if (!ro)
debug("Couldn't start XMLHttpRequest object");
return ro;
}
Si tuviera que utilizar Algún marco de JavaScript (preferiblemente liviano) como jQuery, me gustaría tener respaldo si el usuario elige no instalar jQuery.
Utilizo el siguiente código para iniciar AJAX; setInterval
se usa porque algunos navegadores llaman al onreadystatechange
solo después de que el servidor cierra la conexión (que puede tomar tanto tiempo como decenas de segundos), y no tan pronto como el servidor vacía datos (cada segundo o más a menudo).
function startProcess(dataUrl) {
http = createRequestObject();
http.open('get', dataUrl);
http.onreadystatechange = handleResponse;
http.send(null);
pollTimer = setInterval(handleResponse, 1000);
}
La función handleResponse
es más complicado, pero el esbozo de ella tiene el siguiente aspecto. ¿Se puede hacer mejor? ¿Cómo se haría usando un marco de JavaScript liviano (como jQuery)?
function handleResponse() {
if (http.readyState != 4 && http.readyState != 3)
return;
if (http.readyState == 3 && http.status != 200)
return;
if (http.readyState == 4 && http.status != 200) {
clearInterval(pollTimer);
inProgress = false;
}
// In konqueror http.responseText is sometimes null here...
if (http.responseText === null)
return;
while (prevDataLength != http.responseText.length) {
if (http.readyState == 4 && prevDataLength == http.responseText.length)
break;
prevDataLength = http.responseText.length;
var response = http.responseText.substring(nextLine);
var lines = response.split('\n');
nextLine = nextLine + response.lastIndexOf('\n') + 1;
if (response[response.length-1] != '\n')
lines.pop();
for (var i = 0; i < lines.length; i++) {
// ...
}
}
if (http.readyState == 4 && prevDataLength == http.responseText.length)
clearInterval(pollTimer);
inProgress = false;
}
Definitivamente debe añadir que el ejemplo de código como respuesta y marcarla como el correcto! –
"si el usuario elige no instalar jQuery"? – Basic
Hola, acabo de encontrar su solución, pero me temo que todavía no funciona con IE, ya que cuando se le trata de obtener el responseText mientras que las solicitudes aún no había terminado, entonces obtendrá el siguiente mensaje: "Los datos necesarios para completar esta operación aún no están disponibles". –