Newsgroup: it.comp.lang.javascript
Titolo: XMLHttp e applicazione con form ricerca

Ciao a tutti,
ho il seguente problema, stò cercando di creare un form di ricerca
utilizzando javascript per fare delle richieste xmlhttp e visualizzare
le ricerche più recenti.
Il mio problema è che quando uso l'evento onKeyPress mi viene
richiamata un funzione dalla quale non riesco a prendere l'esatto
valore del campo di testo.
In pratica se io digito 'a' dovrei avere richiamare nella mia funz. un
url 
www.sito.it?word=a
 e se poi digito 'u' si dovrebbe richaimare
www.sito.it?word=au
 invece la funzione rimane sempre con un carattere
in meno!
Cmq la pagina in questione è
http://www.opent.it/romacinema/frontend/test.htm
Qualcuno mi sà aiutare? Grazie 1000 in anticipo!
Augusto

Hai ragione grazie! Non so se hai visto la pagina cmq stò tendando di
ricreare un
campo di ricerca "live" con xmlHttp ma a questo punto noto che ci sono
problemi di "prestazioni".. sapresti dirmi se a livello di javascript
sarebbe possibile migliorare il codice?
Forse farmi restituire i risultati in xml è poi parsarlo è il
problema.. forse dovrei prendere i risultati direttamente in formato
testo o html..
Qualcuno mi sà dire qualcosa?
Cmq il codice è molto semplice ed è questo:
<script>
function getXMLHttp() {
var xmlhttp = null;
if (window.ActiveXObject) {
  if (navigator.userAgent.toLowerCase().indexOf("msie 5") != -1) {
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } else {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  }
}
if (!xmlhttp && typeof(XMLHttpRequest) != 'undefined') {
  xmlhttp = new XMLHttpRequest()
}
return xmlhttp
}
function Request(method, page, mod) {
objHTTP = getXMLHttp();
objHTTP.open(method, page, mod);
objHTTP.onreadystatechange = function() {elaboraRisposta()}
objHTTP.send(null);
}
function elaboraRisposta() {
  if (objHTTP.readyState == 4) {
      var StringaXml = objHTTP.responseText;
      if (document.implementation &&
document.implementation.createDocument) {
	xml = document.implementation.createDocument("","",null)
	xml.onload = leggi;
	xml.loadXML(StringaXml);
      }
      else if (window.ActiveXObject)
      {
	xml = new ActiveXObject("Microsoft.XMLDOM")
	xml.onreadystatechange = IEGo;
	xml.loadXML(StringaXml);
      }
  }
}
function IEGo() {
   if (xml.readyState == 4)
      leggi();
}
function leggi() {
	obj =
xml.getElementsByTagName("search")[0].getElementsByTagName("result");
  	var o = (document.all) ? document.all['menuComparsa'] :
document.getElementById ('menuComparsa');
	if (obj.length) {
	var i;
	var testo = '';
	for (i=0; i<obj.length; i++) {
		testo += '<div><table class="tbl"><tr class="ResRow"
onmouseover="this.className=\'ResRowOver\'"
onmouseout="this.className=\'ResRow\'"><td>';
		testo += obj[i].childNodes[0].nodeValue;
		testo += '</td><td class="Res2">';
		testo += obj[i].getAttribute("num")+' risultati';
		testo += '</td></tr></table></div>\n';
		document.getElementById("menuComparsa").innerHTML=testo;
	}
	o.style.visibility="visible";
	}else {
	o.style.visibility="hidden";
	}
}
function search() {
  word = document.formCerca.cerca.value;
  Request("GET",
"
http://www.opent.it/romacinema/frontend/searchXML.php?str=
"+word,
"true");
}
</script>
<form action="" method="GET" name="formCerca">
<table align="center" style="width: 400px; border-collapse: collapse;
padding: 0px;">
  <tr>
    <td width="100"><input type="text" name="cerca" size="30"
onKeyUp="search();" /></td>
    <td><input type="submit" name="submit" value="Ricerca" /></td>
  </tr>
  <tr>
    <td width="100">
	<div id="menuComparsa">
  	  <!-- <div><table class="tbl"><tr class="ResRow"
onmouseover="this.className='ResRowOver'"
onmouseout="this.className='ResRow'"><td><a href="p1.htm">Link
1</a></td><td class="Res2">5 risultati</td></tr></table></div> -->
	</div>
    </td>
    <td>&nbsp;</td>
  </tr>
</table>
</form>

 	}
Sicuramente questo approccio non è dei migliori.
Per migliorare le prestazioni lato client, dovresti farti restituire una
stringa raw tramite responseText, e non un documento XML valido; e
utilizzare direttamente quest'ultima.
Google, ad esempio, si fa restituire una stringa che in realtà è del codice
javascript che viene eseguito al volo; e che aggiunge dinamicamente i
risultati tramite le DOM API.
Tu puoi anche farti restituire direttamente il codice HTML già formattato e
fare un innerHTML di responseText, ma così perdi tempo nella formattazione
server side.
Vedi tu, fai un po' di prove e cerca di arrivare ad un risultato che ti
soddisfi, cercando dove puoi di aumentare la velocità di risposta del
server il più possibile.
-- 
ZER0
~ The Tangent Universe collapsed 5995 days, 3 hours, 24 minutes and 39 seconds ago.

Grande grazie mille.. farò un pò di prove sicuramente anche perchè
non ho assolutamente problemi lato server, il mio problema è che non
conosco molto bene javascript.
Cmq mi faccio risentire frà 1pò perchè mi stà incuriosendo questa
cosa, sopratutto non sapevo che potevo prendere i dati direttamente in
formato in XMl e quindi ho fatto 1pò di "porchette" :)
A presto,
Augusto

 risultati tramite le DOM API.
i risultati da aggiungere sono nella stessa stringa o in una stringa
differente???
Grazie
Andrea

 differente???
Scusa, ma non ho ben capito la domanda.
-- 
ZER0
~ The Tangent Universe collapsed 5997 days, 9 hours, 40 minutes and 18 seconds ago.

 Scusa, ma non ho ben capito la domanda.
Mi chiedevo solamente se le stringhe da aggiungere sono nello stesso
file dove c'è il js o se il js che viene eseguito al volo prende i
dati da un file diverso
Ciao e grazie






Non ci siamo capiti, temo. I dati vengono inviati dall'XHR, non sono
presenti in nessun file js. Nel JS c'è solo il codice per eseguire la
richiesta, e inserire i dati così ottenuti. XHR fornisce una risposta in
raw text del tipo:
addResult("pippo","10000","pluto","1323322","paperino","1281787");
di cui viene fatto l'esecuzione al volo:
eval(xmlhttp.responseText);
Come ti dicevo, non è un documento XML valido.
-- 
ZER0
~ The Tangent Universe collapsed 6002 days, 3 hours, 23 minutes and 36 seconds ago.

...
Ciao e buongirono di nuovo a tutti!
Ho "completato" questo giochino in javascript utilizzando non più un
Response in Xml (che implicava l'utilizzo di API DOM xml) ma del
semplice testo in formato html..
La pagina in questione è 
http://www.opent.it/romacinema/cerca.php
A questo punto però ho dei problemi con gli eventi.. ossia sembra che
tutto funzioni però vorrei che :
1. se non viene restituito niente non appaia qual piccolo layer
"vuoto" che adesos appare..cioè se ad esempio si scrive "a" e poi si
cancella quello che si è scritto rimane sempre in piccolo layer
vuoto..
2. Al click fuori dall'input box (dovrebbe essere l'evento onBlur())
il layer deve scomparire per poi riapparire quando si riposiziona il
cursorse all'interno dell'input..
Spero di essermi spiegato bene e vi ringrazio anticipatamente per
qualsiasi consiglio in più!
grazie 1000!
Augusto