Newsgroup: it.comp.lang.javascript
Titolo: Help sostituzione KeyCode

Ambiente: Firefox
attualmente ho uno script come questo:
<script language="JavaScript">
isIE=document.all? 1:0
function numCheck(e){
keyEntry = !isIE? e.which:event.keyCode; if((keyEntry < '1') || (keyEntry > '108')) {return false; }}
</script>
...
<input type="text" name="key" onkeypress="return numCheck(event)" >
...
ma quello che vorrei ottentere è che all'inserimento di un determinato
keycode "109" venga sostituito al volo con un -Return-
questo perché ho dei lettori di barcode che presentano un problema con
firefox e per ragioni complesse non possono essere riprogrammati.
Thenks!

 keycode "109" venga sostituito al volo con un -Return-
keyCode è una proprietà in sola lettura, non puoi impostarla.
-- 
~ Se potete leggere questo, la mia donna è caduta.
(Letta sul retro di una maglietta di un motociclista)

Se proprio non riesci a trovare un modo alternativo puoi guardare
le specifiche del DOM Level 3 Events:
http://www.w3.org/TR/2001/WD-DOM-Level-3-Events-20010410/events.html
Qui viene descritto come tu possa creare a piacimento un nuovo evento
KeyEvent. Tale evento lo puoi poi rilanciare verso il parent del nodo
input.
Per ottenere il risultato voluto tu devi intercettare l'evento
"keypress"
sul nodo "INPUT" e cancellarlo attraverso il metodo stopPropagation.
Fatto questo puoi creare un nuovo evento KeyEvent, inizializzarlo e
rilanciarlo.
I metodi per fare questo sono createEvent, initKeyEvent e
dispatchEvent.
Qua sotto una pagina completa funzionante. Nell'esempio vengono
intercettati tutti gli eventi "keypress" e viene rilanciato uno nuovo
con keyCode = 109
e which = 109. Se il campo INPUT non ha il focus l'evento non viene
intercettato e viene visualizzato il keyCode originale.
<html>
<head>
<script type="text/javascript">
function catchEvent(evt)
{
	var currentTarget = evt.currentTarget;
	evt.stopPropagation();
	evt = document.createEvent("KeyEvents");
	evt.initKeyEvent("keypress", 1, 1, window, 0, 0, 0, 0, 109, 109);
	currentTarget.parentNode.dispatchEvent(evt);
}
function displayEvent(evt)
{
	alert(evt.type + " event: keyCode = " + evt.keyCode + ", which = " +
evt.which);
}
function init()
{
	document.addEventListener("keypress", displayEvent, false);
	document.getElementById("input1").addEventListener("keypress",
catchEvent, false);
}
window.onload = init;
</script>
</head>
<body>
keypress test <br>
<input type="text" id="input1">
</body>
</html>
Gaetano

 
http://www.w3.org/TR/2001/WD-DOM-Level-3-Events-20010410/events.html
[CUT]
carino...testato con vari browser?
-- 
"Non sai che ci vuol scienza
 ci vuol costanza
 ad invecchiare senza maturità"
									    F.G.

 carino...testato con vari browser?
Se dai un'occhiata veloce al codice, ti rispondi da solo. :)
-- 
~ Il futuro è nelle nostre mani.
Purtroppo.

 Se dai un'occhiata veloce al codice, ti rispondi da solo. :)
Eh, non sono funzioni che uso spesso (alcune mai usate)...però se non
ricordo male stopPropagation() IE non sa cosa sia, ci vuole un cancelBubble
o simile? Mi chiedevo se IE sa cosa sia createEvent o initKeyEvent o
simili, e a naso direi di no.
Funziona solo con browser, quindi, l'applicazione proprietaria IE è
esclusa.
-- 
"qualcuno è andato per età
 qualcuno perchè già dottore
 e insegue una maturità, si è sposato, fa carriera
 ed è una morte un po' peggiore"
									    F.G.

 esclusa.
E' un codice standard, e funziona solo su DOM level 3. Il DOM level 2 ad
esempio, non ha eventi del genere. Quindi per funzionare deve girare su un
browser w3c compliant con supporto del DOM level 3.
-- 
~ "Quando i morti camminano, signori, bisogna smettere di uccidere.
O si perde la guerra." (Zombie)

 intercettato e viene visualizzato il keyCode originale.
Ringrazio.. ma ho seri problemi di implementazione dati dalla scarsissima
conoscenza di javascript.
avevo trovato questo: 
http://www.faqts.com/knowledge_base/view.phtml/aid/1661
ed ho provato anche il tuo ma a parte restituirmi un allert..
Spiego meglio..
il lettore legge il barcode e manda un "segnale di invio" che ancora è in
dubbio se sia il 77 o il 109, comunque.. questo segnale in firefox
1.0.7(linux) è equivalente a ctrl+m e va partire Evolution (programma di
mail equivalente ad outlook) 
In sostanza ciò che vorrei è stoppare sto segnale e trasformarlo in un
invio della form.
Continuo a lavorarci..

Ehm... infatti avevo capito che il problema sussisteva solo con Firefox
e quindi ho provveduto a scrivere il codice in quel modo.
Comunque io ho testato con Mozilla 1.7 e Firefox 1.5 Beta 1.
Se qualcono sa qualcosa di più riguardo Internet Explorer potrebbe
aiutarmi ad integrare lo script:-)
Gaetano
P.S.: in IE sono disponibili i metodi createEventObject e fireEvent,
quindi forse è possibile utilizzare questi metodi per creare uno
script
equivalente.
http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/createeventobject.asp

 invio della form.
Allora è ancora più banale:
Presupponendo che il campo stia in un form:
function numCheck(e){
	if (e.charCode==109){		
		this.form.submit();
		return false;
	}
}
Bada bene però, se il SO intercetta il codice prima, non ci puoi fare un
granché.
-- 
~ Io sono il più importante dei miei problemi.

 equivalente.
Oh, per IE è ancora più semplice. A differenza di Firefox, la proprietà
keyCode non è readonly.
-- 
~ "Non ci si uccide per amore, basta aspettare."
"Allora non mi uccido per amore, mi uccido per impazienza." (A.O. e M.T.)

 keyCode non è readonly.
Ah... allora lo script è quasi completo.
Comunque penso che la compatibilità con IE non sia così "urgente".
Infatti IE per Linux non l'hanno ancora fatto:-)
Gaetano

 Infatti IE per Linux non l'hanno ancora fatto:-)
Già, in questo contesto, credo proprio che la compatibilità con IE non sia
affatto richiesta.
Sfortuna vuole che non sia Linux il SO più diffuso tra gli end-consumer, ma
Windows.. Altrimenti IE a quest'ora l'avrei già messo nel dimenticatoio da
un bel po'.
-- 
~ You don't have to be crazy to be a webmaster. But it helps.

 granché.
Ad integrare questo codice direi che è necessario prevenire l'azione
di default. Qua sotto una pagina d'esempio che dovrebbe fare al caso
di ADM.
Attenzione che previene _tutte_ le azioni di default! Bisogna eseguire
poi il preventDefault solo nel caso particolare.
Infatti così com'è il codice qua sotto previene anche il
ricaricamento
della pagina con Ctrl+R e anche il copia/incolla.
<html>
<head>
<script type="text/javascript">
function preventDefault(evt)
{
	evt.preventDefault();
}
document.addEventListener("keypress", preventDefault, true);
</script>
</head>
<body>
<h1>Prova a premere Ctrl+M</h1>
<br>
<h1>Oppure prova a incollare qualcosa qua sotto (Ctrl+V).</h1>
<br>
<textarea></textarea>
</body>
</html>
Gaetano

 di default. 
A far quello ci pensa il return false. Il codice HTML pubblicato dall'OP
era:
	<input type="text" name="key" onkeypress="return numCheck(event)" >
-- 
~ "FINARMENTE LI SFRATTATI AVRANNO UN TETTO SULLA TESTA!
...però tirato ammodino, un tegolo pe' vorta.." (Il vernacoliere)

 possibilità.
Scusa, avevo capito male. Non ho eseguito il test per controllare se il
carattere viene effettivamente inserito nel campo di testo.
Il mio script infatti intercettava l'evento quando arrivata al campo
INPUT e lo rilanciava sul padre. Rilanciando sul node INPUT stesso
(per come era fatto lo script) avrebbe portato al lancio continuo di
nuovi eventi keypress.
Magari preparerò un altro test anche per controllare questo caso.
Gaetano

 Magari preparerò un altro test anche per controllare questo caso.
In caso, fammi sapere.
-- 
~ Confondi il mondo, sorridi tutti i lunedì!

>>possibilità.
ho fatto un paio di test e sembra che la generazione dell'evento
keypress porti effettivamente all'esecuzione dell'azione
di default, ovvero ad esempio la visualizzazione di un carattere
all'interno di un campo di testo.
E' utile vedere come l'evento generato tramite la programmazione
abbia una proprietà "isTrusted" impostata a falso. Quindi ad esempio
non posso eseguire il copia/incolla del testo che ho salvato nella
clipboard o altre azioni che potrebbero risultare pericolose.
Ecco una pagina di test:
<html>
<head>
<title>Home</title>
<script type="text/javascript">
function catchEvent(evt)
{
    alert(evt.type + " event");
}
function execTest()
{
    var input = document.getElementById("input1");
    var evt = document.createEvent("KeyEvents");
    evt.initKeyEvent("keypress", 1, 1, window, true, 0, 0, 0, 0, 109);
    input.dispatchEvent(evt);
}
</script>
</head>
<body bgcolor="white" style="font-family: verdana, sans;">
<h1>Home</h1>
<div style="border: solid 1px blue; padding: 10px; margin: 10px;" 
id="myDiv">
<h1>
    Test
</h1>
<p>
    <input type="text" id="input1" onkeypress="catchEvent(event);">
    <br>
    <input type="button" value="test" onclick="execTest();"
</p>
</body>
</html>
Gaetano

 all'interno di un campo di testo.
A me, continua a non sortire tale effetto.
Ho provato il tuo codice (in locale, Firefox 1.0.7), e se lo scopo è quello
di visualizzare nell'elemento input il carattere corrispondende all'evento
generato dal click del pulsante, non mi funziona.
L'evento viene generato e rilanciato, ma finisce lì. Come nei precedenti
test. Del resto il codice è lo stesso.
Hai forse qualche impostazione di sicurezza del browser diversa da quella
di default? Oppure hai una versione differente?
-- 
~ Always remember you're unique, just like everyone else.