IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

onkeydown et évenement Firefox


Sujet :

JavaScript

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 98
    Par défaut onkeydown et évenement Firefox
    Salut,

    ça fait pas mal de temps que je creuse pour trouver le code qui va bien mais sans résultat.
    Enfin, le mieux que j'ai trouvé est ce site mais ça ne répond pas complètement à mon besoin : http://www.howtocreate.co.uk/tutorials/index.php?tut=0&part=17

    Explication :

    j'ai un formulaire avec des zones de saisies TEXT et je veux interdire certains caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input size="15" maxlength="15" id="Nom" name="Nom" onKeyDown="submitOnEnter(); return checkChar();">
    Action :
    submitOnEnter : si on clique sur "entrée", le script de validation est lancé.
    checkChar : si on clique ailleurs que sur des caractères alphanumériques, la fct renvoie false et le caractère ne s'écrit pas dans l'INPUT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function submitOnEnter()
    {	if (window.event.keyCode==13) validModif();  }
     
     
    function checkChar()
    {		
    	if ( window.event.keyCode==8 || window.event.keyCode==9 ...)
    		return true;
    	else
    		return false;	
    }
    Comme vous pouvez le constater, ça marche exclusivement pour IE.
    Je me suis mis en tête de le rendre compatible Firefox.

    Déjà, pour commencer, j'ai modifié checkChar pour qu'elle renvoie false.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function checkChar() { return false ; }
    et j'ai supprimé l'appel à submitOnEnter.
    1er prob : la fonction a beau me renvoyer false, le caractère frappé s'écrit quand même dans la zone INPUT TEXT !!

    Ensuite, j'ai implémenté la gestion des évènements "Onxxxxxx" de telle manière à ce que soit compatible (voir article en lien ci-dessus).

    2ème prob :
    le OnKeyDown du HTML s'exécute avant le document.onkeydown=ma_fction;

    Mon idée était de mettre à jour dans ma_fction une variable globale contenant le n° de la touche frappée. Si la touche est autorisé => OK
    si elle est interdite => KO
    si c'est ENTREE => on valide.

    Bref, je tourne en rond, le problème numéro un étant ce return false qui n'agit pas du tout sur la frappe.

    Merci pour votre aide.

  2. #2
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    te renverra la propriété voulue sous ffx (event étant passé en paramètre)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 98
    Par défaut
    Citation Envoyé par javatwister
    te renverra la propriété voulue sous ffx (event étant passé en paramètre)
    Merci.
    Je crois que je n'ai pas été explicite :

    mon code :
    variable globale :
    dans le onload de ma page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if( document.captureEvents ) {
    	    //non IE
    	    if( Event.KEYDOWN ) {
    	        //NS 4, NS 6+, Mozilla 0.9+
    	        document.captureEvents( Event.KEYDOWN );
    	    }
    	}
     
    	 document.onkeydown=getEvent;
    puis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    function getEvent(e) {
     
    	if( !e ) {
    		//if the browser did not pass the event information to the
    		//function, we will have to obtain it from the event register
    		if( window.event ) {
    		    //DOM
    		    e = window.event;
    		} else {
    		    return;
    		}
    	}
     
    	if( typeof( e.which ) == 'number' ) {
    	    //NS 4, NS 6+, Mozilla 0.9+, Opera, Firefox 1.0+
    		globKeycode = e.which;
    	} else if( typeof( e.keyCode ) == 'number'  ) {
    		//IE, NS 6+, Mozilla 0.9+
    		globKeycode = e.keyCode;
    	} else if( typeof( e.charCode ) == 'number'  ) {
    	    //also NS 6+, Mozilla 0.9+
    		globKeycode = e.charCode;
    	} else {
    	    return;
    	}
    }
    Ma fonction appelée à chaque keydown met à jour ma var globale : globKeycode.

    Ensuite, dans le onkeydown HTML (<input type=text onkeydown...>) j'appelle submitOnEnter et return checkChar qui utilise la valeur de globKeyCode.

    Problème 1 :
    return checkChar a beau renvoyer false, le caractère interdit s'affiche quand même dans mon input text (marche très bien sous IE !)

    Problème 2 :
    onkeydown dans le HTML s'exécute AVANT le onkeydown du script client donc, du coup, j'appelle checkChar et submitOnEnter avec la valeur précédente de globKeyCode ! => décalage.

    merci

  4. #4
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    il faut donc te passer du gestionnaire d'événement inline;

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 98
    Par défaut
    Citation Envoyé par javatwister
    il faut donc te passer du gestionnaire d'événement inline;
    Quand tu dis Inline, tu veux dire le HTML je pense.
    Je veux bien m'en passer mais le fait est que je n'arrive pas à porter sur FFX un comportement que j'avais sur IE et qui était demandé par mes utilisateurs.
    Il y a bien la solution de :
    - mémoriser la chaine avant la frappe
    - analyser le car. frappé
    - si OK on ne fait rien
    - si interdit, on remet dans l'INPUT la chaine préalablement mémorisée
    Faisable mais incroyablement lourd par rapport à mon return false

  6. #6
    Expert confirmé
    Avatar de javatwister
    Homme Profil pro
    danseur
    Inscrit en
    Août 2003
    Messages
    3 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : danseur

    Informations forums :
    Inscription : Août 2003
    Messages : 3 684
    Par défaut
    pourrais-tu rappeler les infos suivantes:

    ==> Tu as plusieurs champs soumis à la même vérif?
    ==> Tu censures quels caractères?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 98
    Par défaut
    Citation Envoyé par javatwister
    pourrais-tu rappeler les infos suivantes:

    ==> Tu as plusieurs champs soumis à la même vérif?
    ==> Tu censures quels caractères?
    1- oui 2 actuellement mais il pourrait y en avoir 50
    2- tous les car. qui ne sont pas alphanum. Sont OK : A->Z (maj. et min.) et de 0->1.

    J'ai avancé :

    JS :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    var globKeycode ;
     
     
    function getEvent(e,evElement) {
     
    	if( !e ) {
    		//if the browser did not pass the event information to the
    		//function, we will have to obtain it from the event register
    		if( window.event ) {
    		    //DOM
    		    e = window.event;
    		  //  return e ;
    		} else {
    		    //TOTAL FAILURE, WE HAVE NO WAY OF REFERENCING THE EVENT
    		    return;
    		}
    	}
     
    	if( typeof( e.which ) == 'number' ) {
    	    //NS 4, NS 6+, Mozilla 0.9+, Opera, Firefox 1.0+
    		globKeycode = e.which;
    	} else if( typeof( e.keyCode ) == 'number'  ) {
    		//IE, NS 6+, Mozilla 0.9+
    		globKeycode = e.keyCode;
    	} else if( typeof( e.charCode ) == 'number'  ) {
    	    //also NS 6+, Mozilla 0.9+
    		globKeycode = e.charCode;
    	} else {
    	    return;
    	}
     
    }
     
    function submitOnEnter()
    {
    	if (globKeycode==13) alert("On soumet le formulaire") ;
    }
     
     
    function checkChar2(zone)
    {	
     
    	if (	(globKeycode==8)	||	(globKeycode==9)	||	(globKeycode==46)	||
    			(globKeycode==32)	||	(globKeycode==35)	||	(globKeycode==36)	||
    			(globKeycode==37)	||	(globKeycode==39)	||	(globKeycode==45)	||
    			(globKeycode==13)	||	(globKeycode>=65 && globKeycode<=90)		|| 
    			(globKeycode>=96 && globKeycode<=105)	)
    		return true ;
    	else
    	{
    		zone.value = zone.value.substring(0,zone.value.length-1) ;
    		return false;
    	}
    }
    Dans le HTML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <input size="15" maxlength="15" id="Prenom" name="Prenom" onKeyDown="getEvent(arguments[0],this);checkChar2(this);submitOnEnter();">
    Ca marche SAUF .... !

    Je stocke bien la valeur de la touche enfoncée.
    Je ne récupère plus l'évènement dans l'ensemble du doc, dc je n'ai plus de préséance de JS sur le code Inline.
    Si le car. est interdit, je prends la chaine et je vire le dernier car.
    Tout semble bon SAUF qu'il reste une préséance
    En effet, le fait de "taper" déclenche les évènements dans le OnKeyDown, mais l'ajout du caractère tapé ne se fait qu'à postériori !!!!!
    Du coup, je supprime le dernier caractère de la chaine précédente qui lui est valide, puis le mauvais car. est pris en compte : ex : prénom= françois, le ç est interdit !

    fran => je tape ç => INTERDIT => fra => fraç !

    Je déporte mon checkChar2 sur le onkeyup. Ca marche mais avec des effets de bord pas croyable et surtout le car. interdit apparait un court instant.

    Pourquoi cet abruti de FFX ne comprend pas le FALSE (idée initiale qui marche chez IE) alors qu'en plus, il n'imprime le car. qu'en dernier lieu ? Là je me retrouve dans la pire des situations :pas de prise en compte du "return false + frappe effective après l'évènement.

    En conclusion :

    J'ai quand même bien avancé même si je bloque sur la dernière marche.
    J'ai l'impression qu'un tel usage n'est tout simplement pas possible dans FFX, qu'il va falloir que je chance mon fusil d'épaule, càd procéder à un test des carac. interdits sur la validation. Dans le fond, c'est pas la mort, mais je trouve (et je suis pas le seul ici ) que c'est une régression par rapport à l'existant.

Discussions similaires

  1. Firefox 9 et onkeydown
    Par dodane dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/12/2011, 08h31
  2. Réponses: 8
    Dernier message: 10/06/2010, 18h41
  3. évenement non reconnu sous firefox
    Par raimo dans le forum Général JavaScript
    Réponses: 24
    Dernier message: 30/05/2008, 23h43
  4. pourquoi OnKeyDown génère un évenement sonor ?
    Par hogan dans le forum Framework .NET
    Réponses: 7
    Dernier message: 10/04/2007, 23h18
  5. Petit problème sous Firefox onkeydown
    Par frechy dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 27/09/2006, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo