Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1282 connectés 

  FORUM HardWare.fr
  Programmation
  HTML/CSS

  ajouter un événement onfocus à un champ input

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

ajouter un événement onfocus à un champ input

n°1321617
Yertle
Posté le 09-03-2006 à 10:35:06  profilanswer
 

Salut à tous. Je suis en train de développer une application web en html php javascript et j'aurais besoin à un moment donné de changer ou d'ajouter un événement onFocus à un champ input text.
 
Je m'explique, j'ai un script qui liste le contenu d'une base de données, et l'utilisateur doit pouvoir modifier ou supprimer une ligne.
Lorsqu'il choisit de supprimer ou de modifier une ligne, il clique sur un bouton radio et un formulaire de saisie se remplit avec les valeurs correspondantes.
Seulement voila, si l'action est "supprimer" j'aimerai que les champs text ne soient plus modifiables.
 
J'ai essayé plusieurs trucs genre : form.elements[i].onFocus = "this.blur()"; ou alors form.elements[i].readOnly = true;
et qq trucs comme ça mais rien n'y fait.
 
Après qq recherches sur le net, j'ai tjr rien trouvé :(.
 
Qqun aurait une solution ?
Merci d'avance.

mood
Publicité
Posté le 09-03-2006 à 10:35:06  profilanswer
 

n°1323974
Yertle
Posté le 13-03-2006 à 09:31:24  profilanswer
 

Dois-je en déduire que personne ne peut m'aider ? :cry:

n°1323988
anapajari
s/travail/glanding on hfr/gs;
Posté le 13-03-2006 à 09:52:54  profilanswer
 

la syntaxe (enfin une des pour etre exacte) pour changer un evement est la suivante:

Code :
  1. tonElement.unEvenement = function(event) {taFonction;};


avec unEvenement qui peut valoir onload, onclick, onmouseup, onmousedown, onblur ...
Tu as d'autres syntaxes, notamment avec attachEvent, celle du dessus à l'avantage de marcher sur a peu près tous les navigateurs.
 
Par ailleurs, quand tu commences a faire des trucs comme ça ( et particulierement une "application web" ), je te déconseille d'utiliser la "vieille syntaxte" javascript à base de form.elements...
Renseigne toi sur les fonction DOM, tu verras c'est bien plus pratique!!!

n°1324167
Yertle
Posté le 13-03-2006 à 14:13:10  profilanswer
 

j'ai tenté ceci mais ça sonnait faux, enfin ça me paraissait bizarre et effectivement ça ne marche pas...

Code :
  1. form.elements[i].onFocus = enleverFocus(form.elements[i])


sachant que :

Code :
  1. function enleverFocus(field){
  2.     field.blur();
  3. }


Sinon qqun aurait de bonnes sources de renseignements sur le DOM ?

n°1324179
anapajari
s/travail/glanding on hfr/gs;
Posté le 13-03-2006 à 14:23:08  profilanswer
 

naaaan t'as po compris :o

Code :
  1. form.elements[i].onFocus = function(event){ enleverFocus(this);}


tu peux passer this comme argument car au moment de l'appel de la fonction ( donc dans le onFocus) this pointera sur l'objet qui vient d'être onfocuser ( si ça existe comme mot).
 
Tu trouveras plein de renseignements sur pleins de site sur le dom.
la présentation sur le site developer.mozilla.org est pas mal.
Tu trouveras aussi quelques exemples assez clairs.
Après le DOM est "censé" être un standard implémenté de la même façon sur tous les navigateurs, fais attention il y a quand même quelques subtiles nuances.
 
Enfin:

chrisbk a écrit :

DOM1 est un autre jour

n°1325828
Yertle
Posté le 15-03-2006 à 14:24:51  profilanswer
 

Citation :


Code :
  1. form.elements[i].onFocus = function(event){ enleverFocus(this);}




j'ai beau essayer ça ne marche pas...

n°1325875
anapajari
s/travail/glanding on hfr/gs;
Posté le 15-03-2006 à 15:08:45  profilanswer
 

boulette de ma part :o pas de F majuscule dans le onfocus !!!

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
  4. <head>
  5.   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6.   <title>Test</title>
  7.   <script type="text/javascript">
  8.   function chgFocus(){
  9.     input = document.getElementById('inp') ;
  10.     if ( input.onfocus == null){
  11.       input.onfocus = function(event){ doIt();};
  12.     } else {
  13.       input.onfocus = null;
  14.     }
  15.   }
  16.   function doIt(){
  17.     alert('pouet');
  18.   }
  19.   </script>
  20. </head>
  21. <body >
  22. <input type="text" id="inp"/>
  23. <br/>
  24. <input type="button" value="add/remove focus" onclick="chgFocus()"/>
  25. </body>
  26. </html>

n°1326487
Yertle
Posté le 16-03-2006 à 09:25:11  profilanswer
 

Bon ben j'ai essayé ça :

Code :
  1. function enleverFocus(field){
  2. field.blur();
  3. }


 
pour ça :

Code :
  1. form.elements[i].onfocus = function(event){ enleverFocus(this);}


Mais comme ça ne marchait pas j'ai essayé moins compliqué, j'ai fait comme toi précédemment (plus ou moins) :

Code :
  1. function doIt(){
  2. alert("pouët !" );
  3. }


et plus loin :  

Code :
  1. form.elements[i].onfocus = function(event){ doIt();}


 
et en fait ben ça marche pas non plus :'C...


Message édité par Yertle le 16-03-2006 à 09:25:55
n°1326503
anapajari
s/travail/glanding on hfr/gs;
Posté le 16-03-2006 à 09:57:01  profilanswer
 

le code que je t'ai donné je l'ai vérifié sur IE/FF garanti il marche!!!
 
Mais je pense que c'est l'utilisation de

Code :
  1. form.elements[i]

qui suxe...
 
Utilise plutot les fonctions DOM:

Code :
  1. document.getElementById

n°1326662
Yertle
Posté le 16-03-2006 à 13:55:37  profilanswer
 

J'ai éclairci mon code, et en fait j'ai trouvé une erreur dans la console de la barre d'outils développeur FF :  
 

Citation :

Erreur : [Exception... "'Permission refusée de modifier la propriété XULElement.selectedIndex' when calling method: [nsIAutoCompletePopup::selectedIndex]"  nsresult: "0x8057001e (NS_ERROR_XPC_JS_THREW_STRING)"  location: "JS frame :: http://b8183/niko/code/appli/manip [...] 2110&gra1= :: enleverFocus :: line 75"  data: no]
Fichier source : http://b8183/niko/code/appli/manip [...] 2110&gra1=
Ligne : 75


 
voici la ligne concernée :

Code :
  1. function enleverFocus(input){
  2. input.onfocus = input.blur();
  3. }


 
j'ai aussi essayé avec ceci, avec ou sans quotes, mais même résultat :

Code :
  1. function enleverFocus(input){
  2. input.onfocus = this.blur();
  3. }

mood
Publicité
Posté le 16-03-2006 à 13:55:37  profilanswer
 

n°1326669
Yertle
Posté le 16-03-2006 à 13:57:46  profilanswer
 

Pour que tu comprennes mieux la globalité voici les fonction entières, en espérant que ça ne soit pas trop long (toute la fonction n'est pas utile a connaître...)

Code :
  1. function enleverFocus(input){
  2. input.onfocus = input.blur();
  3. }
  4. //rempli les champs du formulaire correspondant à la case cochée, les vide si la case en question est décochée
  5. function remplirChamps(form,id,uf,mon,act){
  6. var ecrit = 0; //booleen : 0 si champs non remplis, 1 si oui
  7. var j = 0;
  8. //vérifie si déja écrit
  9. while(j<form.length && ecrit == 0){
  10.  if((form.elements[j].type=='text') && ((form.elements[j].name.substring(0,3) == "ide" ) && (form.elements[j].value==id))){
  11.   ecrit = 1;
  12.  }
  13.  j++;
  14. }
  15. if (ecrit == 0){ //si la ligne n'est pas déja écrite
  16.  j = 1;
  17.  var actionencours = "new";
  18.  for (var i=0 ; i<form.length ; i++){ //parcours total sur le formulaire passé en param
  19.   if(form.elements[i].type == 'text'){ //on cherche un champ texte
  20.    //dont le nom commence par "ide" et qui n'est pas déja rempli
  21.    if (form.elements[i].name.substring(0,3) == "ide" && form.elements[i].value == ''){
  22.     //on rempli les champs avec les valeur paramètres
  23.     form.elements[i].value = id;
  24.     i++;
  25.     form.elements[i].value = uf;
  26.     i++;
  27.     form.elements[i].value = mon;
  28.     i++;
  29.     form.elements[i].value = act;
  30.     ecrit = 1;
  31.     break; //les données sont écrite, on arrête le parcours du formulaire
  32.    }
  33.   }
  34.  }
  35. }else{ //si les données sont déja entrées
  36.  actionencours = form.elements[j+3].value; //récupère dans le champs concerné l'action en cours
  37. }
  38. if (ecrit == 0){ //si les données n'ont pas été écrite, on a parcouru le formulaire sans trouvé de champs "ide" vide
  39.  ajoutChamps(champsaisie,'divchampsaisie'); //on rajoute des lignes dans le formulaire
  40.  remplirChamps(form,id,uf,mon,act); //on recommence le remplissage
  41. }else{ //si les données on été écrite, on change le style des input selon l'action choisie
  42.  if (actionencours != act){ //si l'action entrée est différente de l'action en cours
  43.   if (act == "modif" ){ //et que c'est une modification
  44.    for (var i=j ; i<=j+2 ; i++){ //on parcour la ligne et on change le style pour chaque champ
  45.     form.elements[i].style.backgroundColor  = "cyan";
  46.     form.elements[i].style.color  = "black";
  47.     form.elements[i].onfocus = null;
  48.    }
  49.   }else{ //si c'est une suppression
  50.    for (var i=j ; i<=j+2 ; i++){ //on parcour la ligne et on change le style pour chaque champ
  51.     form.elements[i].style.backgroundColor  = "yellow";
  52.     form.elements[i].style.color  = "black";
  53.     form.elements[i].onfocus = function(event){ enleverFocus(this); };
  54.    }
  55.   }
  56.   // form.elements[j+3].value = act; //on modifie l'action
  57.  } //si l'action est la même on ne fait rien
  58. }
  59. }

n°1326703
anapajari
s/travail/glanding on hfr/gs;
Posté le 16-03-2006 à 14:23:21  profilanswer
 

ta fonction enleverFocus elle est pas bonne!

Code :
  1. function enleverFocus(input){
  2.    input.blur();
  3. }


Bon par ailleurs c'est completement stupide de faire un onfocus -> blur, ça veut dire que tu veux pas que le champs puisse être saisi, alors autant le mettre en disabled ou read-only.
 
Enfin si tu tiens vraiment a garder ton truc comme ça, envoie tout le code de ta page parce que là j'ai du mal a inventer le formulaire qui va avec ;)

n°1326789
Yertle
Posté le 16-03-2006 à 15:48:35  profilanswer
 

Alors j'ai essayé d'inclure le code correspondant et nécessaire à la compréhension du pbm, mais apparemment il est tout de même trop important le post ne fontcionne pas.  :heink:  
 
Alors pour t'expliquer vite fait, j'ai un ensemble de lignes, je donne le choix soit de les supprimer soit de les modifer, ceci dit le script fonctionne par groupe de lignes, ce qui veut dire que pour les lignes choisies, je conserve l'action correspondante dans un champ caché. Et là pour différencier les champs suppr ou les champs modif, je change la couleur, et j'empêche l'utilisateur de faire des modifs sur les lignes qu'il désire suppr.
Un champs doit donc pouvoir passer de readOnly a read et write lorsque je change l'action désirée.
 
Ceci dit, il est vrai qu'un champ en readOnly à la place d'un onFocus="this.blur()" est bien plus pratique et plus approprié. Mais je ne sait pas non plus cmt est-ce qu'on affecte le readOnly a un champ.
J'ai essayé ça :

Code :
  1. form.elements[i].readOnly = true;

mais ça ne marche pas...

n°1326790
Yertle
Posté le 16-03-2006 à 15:50:34  profilanswer
 

Tiens j'ai remplacé ma fonction enleverFocus() par la tienne, et ça marche, pourtant j'ai tjr la même erreur dans la console.

n°1326794
anapajari
s/travail/glanding on hfr/gs;
Posté le 16-03-2006 à 16:03:18  profilanswer
 

Yertle a écrit :

... un gros paté que je comprends pas


T'as pas un lien dessus ça irait plus vite :o
 

Yertle a écrit :

Ceci dit, il est vrai qu'un champ en readOnly à la place d'un onFocus="this.blur()" est bien plus pratique et plus approprié. Mais je ne sait pas non plus cmt est-ce qu'on affecte le readOnly a un champ.
J'ai essayé ça :

Code :
  1. form.elements[i].readOnly = true;

mais ça ne marche pas...


Tiens ça ça marche t'as qu'a t'en inspirer:

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
  4. <head>
  5.   <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
  6.   <title>Test</title>
  7.   <script type="text/javascript">
  8.   function chgRO(){
  9.     input = document.getElementById('inp') ;
  10.     if ( input.readOnly == false){
  11.       input.readOnly = true;
  12.     } else {
  13.       input.readOnly = false;
  14.     }
  15.   }
  16.   </script>
  17. </head>
  18. <body >
  19. <input type="text" id="inp"/>
  20. <br/>
  21. <input type="button" value="add/remove readOnly" onclick="chgRO()"/>
  22. </body>
  23. </html>


 

Yertle a écrit :

Tiens j'ai remplacé ma fonction enleverFocus() par la tienne, et ça marche, pourtant j'ai tjr la même erreur dans la console.


C'est que l'erreur est dans le reste de ton code!!!
 
Mais honnetement tu gagnerais beaucoup en lisibilité à te servir des fonctions dom getElementById et getElementsByTagName
 

n°1327158
Yertle
Posté le 17-03-2006 à 09:25:53  profilanswer
 

Citation :

...l'erreur est dans le reste de ton code


Non, l'erreur est bien sur le changement de onFocus, la console de debug me renvoie à cette ligne précisément.
 
Pour les fonctions DOM, je ne peux pas les utiliser paske je doit parcourir un formulaire dans son intégralité, et non un champ en particulier, je ne peux donc pas utiliser leur id on tag pour les repérer (d'ailleurs la console ne me donne ni erreur ni warning lors des parcours des formulaires alors qu'elle m'en donnait à d'autres endroits où là les getElementById était obligatoires pour rester dans les standards).
 
Pour finir, je te remercie pronfondément paske je viens grâce à toi de résoudre le pbm avec des readOnly, tout marche et sans erreur :wahoo:  
 
Merci pour ton aide et ta patience et à bientot peut être  :p


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  HTML/CSS

  ajouter un événement onfocus à un champ input

 

Sujets relatifs
[MySQL] Quel type de champ pour quel type de données ?[Ant] Ajouter une librairie à mon build.xml
[php] [resolu]newbie. Comment ramener le focus sur le 1er champajouter un evenement à une balise input
Comment ajouter une page [RESOLU]Ajouter un lien dans les clics droits pour VoIP sous Firefox
Excel ajouter une nouvelle ligne automatiquement[SQLServer]recherche sur un champ date indépendante du format
Plus de sujets relatifs à : ajouter un événement onfocus à un champ input


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR