Savoir quel input à le focus ! (document activeElement sous FireFox et co)

Dernière mise à jour : 15 fev. 2008 à 18:20

document.activeElement [IE]

Rien de plus simple sous IE. Document.activeElement !

Ah oui, mais cela ne marche pas sous FireFox et co....

Regardons du coté de codes-sources : activeElement avec Firefox snippets pour javascript

Ah oui, mais cela nécéssite un objet Event, ce qu'il n'est pas toujours possible d'avoir, et cela ne marche pas vraiment (vous pouvez tester, si vous prenez un event onmouseover sur un DIV, il vous dira que l'élément actif est le BUTTON, or on veut la textbox active, pas l'élément lié à l'event !

ITHMLInputElement.hasFocus [IE]

Reste alors une autre solution, parcourir tous les inputs et voir lequel est sélectionné.

Sous IE, on pourrait le faire : il existe une propriété hasFocus ! Mais encore une fois, sous FF.... nada !

Document.selection [IE] ou window.getSelection() [FF, Safari]

De nouveau, c'est IE Only.... enfin, pas si sûr ! Un équivalent FF existe : window.getSelection()

Il ne fonctionne pas du tout de la même manière mais on peut s'y habituer.

Seulement voila, quand c'est un input qui a le focus, celui-ci ne fait pas partie de la sélection

La sélection est vièrge MAIS positionnée juste avant l'input ! Reste donc à trouver comment déterminer si un input est l'élément final d'une sélection. Encore une fois, c'est pas simple....

... MAIS C'EST POSSIBLE !!! YOUPII !!! (voir plus loin)

Mais on n'a toujours pas Opéra...

Alors pour Opéra, j'ai trouvé une méthode un peu hasardeuse : On regarde si une sélection existe via selectionStart/End. Mais cela ne marche pas si la sélection est vide et commence au début de la textbox.... Faut de mieux....

Finalement

En fouillant un peu, j'ai créé la méthode suivante : [EDIT=15/02/08]

   1:      function haveFocus(inp) {
   2:          try { // IE
   3:              var result = !!(inp.hasFocus||inp==document.activeElement);
   4:              if (result) { return result; }
   5:          } catch (ex) {}
   6:          try { // FF; Safari
   7:              var sel = false;
   8:              sel=this.window.getSelection().getRangeAt(0);
   9:              if (!sel.collapsed) { return false; }
  10:              var sel2 = document.createRange();
  11:              sel2.setStartBefore(inp);
  12:              sel2.setEndBefore(inp);
  13:              var result = true; //sel.compareBoundaryPoints(Range.START_TO_START, sel2)==0;
  14:              //result = result && sel.compareBoundaryPoints(Range.END_TO_END, sel2)==0;
  15:              result = result && sel.startOffset == sel2.startOffset
  16:              result = result && sel.endOffset == sel2.endOffset
  17:              return result;
  18:          } catch (ex) {}
  19:          try { // Opéra
  20:              return !!(inp.selectionStart||inp.selectionEnd);
  21:          } catch (ex) {}
  22:          return false;
  23:      }

Et si on généralise pour trouver l'input qu'on cherche (extrait de ma source) :

   1:      try {
   2:          var allInputs = this.document.getElementsByTagName("INPUT");
   3:          var allTAreas = this.document.getElementsByTagName("TEXTAREA");
   4:          var l1 = allInputs.length; var l2 = allTAreas.length;
   5:          for (var i=0; i<l1; i++) {
   6:              var inp = allInputsIdea;
   7:              if (inp.type=="" || inp.type=="text") {
   8:                  if (haveFocus(inp)) {
   9:                      this.activeElement = inp;
  10:                      return "text";
  11:                  }
  12:              }
  13:          }
  14:          for (var i=0; i<l2; i++) {
  15:              var inp = allTAreasIdea;
  16:              if (haveFocus(inp)) {
  17:                  this.activeElement = inp;
  18:                  return "text";
  19:              }
  20:          }
  21:      } catch (ex) {}

Et bien voila qui est fait !

Dire que l'on pensait cela impossible.

J'en profite pour dire que j'ai mis à jour DOCUMENT.SELECTION pour FireFox qui tient fonctionne désormais EXACTEMENT comme le vrai Wink

Bonne prog'

Fremy

Publié jeudi 14 février 2008 18:57 par FREMYCOMPANY
Classé sous , , ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

# re: Savoir quel input à le focus ! (document activeElement sous FireFox et co) jeudi 14 février 2008 22:15

Arg, il semblerait qu'il y ait un bug dans ma méthode sous FF.

Je vais corriger ca ce week-end et je vous tiens au courrant

FREMYCOMPANY

# re: Savoir quel input à le focus ! (document activeElement sous FireFox et co) vendredi 15 février 2008 19:51

Correction faite !

FREMYCOMPANY


Les 10 derniers blogs postés

- [Silverlight] En attendant Silverlight 2 RTW par Blog Technique d'Audrey PETIT le il y a 21 heures et 54 minutes

- Le nouveau Gojira, c’est pour lundi… par CoqBlog le 10-11-2008, 01:18

- SharePoint : nouvel article sur la mise en place des Scopes dans MOSS Searchs par Blog Technique de Romelard Fabrice le 10-10-2008, 17:52

- Hello CS par Le Blog de julz le 10-10-2008, 12:26

- MSDN/TechNet/Microsoft Days Tour 2008 à Lille les 13 et 14 Octobre ! par RedoBlog - The .NET Gentleman !!! le 10-10-2008, 09:35

- MVC Pratique #07 - Un projet concret et le transfert des objets avec les ModelBinders par #Rui le 10-09-2008, 23:39

- SQL Server 2008 : Certifié - TS Admin (70-432) par SQL Server vu par Christian Robert le 10-09-2008, 10:58

- [WPF] Comment changer la couleur utilisée pour sélectionner les éléments d’un ItemsControl ? par Thomas Lebrun le 10-09-2008, 10:49

- Hello World! par Hamid's Place le 10-08-2008, 23:38

- SQL Profiler - Configuration pour un développeur - tracer les requêtes SQL de votre application par Atteint de JavaScriptite Aiguë [Cyril Durand] le 10-08-2008, 15:52