2010-03-02 3 views
4

Проблема в том, когда я нажимаю клавишу по радиокнопке, элемент MyFunc запускается дважды - один раз для события «onkeypress», в другое время для события «click».Javascript запускает два события - onkeypress и onclick

Вопрос «Почему?» Мне нужно справиться с этим двумя разными способами, но теперь я не могу понять, что такое начальное событие. Когда я нажимаю кнопку мыши, он запускается только для события «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 
} 

Благодарим за помощь!

ответ

0

можно добавить 3-ий параметр вашей функции

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

Теперь добавьте в BOOL к вашим событиям ...

<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 
+0

Проблема в том, что они срабатывают одновременно. Я могу узнать, что было нажато, используя свойство e.type. Он возвращает «keypress» или «click». – podeig

1

onclick События вызывается, когда получает радио-кнопка , Поскольку вы выбираете его, нажимая клавишу, оба события будут запущены. Сначала событие onkeypress, а затем событие onclick.

+0

Но как вы это предотвращаете? –

+0

Вы не можете предотвратить такое поведение, насколько я знаю. – Aurril

+0

Это очень странно. Какой смысл обрабатывать эти события вместе? : -/ – podeig

-1

Используйте onMouseDown вместо onclick в JavaScript и для согласованности добавьте также событие onKeyPress - извлечение события из HTML-тега.

Судо Код:

var myRadioButton = document.getElementById('radio'); 

myRadioButton.addListener("radioClick",onMouseDown); 
myRadioButton.addListener("radioKey",onKeyPress); 

radioClick() 
{ 
//code to do stuff 
} 

Заканчивать JQuery: http://jquery.com/ для фактического кода и простой способ, чтобы написать свой JavaScript.

+0

Я попробую. Я думаю, что я попробовал onMouseDown, но я работал как OnClick. Может быть, addListener помогает. Скоро вернется с результатами. – podeig

+0

Я пробовал это решение с помощью jQuery. Это не помогло. «OnMouseDown» ничего не стрелял. Он просто не называл мою функцию. Если я пользователь «OnClick» с addListener, он дает ту же проблему. Сейчас у меня нет никакого решения. Есть идеи? – podeig

+0

Отлично, что вы упомянули последовательность, но затем вы набросились на нее, предложив фреймворк. Если бы я искал эту проблему через Google, эта страница не возникла бы из-за того, что я -jquery нашел ответы, а не удалял пропускную способность для пользователей. Пожалуйста, придерживайтесь реального JavaScript. – John

0

Я бы создал два отдельных обработчика: один для события click и один для их нажатия.

Затем ваши обработчики могут извлечь все необходимое из события и вызвать третью функцию с общей логикой.

Ваш onkeypress должен игнорировать событие для пробела и вводить ключи. Однако я не понимаю, почему вы слушаете событие нажатия клавиши. Не могли бы вы уточнить? Если вы объясните, что вы будете делать, возможно, мы сможем быть более полезными.

1

Это можно сделать и не прибегать к каркасам, которые всегда громоздки и медленны. Трюк заключается в том, чтобы записать, какое событие произошло в какой момент времени, а затем поверх этого работать в течение периода времени. Когда вы вызываете в keypress Ивентов click событие срабатывает сразу же после этого, вот список того, как быстро click событие срабатывает после keypress события ...

Chrome 39.0: 0ms

Firefox 31,0 СОЭ: 18 ~ 20ms

И.Е. 11: 2 ~ 4ms

Opera 12.1: 0ms

Хром и (настоящая) Opera не ждут, IE достаточно быстр, и Firefox занимает столько времени, чтобы говорить; диапазон работы с (по крайней мере, на моей системе) составляет 0 ~ 20 мс. Программно я установил предел 50 мс для людей, которые все еще используют junky компьютеры, которые слишком заняты 150 бесполезными процессами в фоновом режиме.

Обратите внимание, что вам нужно будет использовать события глобального уровня window, хотя это, похоже, работает надежно для меня во всех браузерах, о которых я упоминал.

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');} 
} 
0

Если 2 события увольняют во время нажатия клавиши затем проверить event.detail свойство в onClick функции. если event.detail = 0, то это означает, что мышь не была нажата на этот элемент, и мы можем игнорировать его.

0

Ключевым событием является только для пользователей с клавиатурой, чтобы активировать кнопку, но если вы используете кнопку «щелчок», это должно быть единственное событие, которое необходимо активировать, когда оно срабатывает при нажатии пробела. Если у вас есть события на настраиваемом элементе управления, событие «ключ» и «щелчок» могут использоваться и не срабатывать вместе.