Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Empêcher un onChange sous Firefox...

22 réponses
Avatar
david.bercot
Bonjour,

Je suis bloqu=E9 depuis un bon moment alors je fais appel =E0 vos
services...
Je souhaiterais, si la donn=E9e d'un champ de formulaire ne correspond
pas =E0 ce que j'attend, que l'utilisateur reste bloqu=E9 sur le champ en
question. Je fais aussi un contr=F4le des caract=E8res saisis alors voici
mon code (dissoci=E9 suivant le navigateur) :
// Validation des donn=E9es.
function demarrage_controles() {
if (FF) {
document.captureEvents(Event.KEYPRESS);
document.captureEvents(Event.CHANGE);
document.onkeypress =3D process_keypress;
document.onchange =3D process_change;
} else {
document.onkeypress =3D process_keypress;
for (i=3D0; i < document.forms[0].elements.length ; i++) {

document.forms[0].elements[i].attachEvent("onchange",process_change);
}
}
}
// On n'accepte que des chiffres.
function process_keypress(e) {
if (FF) {
if (e.target.tagName =3D=3D "input" && !((e.which > 47 &&
e=2Ewhich < 58) || e.which =3D=3D 0 || e.which =3D=3D 8 || e.which =3D=3D 1=
3)) {
return false;
}
} else {
if ((window.event.keyCode < 47 || window.event.keyCode >
58) && window.event.keyCode !=3D 13) {
return false;
}
}
}
// On compare au dernier cumul.
function process_change(e) {
if (FF) {
if (e.target.id.substr(0,3) =3D=3D "var" && e.target.alt !=3D "=
")
{
if (Number(e.target.value) < Number(e.target.alt)) {
alert ("Vous ne pouvez pas saisir de donn=E9es
inf=E9rieures au dernier cumul !");
e.preventDefault();
e.stopPropagation();
e.returnValue=3Dfalse;
}
}
} else {
if (window.event.srcElement.id.substr(0,3) =3D=3D "var" &&
window.event.srcElement.alt !=3D "") {
if (Number(window.event.srcElement.value) <
Number(window.event.srcElement.alt)) {
alert ("Vous ne pouvez pas saisir de donn=E9es
inf=E9rieures au dernier cumul !");
window.event.returnValue =3D false;
}
}
}
}
Mon probl=E8me vient de la fonction process_change sous Firefox o=F9 tout
ce que j'ai mis (stopPropagation etc...) ne sert =E0 rien et
l'utilisateur passe bien au champ suivant (le message est quand m=EAme
affich=E9). En revanche, sous IE, le window.event.returnValue =3D false
fonctionne correctement.

Auriez-vous une piste pour moi ?

Merci d'avance.

David.

10 réponses

1 2 3
Avatar
David BERCOT
ASM wrote:

Mon but est, si la nouvelle valeur ne correspond pas à ce que
j'attends, que l'utilisateur reste bloqué sur la zone en question...


Là, je vois pas comment tu peux faire ça ?
(à part un alert et remise en focus de l'input si condition non remplie)

Les tabulations ni les clics souris ne fonctionnent plus avec ta ficelle
sur IE Win ?


Tout à fait, ça marche très bien et ça ne me semble pas du tout une
ficelle mais une gestion normale des évènements. Alors ok, ce ne sont
peut être pas les évènements "classiques" et c'est peut être
propriétaire, mais ça marche bien.
Et je n'arrive pas à comprendre qu'il n'y ait pas d'équivalent pour
Firefox (et les autres DOM en fait !!!).

David.


Avatar
David BERCOT
ASM wrote:
ASM wrote:

<input id="var01" name="var01" size="5"
onchange="this.value = defaultValue;"/>


Effectivement, ça fonctionne aussi chez moi. Et c'est très bien sauf
que ce n'est pas ce que je veux !


J'ai capté à l'autre post :-)


Cool ;-)

En effet, je souhaite que l'utilisateur soit bloqué sur le champ en
question


faut donc cacher tout le reste :-)

<input onchange="this.focus();" >


Ben oui, ça ne marche pas. Il passe quand même au champ suivant.
Je suppose que ce "pseudo" retour de focus est suivi d'autres
évènements (dans le bubbling des évènements) qui font que le focus
est re-modifié par la suite... Ca pourrait fonctionner si on
empêchait le bubbling. Mais je n'ai pas trouvé comment faire sous
Firefox...

David.



Avatar
ASM
ASM wrote:

Les tabulations ni les clics souris ne fonctionnent plus avec ta ficelle
sur IE Win ?


Tout à fait, ça marche très bien


C'est dingue !
Un simple return false met IE Win en rideau ?!

et ça ne me semble pas du tout une
ficelle mais une gestion normale des évènements.


à mon idée, pas vraiment,
normalement un return met fin à une fonction,
et un return false n'a pas à mettre false à tout event sur la page

Selon toute logique, à ce compte là
tu ne dois même plus pouvoir entrer qque chose dans le champ.

c'est peut être propriétaire, mais ça marche bien.


C'est peut-être tout simplement un des nombreux bug d'IE Windows ?


--
Stephane Moriaux et son [moins] vieux Mac


Avatar
David BERCOT
Les tabulations ni les clics souris ne fonctionnent plus avec ta ficel le
sur IE Win ?


Tout à fait, ça marche très bien


C'est dingue !
Un simple return false met IE Win en rideau ?!

et ça ne me semble pas du tout une
ficelle mais une gestion normale des évènements.


à mon idée, pas vraiment,
normalement un return met fin à une fonction,
et un return false n'a pas à mettre false à tout event sur la page

Selon toute logique, à ce compte là
tu ne dois même plus pouvoir entrer qque chose dans le champ.

c'est peut être propriétaire, mais ça marche bien.


C'est peut-être tout simplement un des nombreux bug d'IE Windows ?


C'est bizarre mais je te soupçonne d'être légèrement subjectif
vis-à-vis de Microsoft ;-)
Non, non, je travaille depuis longtemps sur le DOM MS, qui est
d'ailleurs extrêmement clair, détaillé et documenté et ce
comportement est totalement voulu.
J'aimerais bien trouver autant d'infos sur le DOM W3C avec
l'enchainement des évènements et la possibilité, pour chacun d'eux,
de bloquer soit l'évènement localement, soit totalement en empêchant
sa propagation...
J'ai trouvé plusieurs choses comme le stopPropagation ou
preventDefault mais sans réussir à les faire fonctionner...

Ca me paraitrait quand même incroyable qu'une solution n'existe pas
sous Firefox !!!

David.



Avatar
ASM
C'est peut-être tout simplement un des nombreux bug d'IE Windows ?


C'est bizarre mais je te soupçonne d'être légèrement subjectif
vis-à-vis de Microsoft ;-)


Subjectif ?
Ho ! non !
très objectif au contraire !

Non, non, je travaille depuis longtemps sur le DOM MS, qui est
d'ailleurs extrêmement clair, détaillé et documenté et ce
comportement est totalement voulu.


Bon, donc c'est volontairement que ça bugue :-)
Et tu me dis que je suis "subjectif" ?
Alors que tt ce que touche M$ fonctionne en dépit du *bon sens* ?

J'aimerais bien trouver autant d'infos sur le DOM W3C

J'ai trouvé plusieurs choses comme le stopPropagation ou
preventDefault mais sans réussir à les faire fonctionner...


Ha ! en fait, tu as du mal avec la logique ? :-D

Ca me paraitrait quand même incroyable qu'une solution n'existe pas
sous Firefox !!!


Certainement, on doit pouvoir y arriver, mais j'avoue mes limites dans
le domaine des events (je suis relativement largué aussi).

Faut vraiment que Laurent Vilday se penche sur ton pb.

--
Stephane Moriaux et son [moins] vieux Mac


Avatar
Guy
Bonjour,

Je suis bloqué depuis un bon moment alors je fais appel à vos
services...
Je souhaiterais, si la donnée d'un champ de formulaire ne correspond
pas à ce que j'attend, que l'utilisateur reste bloqué sur le champ en
question. Je fais aussi un contrôle des caractères saisis alors voici
mon code (dissocié suivant le navigateur) :
Bonjour,

essayez les gestionnaires d'événements onFocus et onBlur qui vous
permettront de stocker pour chacun des champs (que l'on peut supposer
type=text) la valeur initiale et de déclencher une vérification et de
positionner le focus au bon endroit !
G

Avatar
ASM
essayez les gestionnaires d'événements onFocus et onBlur


J'avais pensé à ça et ... ça a cafouillé lamentablement

Le onblur, si on est sorti par un tab n'empèche pas d'être propulsé dans
le champ suivant (le tab est actionné *avant* le onblur, la sortie)

à ce moment, dans le champ suivant, le onblur regarde si la condition
est remplie (du champ précédent) et si elle ne l'est pas, hop! focus
vers le champ précédent

ce qui déclenche le onblur du champ suivant où on était où bien sûr
la condition n'est pas remplie non plus, hop! ça re-focus sur ce dernier

mais re-onblur le precedent
qui refocus onblur boucle de boucle ... !

--
Stephane Moriaux et son [moins] vieux Mac

Avatar
Guy

essayez les gestionnaires d'événements onFocus et onBlur



J'avais pensé à ça et ... ça a cafouillé lamentablement

Le onblur, si on est sorti par un tab n'empèche pas d'être propulsé dans
le champ suivant (le tab est actionné *avant* le onblur, la sortie)

à ce moment, dans le champ suivant, le onblur regarde si la condition
est remplie (du champ précédent) et si elle ne l'est pas, hop! focus
vers le champ précédent

ce qui déclenche le onblur du champ suivant où on était où bien sûr
la condition n'est pas remplie non plus, hop! ça re-focus sur ce dernier

mais re-onblur le precedent
qui refocus onblur boucle de boucle ... !

Oui, effectivement blur et focus constitue une boucle !

j'ai monté un proto avec uniquement focus, mais s'il fonctionne
correctement sur IE, il ne fonctionne pas sur Netscape, ni Mozilla !
je ne comprends pas car j'utilise onfocus donc après le TABulation !

<script>
var v1="";
var n1="";
function store(vv,ww) {
if (n1=="" & v1=="") {
v1=vv;
n1=ww;
alert ("st1"+v1+n1);
} else {

if (n1!=ww) {
alert ("v1"+v1+"ww"+ww);
v0=eval("document.ffff."+n1+".value");
if (v0=="vrai" || v0=="") {

v1=vv;
n1=ww;
alert ("st"+v1+n1);
} else {
eval("document.ffff."+n1+".value='"+v1+"';");
eval("document.ffff."+n1+".focus();");
alert("document.ffff."+n1+".focus();");

}
}
}
}

</script>
</head>

<body bgcolor="#FFFFFF" text="#000000">
<form method="post" name="ffff" action="">
<input type="text" name="text11" value="vrai"
onFocus="store(this.value,this.name)">
<input type="text" name="text22" value="vrai"
onFocus="store(this.value,this.name)">
<input type="text" name="text33" value="vrai"
onFocus="store(this.value,this.name)">
</form>
</body>
G


Avatar
Laurent Vilday
essayez les gestionnaires d'événements onFocus et onBlur


J'avais pensé à ça et ... ça a cafouillé lamentablement


Après quelques vacances et l'esprit reposé, j'ai trouvé une solution. Ca
repose sur le onchange et le onblur, le onblur n'étant pas cancelable.

onchange, on vérifie si on peut blur ou pas
onblur, si onchange disait qu'on ne pouvait pas blur, on fait le focus.

FX a toujours eu (à ce que j'en sais) des problèmes de focus, il
s'emmele les pinceaux si on veut forcer le focus de l'élément pendant le
blur. Pour s'en sortir, il faut passer par un petit timeout très court.

Pire, mais ce n'est pas le cas ici, il peut provoquer des erreurs si
l'élément de destination (celui qu'on veut focus) est invisible et qu'il
n'est pas en autocomplete="off" (qui n'est pas standard).

IE6 et Opéra9 n'ont pas ce genre de problèmes et se satisfont
parfaitement de la solution.

function VerifValeur(val)
{
if ( /* val est correct */ )
{
return true;
}
return false;
}

element.onchange = function()
{
this.preventBlur = !VerifValeur(this.value);
};

element.onblur = function()
{
if ( this.preventBlur && this.value !== '' )
{
var E = this;
setTimeout(function() { E.focus(); }, 10);
}
};

http://mokhet.com/tests/dontquit.php

Testé sur IE6, FX1.5, Opéra9.
Avec quel navigateur bizarre ça marche pas ? :D

Ceci dit c'est, à mon sens, *très* anti user friendly et trop de prise
de tête pour simuler un fonctionnement éprouvé sur le onsubmit du
formulaire, event du formulaire qui lui pourra être cancelable et pourra
placer correctement le focus sur le premier élément invalide.

--
laurent


Avatar
Laurent Vilday
Laurent Vilday wrote:
document.onchange = process_change;
Event attribué en modèle traditionnel.


function process_change(e) {
e.preventDefault();
e.stopPropagation();
preventDefault() et stopPropagation() c'est pas pour le modèle traditionnel.



Je suppose, quand tu parles de modèle traditionnel, qu'il s'agit du
DOM au sens W3C et pas Microsoft ?


Non, pas du tout.

Il existe 3 modèles d'events.

* Modèle traditionnel, dit (abusivement ?) DOM0
+ très simple à manipuler
+ comportement consistant des navigateurs, même IE (presque)
- un seul type d'evénement à la fois par élément

exemple :
elt.onclick = function(evt) {};
annulation :
return false

* Modèle W3C DOM2
+ permet la gestion de plusieurs types identiques sur l'élément
+ permet les mode capture et bubble
- impossible de déterminer l'ordre d'exécution de 2 events du même type
- non géré par IE

exemple :
// false | true pour le choix du mode (bubble | capture)
elt.addEventListener('click', function(evt) {}, false);
annulation :
evt.stopPropagation()
et evt.preventDefault()

* Modèle Microsoft
+ permet la gestion de plusieurs type identiques sur l'élément
- perte du scope d'application (this, correspond à rien)
- pas de mode capture
- event non propagé comme paramètre mais par window.event
- peu de propriétés utilisables dans window.event

exemple :
elt.attachEvent('onclick', function() {});
annulation :
window.event.cancelBubble = true;
et window.event.returnValue = false;

Plein d'explications détaillées sur :
http://www.quirksmode.org/index.html?/js/introevents.html

--
laurent



1 2 3