Javascript generato due eventi – onkeypress e onclick

Problema è quando devo premere un tasto su un pulsante di opzione, elemento MyFunc si attiva due volte – una volta per “onkeypress”, un evento, un’altra volta per l’evento “click”.

Domanda “Perché?” Ho bisogno di gestire questo in due modi diversi, ma ora non riesco a riconoscere quello iniziale dell’evento. Quando faccio clic su un mouse spara solo per l’evento “click”.

<ul>
    <li>
        <input type="radio" onkeypress="MyFunc(event, this)" onclick="MyFunc(event, this)" name="myList" id="MyId_1" />Topic 1
        <input type="radio" onkeypress="MyFunc(event, this)" onclick="MyFunc(event, this)" name="myList" id="MyId_2" />Topic 2
    </li>
</ul>

function MyFunc(e, obj) {
    alert(e.type); //alerts "keypress" and then "click"
    //Do my stuff
}

Grazie per l’aiuto!

OriginaleL’autore podeig | 2010-03-02

7 Replies
  1. 1

    Si può fare e senza ricorrere a quadri, che sono sempre più ingombrante e lento. Il trucco è quello di registrare gli eventi in quale momento e poi in cima a quello di lavorare all’interno di un lasso di tempo. Quando si attiva la keypress evento il click evento viene attivato subito dopo, ecco un elenco di quanto velocemente il click evento viene attivato dopo il keypress evento…

    Chrome 39.0: 0ms

    Firefox 31.0 ESR: 18~20ms

    IE 11: 2~4 ms

    Opera 12.1: 0ms

    Chrome e (reale) Opera non aspettare, vale a dire è ragionevolmente veloce e Firefox prende il tempo per così dire; la gamma di lavorare con (almeno sul mio sistema) è 0~20 ms. A livello di programmazione io impostato il limite a 50ms per le persone ancora utilizzando drogato di computer che sono troppo occupati con il 150 processi inutili in background.

    Nota dovrete utilizzare il window livello globale di eventi anche se questo sembra funzionare in modo affidabile per me in tutti i browser che ho citato.

    var option = new function() {this.name = '';}
    
    
    window.onclick = function(event)
    {
     option.clickDate = new Date().getTime();
    }
    
    
    window.onkeypress = function(event)
    {
     option.keyCode = event.keyCode;
     option.keyCodeDate = new Date().getTime();
    }
    
    
    function MyFunc(e,obj)
    {
     if (option.keyCodeDate && option.clickDate && 
     (
      (option.clickDate - option.keyCodeDate)>=0 && 
      (option.clickDate - option.keyCodeDate)<51)
     {alert('keypress event');}
     else {alert('click event');}
    }

    OriginaleL’autore John

  2. 1

    Il onclick Evento viene generato quando il pulsante viene selezionato. Dal momento che si seleziona premendo un tasto, entrambi gli eventi verrà licenziato. Prima il onkeypress evento e quindi l’ onclick evento.

    Ma come si fa a impedire che ciò si verifichi?
    Non è possibile evitare questo comportamento a quanto ne so.
    È molto strano. Qual è il punto per gestire questi eventi insieme? :-/

    OriginaleL’autore Aurril

  3. 0

    è possibile aggiungere un 3 ° parametro per la funzione

    function MyFunc(e, obj, click) {
        if (click) { } //do stuff
        else { } //do other stuff
    }

    Ora aggiungere in una bool per i tuoi eventi…

    <input type="radio" onkeypress="MyFunc(event, this, false)" onclick="MyFunc(event, this, true)" name="myList" id="MyId_1" />Topic 1
    <input type="radio" onkeypress="MyFunc(event, this, false)" onclick="MyFunc(event, this, true)" name="myList" id="MyId_2" />Topic 2
    Il problema è che il fuoco contemporaneamente. Sono in grado di riconoscere ciò che è stato fatto clic con e.tipo di proprietà. Ritorna la “pressione” o “click”.

    OriginaleL’autore hunter

  4. 0

    Vorrei creare due gestori separati: uno per l’evento click e uno per essi la pressione di un tasto.

    Quindi il tuo gestori in grado di estrarre qualsiasi cosa avete bisogno dalla manifestazione e la chiamata di una terza funzione che ha la logica comune.

    Tuo onkeypress dovrebbe ignorare l’evento per lo spazio e inserire le chiavi. Non capisco perché si sta ascoltando l’evento keypress. Puoi spiegarti meglio? Se spieghi cosa intendi fare, forse ci può essere più utile.

    OriginaleL’autore Juan Mendes

  5. 0

    Con 2 eventi vengono sparati durante la pressione di un tasto, quindi controllare event.detail proprietà in onClick funzione.
    se event.detail = 0 allora significa che il mouse non è stato fatto clic sull’elemento e possiamo ignorarlo.
    evento.dettagli

    OriginaleL’autore pooja sharma

  6. 0

    Un evento chiave per la tastiera solo agli utenti di attivare un pulsante, ma se si sta utilizzando un pulsante “click” dovrebbe essere l’unico evento necessario, in quanto viene licenziato quando si preme la BARRA spaziatrice. Se si dispone di eventi di un controllo personalizzato, “chiave” evento e “fare clic su” entrambi possono essere usati e non sparare insieme.

    OriginaleL’autore Vincent Young

  7. -1

    Utilizzare onMouseDown invece di onclick JavaScript e per la coerenza di aggiungere evento onKeyPress anche qui – con un evento fuori del tag HTML.

    Sudo Codice:

    var myRadioButton = document.getElementById('radio');
    
    myRadioButton.addListener("radioClick",onMouseDown);
    myRadioButton.addListener("radioKey",onKeyPress);
    
    radioClick()
    {
     //code to do stuff
    }

    Check out jQuery: http://jquery.com/ per il codice effettivo e facile modo di scrivere JavaScript.

    Voglio provare. Penso di aver provato onMouseDown, ma ho lavorato come OnClick. Forse addListener aiuta. Tornerà presto con i risultati.
    Ho provato questa soluzione utilizzando jQuery. Questo non ha aiutato. “OnMouseDown” non ha sparato nulla. Semplicemente non chiamare la mia funzione. Se io utente “OnClick” con addListener dà lo stesso problema. Non ho alcuna soluzione in questo momento. Tutte le idee?
    Grande che hai citato consistenza, ma poi è bombardato da suggerire un quadro. Se avessi cercato questo problema grazie a Google in questa pagina non sarebbe venuto perché ho -jquery per trovare le risposte, non scaricando la larghezza di banda per gli utenti. Si prega di bastone reale JavaScript.

    OriginaleL’autore Todd Moses

Lascia un commento