Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events Javascript触发两个事件——onkeypress和onclick_Events_Javascript Events_Onclick_Onkeypress - Fatal编程技术网

Events Javascript触发两个事件——onkeypress和onclick

Events Javascript触发两个事件——onkeypress和onclick,events,javascript-events,onclick,onkeypress,Events,Javascript Events,Onclick,Onkeypress,问题是,当我在单选按钮上按一个键时,元素MyFunc会触发两次——一次用于“onkeypress”事件,另一次用于“click”事件 问题“为什么?”我需要用两种不同的方式来处理这个问题,但现在我无法识别最初的事件是什么。当我点击鼠标时,它只为“点击”事件而触发 专题1 专题2 函数MyFunc(e,obj){ 警报(e.type);//警报“按键”然后“单击” //做我的事 } 谢谢你的帮助 您可以在函数中添加第三个参数 function MyFunc(e, obj, click)

问题是,当我在单选按钮上按一个键时,元素MyFunc会触发两次——一次用于“onkeypress”事件,另一次用于“click”事件

问题“为什么?”我需要用两种不同的方式来处理这个问题,但现在我无法识别最初的事件是什么。当我点击鼠标时,它只为“点击”事件而触发

  • 专题1 专题2
函数MyFunc(e,obj){ 警报(e.type);//警报“按键”然后“单击” //做我的事 }

谢谢你的帮助

您可以在函数中添加第三个参数

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
主题1
专题2

选中单选按钮时,将触发
onclick
事件。因为您是通过按键选择的,所以这两个事件都将被触发。首先是
onkeypress
事件,然后是
onclick
事件。

在JavaScript中使用onMouseDown而不是onclick,为了保持一致性,在此处也添加onkeypress事件-将事件从HTML标记中删除

Sudo代码:

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

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

radioClick()
{
 //code to do stuff
}

查看jQuery:了解编写JavaScript的实际代码和简单方法。

我将创建两个单独的处理程序:一个用于单击事件,另一个用于按键

然后,处理程序可以从事件中提取所需的任何内容,并调用具有公共逻辑的第三个函数


您的onkeypress必须忽略空格的事件并输入键。我不明白你为什么要听按键事件。你能详细说明一下吗?如果你解释一下你将要做什么,也许我们会更有帮助。

这是可以做到的,而不必求助于总是笨重而缓慢的框架。诀窍是记录在什么时间点发生的事件,然后在此基础上在一个时间范围内工作。当您触发
按键
事件时,
点击
事件随后立即触发,下面列出了
按键
事件之后触发
点击
事件的速度

铬合金39.0:0毫秒

Firefox 31.0 ESR:18~20ms

IE 11:2~4ms

歌剧12.1:0毫秒

Chrome和(real)Opera不必等待,IE速度相当快,可以说Firefox需要时间;可以使用的范围(至少在我的系统上)是0~20毫秒。以编程方式,我将为仍在使用垃圾计算机的人设置50毫秒的限制,因为他们在后台忙于处理150个无用的进程

注意,您必须使用
窗口
全局级别的事件,尽管这似乎在我提到的所有浏览器中都能可靠地工作

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');}
}
var option=new function(){this.name='';}
window.onclick=函数(事件)
{
option.clickDate=新日期().getTime();
}
window.onkeypress=功能(事件)
{
option.keyCode=event.keyCode;
option.keyCodeDate=新日期().getTime();
}
函数MyFunc(e,obj)
{
如果(option.keyCodeDate&&option.clickDate&&
(
(option.clickDate-option.keyCodeDate)>=0&&

(option.clickDate-option.keyCodeDate)如果在按键过程中触发了两个事件,则在
onClick
函数中选中
event.detail
属性。 如果
event.detail=0
,则表示鼠标未单击该元素,我们可以忽略它。

按键事件是仅键盘用户激活按钮的事件,但如果您使用的是按钮,则“单击”应该是唯一需要的事件,因为它在按空格键时被触发。如果自定义控件上有事件,“按键”事件和“单击”既可以使用,也不会同时触发。

但如何防止这种情况发生?据我所知,你无法阻止这种行为。这很奇怪。一起处理这些事件有什么意义?:-/我会试试。我想我试过使用MouseDown,但我像OnClick一样工作。也许addListener会有帮助。很快会有结果。我已经使用jQuery尝试此解决方案。它没有帮助。“OnMouseDown”没有激发任何东西。它只是没有调用我的函数。如果我使用“OnClick”对于addListener,它给出了同样的问题。我现在没有任何解决方案。有什么想法吗?很好,你提到了一致性,但后来你建议了一个框架,把它搞砸了。如果我通过谷歌搜索这个问题,这个页面就不会出现,因为我-jquery是为了找到答案,而不是把带宽浪费在用户身上。请坚持使用真正的Java问题是它们同时启动。我可以使用e.type属性识别单击的内容。它返回“keypress”或“click”。
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');}
}