2010-09-20 5 views
0

À l'intérieur d'une fonction, j'ai un gestionnaire d'événements. Jusqu'ici tout va bien. Mais dans ce gestionnaire d'événements que je veux saisir Entrez pressé et remplacez cela pour un HTML.Le gestionnaire d'événements du navigateur croisé doit capturer [ENTRER]

Je l'ai fait comme ceci:

CrossBrowserEventHandler(Editor, 'keyup', function(Event) { myFunctionRef(idname, Event) }); 
    var myFunctionRef = function myFunction(idname, Event) 
    { 
     var keyCode; 
     if (!Event && window.event) { 
      Event = window.event; 
     } 
     if (Event) { 
      keyCode = (window.Event) ? Event.which : Event.keyCode; 

      if (keyCode == 13) { 
       Event.target.ownerDocument.execCommand("inserthtml",false,'<br />'); 
       Event.returnValue = false; 
      } 
     } 
     PushText(idname); /* pushes the input from a rich text iframe to a textarea */ 
    } 

La fonction de gestionnaire d'événements cross navigateur ressemble à ceci:

function CrossBrowserEventHandler(target,eventName,handlerName) 
{ 
    if (target.addEventListener) { 
     target.addEventListener(eventName, handlerName, false); 
    } 
    else if (target.attachEvent) { 
     target.attachEvent("on" + eventName, handlerName); 
    } 
    else { 
     target["on" + eventName] = handlerName; 
    } 
} 

Dans la première partie, je capture le code d'activation 13 (retour) et remplacer via une execCommand à un saut de ligne HTML. Il le fait, mais deux fois. Il n'annule/supprime pas l'événement de retour réel.

Des idées (à part le conseil standard d'utiliser un framework JS, ce que je ne peux pas pour de nombreuses raisons, l'une d'elles étant le processus d'apprentissage)?

Répondre

0

Ne devriez-vous pas capturer le code-clé 10 au lieu de 13? 10 représente le caractère de retour à la ligne tandis que 13 représente le retour chariot.

EDIT: Il se peut que vous obteniez l'événement deux fois, soit a) vous l'avez peut-être enregistré deux fois, soit b) un événement peut être en train de bouillonner. Pour b, je suggère que vous annulez bouillonnant tels que

... 
     if (keyCode == 13) { 
      Event.target.ownerDocument.execCommand("inserthtml",false,'<br />'); 
      Event.returnValue = false; 
      Event.cancelBubble = false; 
     } 
... 

Pourtant, une autre suggestion est de revenir faux de la fonction de gestionnaire d'événements. Par exemple,

... 
     Event.returnValue = false; 
     Event.cancelBubble = false; 
     return false; 
    } 
... 

Et

CrossBrowserEventHandler(Editor, 'keyup', function(Event) { return myFunctionRef(idname, Event) }); 
+0

Dans ce cas, je veux capturer 13, pas 10. –

+0

Peut-être un cas d'événement bouillonnement - j'ai modifié ma réponse. – VinayC

+0

Ne fonctionne pas malheureusement, il passe toujours l'entrée suivie par l'execCommand. Laissez-moi élaborer sur ceci. Il est utilisé pour une fonction de zone de texte enrichi et comme la plupart des navigateurs convertissent un retour en un paragraphe HTML (IE & FF) ou en un saut de ligne inclus dans div, je veux traduire un retour dans un saut de ligne pour l'uniformité. –

Questions connexes