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.

2 réponses

1 2 3
Avatar
David BERCOT
Salut,

Laurent Vilday wrote:
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 solutio n. 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


J'ai jeté un coup d'oeil très rapide mais ça me semble nickel...
Je regarde plus en détails demain...

Merci beaucoup !!!

David.



Avatar
David BERCOT
Bonjour,

Laurent Vilday wrote:
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 solutio n. 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


Bon, ben je viens de faire les adaptations nécessaires à mon code et
c'est parfait !!!

Bref, un SUPER GRAND merci à toi !!!

Bonne journée et bon week-end.

David.

P.S. : ne connaissant par trop l'ordre des évènements (quoique le
onblur à la fin, c'est logique ;-)) et surtout le bug de Firefox, je
n'aurais jamais trouvé autrement...



1 2 3