2009-09-26 5 views
3

J'ai ce code de prototype pour détecter Entrez en appuyant sur dans textarea.événement KeyDown est invoqué deux fois

document.observe('keydown', function(e, el) { 
    if ((e.keyCode == 13) && (el = e.findElement('.chattext'))) { 
     e.stop(); 
     // foo bar 
    } 
} 

Et html

<textarea id="chattext_17" class="chattext" cols="20" rows="3"></textarea> 

Mais le problème est, cet événement obtient deux fois invoqué. J'ai même essayé de le réécrire à jQuery

$('.chattext').live('keydown', function(e) { 
    if (e.keyCode == 13) { 
     e.preventDefault(); 
     // foo bar 
    } 
}); 

Mais même alors, l'événement est invoqué deux fois.

Lorsque je tente de le déboguer avec Firebug, il saute toujours ici après avoir terminé le gestionnaire d'événements

function createWrapper(element, eventName, handler) { 
    var id = getEventID(element); 
    var c = getWrappersForEventName(id, eventName); 
    if (c.pluck("handler").include(handler)) return false; 

    var wrapper = function(event) { 
     if (!Event || !Event.extend || // always false here 
      (event.eventName && event.eventName != eventName)) 
      return false; 

     Event.extend(event); 
     handler.call(element, event); // here the event gets called again 
    }; 

    wrapper.handler = handler; 
    c.push(wrapper); 
    return wrapper; 
} 

Je ne suis pas gourou du prototype, donc je ne sais pas où le problème pourrait être.

Pourquoi l'événement keydown est-il invoqué deux fois?

Répondre

5

Fonctionne pour moi. Voyez vous-même à http://jsbin.com/ibozo/edit

<textarea id="chattext_17" class="chattext" cols="20" rows="3"></textarea> 
<div id="dbg"></div> 

script:

document.observe('keydown', function(e, el) { 
    if ((e.keyCode == 13) && (el = e.findElement('.chattext'))) { 
     e.stop(); 
     $('dbg').insert('<div>enter pressed</div>') 
    } 
}) 

Chaque instruction de débogage est insérée une seule fois sur chaque pression de la touche [Entrée]. La version de jQuery (non publiée) se comporte exactement de la même manière.

Vous faites autre chose de mal. Peut-être exécuter la fonction qui fait la liaison deux fois?

+0

wow lol, j'ai découvert que j'avais le fichier js lié deux fois ... de toute façon :) thx –

1

Sinon cela devrait fonctionner:

document.observe('keydown', function(e, el) { 
if ((e.keyCode == 13) && (el = e.findElement('.chattext'))) { 
    e.die(); 
    $('dbg').insert('<div>enter pressed</div>') 
} 
}) 
Questions connexes