Newsgroup: it.comp.lang.javascript
Titolo: validazione campo con ajax e ritorno in caso di errore

Salve a tutti,
mi trovo nella situazione di dover validare un campo usando javascript+php. 
Php non fa altro che fare una query nel db, se trova il valore inserito 
nella textbox vorrei che tornasse alla textbox mostrando un errore. Questa 
e' la parte php:
case 'chk_article_code':
    $sql="select * from articles where code='".strtoupper($arg)."'";
    $db->query($sql);
    $res=$db->fetch_result();
    if($res["code"]){
        echo 
"__message__|error|".$target."|".htmlspecialchars($res["code"]);
    }else{
        echo "__message__|ok";
    }
e questo il javascript della handleresponse:
function handleResponse() {
    if(http.readyState == 4){
         var response = http.responseText;
         var update = new Array();
        if(response.indexOf('|' != -1)) {
            update = response.split('|');
               if(update[0]=='alert'){
                   alert(update[1]);
               }elseif(update[0]=='__message__'){
                   if(update[1]=='error'){
                       document.getElementById(update[2]).innerHTML = 
"Anagrafica gia' presente in archivio!";
                        /* Qui vorrei farlo tornare al campo che ho appena 
controllato...*/
                   }
           }else{
               document.getElementById(update[0]).innerHTML = update[1];
           }
        }
    }
}
il tutto viene richiamato nella onblur della textbox...
c'e' qualche speranza secondo voi di riuscire nel mio intento?
grazie a tutti
dade 

 dade
in parte ho risolto modificando un po' il codice e passando il nome del 
controllo alla parte php pero' non mi riesce ora reimpostare il focus sulla 
input... io faccio cosi':
document.getElementById(update[3]).focus();
dove update[3] contiene il nome del campo (verificato ed e' corretto, 
tant'e' che se invece del focus metto un .value="pippo" mi scrive pippo), ma 
il cursore non ne vuole sapere di andare in quel campo....
grazie a tutti
dade 

 il cursore non ne vuole sapere di andare in quel campo....
io non vedo problemi nel codice che hai postato. posta un esempio
semplificato completo così ci diamo un occhio.
-- 
"Ho smesso di fumare.
 Vivrò una settimana di più.
 E in quella settimana pioverà a dirotto"
									    W.A.


Ok... posto la parte js per intero visto che pare che sia proprio quella a 
dare problemi... ho visto infatti che se invece di dare il focus all'input 
con il controllo onblur lo do ad un altro input funziona perfettamente 
(document.getElementById('desc').focus(); funziona perfettamente!) quindi ho 
l'impressione che ci sia qualche errore nella sndReqArg o nella 
handleResponse
grazie 1000 dell'aiuto!!!
Dade
=================================== pagina.htm 
===================================
<html>
<head>
	<title></title>
	<script type="text/javascript" src="js/rpc.js"></script>
</head>
<body>
<form action="dump.php" method="post">
	<input name="code" type="text" id="code" size="15" maxlength="15" 
onblur="javascript:sndReqArg('chk_article_code',this,'code_res');" 
/>&nbsp;&nbsp;&nbsp;<label id="code_res"></label>
	<input name="desc" type="text" id="desc" size="80" maxlength="80" />
	<input type="submit" name="Submit" value="Salva" />
</form>
</body>
</html>
==================================================================================
===================================== rpc.js 
=====================================
function createRequestObject(){
	var ro;
 	var browser = navigator.appName;
 	if(browser == "Microsoft Internet Explorer"){
  	ro = new ActiveXObject("Microsoft.XMLHTTP");
	}else{
		ro = new XMLHttpRequest();
	}
		return ro;
}
var http = createRequestObject();
function sndReqArg(action,arg,target){
	/* Write text in uppercase... */
	if(arg!=null){
		var argument=arg.value;
		arg.value=argument.toUpperCase();
	}else{
		argument='';
	}
	http.open('get', 
'../../lib/rpc.php?action='+action+'&arg='+argument+'&target='+target+"&src_control="+
arg.name
);
	http.onreadystatechange = handleResponse;
	http.send(null);
}
function handleResponse() {
	if(http.readyState == 4){
 		var response = http.responseText;
  	var update = new Array();
   	if(response.indexOf('|' != -1)) {
  		update = response.split('|');
  		if(update[0]=='alert'){
  			alert(update[1]);
/*
 * dallo script php ricevo una risposta del tipo: "__message__|error|<id 
label che conterrà il risultato>|<controllo che ha chiamato il js>"
 */
  		}else if(update[0]=='__message__'){
  			if(update[1]=='error'){
  				document.getElementById(update[2]).innerHTML = "Anagrafica gia' 
presente in archivio!";
  				document.getElementById(update[3]).select();
  				document.getElementById(update[3]).focus();
  			}else{
  				document.getElementById(update[2]).innerHTML = "";
  			}
  		}else{
  			document.getElementById(update[0]).innerHTML = update[1];
  		}
		}
	}
}
================================================================================== 

  document.getElementById(update[3]).focus();
Ho provato ad invertire l'ordine tra innerHTML e focus (mettere il focus 
come prima istruzione, ma non cambia il risultato... Ma ci sono forse 
problemi a settare il focus in una input che ha un js associato all'evento 
onblur?
dade
 

 onblur?
a naso direi di no, ma non ho esperienza diretta in merito.
Ho scritto cosě al volo questa paginetta, e con IE7 nessun problema (il
secondo input non riceve mai il focus):
<html><head></head>
<body><div>
<form method="get" onsubmit="return false">
<input type="text" name="myInput" onblur="this.focus()" value="qua sempre
il focus!"/>
<input type="text" name="myInput" value="qua mai!"/>
</form></div></body></html>
-- 
"e mai che mi sia venuto in mente
 di essere piů ubriaco di voi
 di essere molto piů ubriaco di voi"
									  F.D.A.


io sul tuo esempio ho costruito questa che usa anche la proprieta' name 
sulla quale inizio ad avere dubbi:
<html><head></head>
<script type="text/javascript">
function ridammiilfocus(mionome){
	controllo=document.getElementById(mionome).name;
	document.getElementById(controllo).focus();
}
</script>
<body><div>
<form method="get" onsubmit="return false">
<input type="text" name="myInput1" onblur="javascript:ridammiilfocus(this);" 
value="qua sempre
il focus!"/>
<input type="text" name="myInput2" value="qua mai!"/>
</form></div></body></html>
che ne dici? Schematicamente, senza tutta la parte ajax e' cio' che 
faccio...
grazie ancora per il tuo prezioso aiuto!
Dade 

 Dade
per la fretta la funzione e' fuori l'head, ma messa all'interno non funziona 
lo stesso... quello che non mi quandra dell'esempio reale, e' questo:
	if(arg!=null){
		var argument=arg.value;
		arg.value=argument.toUpperCase();
	}else{
		argument='';
	}
	http.open('get', 
'../../lib/rpc.php?action='+action+'&arg='+argument+'&target='+target+"&src_control="+
arg.name
);
dove arg viene passato dalla onblur con "this"... come posso estrapolare il 
nome del controllo?
Dade 


Mi correggo... pare che non funzioni solo con firefox... con ie va alla 
perfezione... mistero!!! 

 	document.getElementById(controllo).focus();
scusa, prendi il name e poi usi getElementById? come dice il nome: by*ID*
...
se vuoi usare il name:
a) stai passando this (quindi controllo=
this.name
)
b) document.getElementsByName(controllo)[0].focus();


 nome del controllo?
nome=name? 
arg.name
 ?
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.


Si hai ragione, infatti qui ho fatto un po' di confusione... sta di fatto 
che il focus() non va con firefox mentre va bene con ie... vedi questo 
codice:
<html><head>
<script type="text/javascript">
function ridammiilfocus(mionome){
	document.getElementById('myInput1').focus();
}
window.onload=function(E){
	document.getElementById('myInput1').focus();
}
</script>
</head>
<body><div>
<form method="get" onsubmit="return false" name="pippo">
<input type="text" name="myInput1" id='myInput1' 
onblur="ridammiilfocus(this);" value="qua sempre il focus!"/>
<input type="text" name="myInput2" id='myInput2' value="qua mai!"/>
</form></div></body></html>
ciao e grazie
Dade 

 codice:
[CUT]
visto...procedi al contrario:
<html><head>
<script type="text/javascript">
window.onload=function(E){
    for(var x=0,objs=document.forms[0].elements;x<objs.length;x++)
	 if(objs[x].id!="myInput1")
	  objs[x].onfocus=function() {
	   	document.getElementById('myInput1').focus();
      }
	document.getElementById('myInput1').focus();
}
</script>
</head>
<body><div>
<form method="get" onsubmit="return false" name="pippo">
<input type="text" name="myInput1" id='myInput1' 
value="qua sempre il focus!"/>
<input type="text" name="myInput2" id='myInput2' value="qua mai!"/>
</form></div></body></html>
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.


[CUT]
ma cmq se la richiamo onblur e passandoli l'id del controllo nun va :
<html><head>
<script type="text/javascript">
function dammiilfocus(controllo){
    for(var x=0,objs=document.forms[0].elements;x<objs.length;x++)
			if(objs[x].id!=controllo)
  			objs[x].onfocus=function() {
   				document.getElementById(controllo).focus();
      	}
		document.getElementById(controllo).focus();
}
</script>
</head>
<body><div>
<form method="get" onsubmit="return false" name="pippo">
<input type="text" name="myInput1" id='myInput1' value="qua sempre il 
focus!" onblur="dammiilfocus(this);"/>
<input type="text" name="myInput2" id='myInput2' value="qua mai!"/>
</form></div></body></html>
grazie
Dade 

 		document.getElementById(controllo).focus();
idem come sopra


 true...!=
controllo.id
, oppure direttamente objs[x]!=controllo
e quindi onblur="dammiilfocus(
this.id
);" ?
 

 e quindi onblur="dammiilfocus(
this.id
);" ?
sì, puoi fare anche così. ma non risolverà il tuo problema immagino (senza
contare che dovrai rimuovere tutti gli onfocus programmaticamente a seconda
dell'input in cui ti trovi)


 aspetti)
eh si ma ho diversi controlli in quel form e se inserisco la onfocus in 
tutti, ogni volta andrei a controllare il valore del codice con tanto di 
chiamate al db...
grazie per tutto l'aiuto che mi hai dato, mi hai aiutato tantissimo!
Dade
 

"Dade" <cucca7...@NOSPAMPLEASEgmail.com> wrote in message 
news:4684...@newsgate.x-privat.org...
[CUT]
Problema risolto!
riporto pari pari la rispostata datami da ghiaccio84 nel forum di 
html.it
:
[quote]
Evidentemente questo bug di firefox fa si che il codice JS contenuto 
nell'evento onblur si esegua PRIMA del focus all'input successivo e non dopo 
come in IE.
Potresti abbastanza brillantemente superare la questione impostando un 
ritardo all'esecuzione del codice con la funzione setTimeout()
<input type="text" name="myInput1" id='myInput1' 
onblur="setTimeout('ridammiilfocus(this)',5);" value="qua sempre il focus!" 
/>
<input type="text" name="myInput2" id='myInput2' value="qua mai!"/>
[/quote]
ciao
dade