Ver Mensaje Individual
  #1 (permalink)  
Antiguo 30/10/2008, 11:52
matak
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 16 años, 5 meses
Puntos: 5
abortar peticiones anteriores

buenas amigos del foro,...

Tengo el siguiente código...

index.php

Código javascript:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
  2.    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  3. <html>
  4. <head>
  5. <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6. <script type="text/javascript">
  7. function objetoAjax(){
  8.     var xmlhttp=false;
  9.     try {
  10.         xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  11.     } catch (e) {
  12.         try {
  13.            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  14.         } catch (E) {
  15.             xmlhttp = false;
  16.     }
  17.     }
  18.  
  19.     if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
  20.         xmlhttp = new XMLHttpRequest();
  21.     }
  22.     return xmlhttp;
  23. }
  24.  
  25. function detectkey(evt,obj) {
  26. keycode = (evt.keyCode==0) ? evt.which : evt.keyCode;
  27. if (keycode!=8) {
  28.     cadena=obj.value + String.fromCharCode(keycode);
  29.     pagina='filtra.php?cadena='+cadena;
  30. }else {
  31.     obj.value="";
  32.     pagina='filtra.php';
  33. }
  34.     divcontenido = document.getElementById('tabla_usuarios');
  35.     ajax=objetoAjax();
  36.     ajax.open("POST", pagina, true);
  37.     ajax.onreadystatechange=function() {
  38.       if (ajax.readyState==4) {
  39.         divcontenido.innerHTML = ajax.responseText
  40.       }
  41.     }
  42.     ajax.send(null);
  43. }
  44. </script>
  45. </head>
  46. <body>
  47.  
  48. <input type="text" name="nom" id="nom" value="" size="30" maxlength="30" onkeypress="detectkey(event,this)">
  49. <br />
  50. <div id="tabla_usuarios"></div>
  51. </body>
  52. </html>


filtra.php

Código php:
Ver original
  1. <?PHP
  2. if (isset($_REQUEST['cadena'])) {
  3.    $_REQUEST['cadena'];
  4.    $query="SELECT nombre,apellido FROM usuarios WHERE (nombre like 'cadena%')";
  5. }else $query="SELECT nombre,apellido FROM usuarios";
  6.  
  7.       $conexion = mysql_connect ($host, $usser, $pass)
  8.          or die ("No se puede conectar con el servidor");
  9.  
  10.       mysql_select_db ("prueba")
  11.          or die ("No se puede seleccionar la base de datos");
  12.      
  13.       $consulta=mysql_query($query,$conexion);
  14. ?>
  15. <TABLE>
  16. <TBODY>
  17. <TR>
  18. <TH>Nombre</TH>
  19. <TH>Apellido</TH>
  20. </TR>
  21. <?PHP
  22.       while($row = mysql_fetch_array($consulta)) {
  23.           echo "<TR>";
  24.           echo "<TD>".$row['nombre']."</TD>";
  25.           echo "<TD>".$row['apellido']."</TD>";
  26.           echo "</TR>";
  27.       }
  28. ?>
  29. </TBODY>
  30. </TABLE>

La función del código es la siguiente:

Al abrir index.php el navegador presenta un textfield. Cuando tu ingresas un caracter en él, por medio del evento onkeypress, se realiza una petición al servidor mandándole el contenido del textfield. Con esta cadena el servidor realiza un select a una tabla, monta un <table> con el resultado de la consulta y lo envia al cliente que lo inserta en el <div id="tabla_usuario">. El script funciona correctamente y si la consulta anda rapìda parece que estemos haciendo un filtro en el momento.

El problema esta en que realiza una petición por cada tecla que se pulsa y pienso que esto no debe ser muy eficiente.

¿Existiría alguna forma de ir matando los procesos ajax anteriores? es decir, que cuando pulsemos la segunda tecla abortemos la 1ª petición, cuando pulsemos la 3ª vez abortemos la 2ª, y asi sucesivamente teniendo sólo en ejecución la última petición.

No se si abrá alguna solución para esto pero llevo días dándole vueltas y no he dado con nada. Va a ser que se me queda grande...

Muchisimas gracias solamente por leerme y si me hechan un cable pues más gracias aun...

Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!