IE漏洞触发点击2个按钮?(IE bug triggers click for 2 buttons?

2019-07-29 13:26发布

我试图触发当用户按下Enter提交按钮。 伟大工程除了IE 9,奇怪的事情所有的浏览器是IE坚持也引发了点击另一个按钮我从来没有告诉它。 我是不是做错了什么或如何解决这一问题?

下面是我的代码。 在IE中按enter键触发按预期的方式提交的点击,但由于某些原因也触发了“一些按钮”点击(即使没有我的按键听众):

$('input[type=submit]').click(function () {
    alert('Submit click');
});

//SIMULATE CLICK IF ENTER PRESSED IN SEARCH
$('input[type=text]').keypress(function (event) {
    var keycode = event.keyCode || event.which;
    if (keycode == 13) $('input[type=submit]').click();
});

//ROUTE CLEAR HANDLER
$('button').click(function () {
    alert('Button click');
});

:你可以在这里看到活动的错误http://jsfiddle.net/h64xD/

Answer 1:

这里有几件事情要考虑:

IE9计数<button/>元素为type="submit"默认情况下。 因此,为了使其不提交,你必须明确的:

<button type="button">Some button</button>

如果你这样做,你会发现,模拟click事件现在不会触发<button/>但仍是起火2个事件。 其原因是,因为您没有明确定义的<form/>元素,IE9假定控制如在形式,且因此加压enter在文本框中触发2个事件:

  • 您正在仿效一个
  • 默认的形式提交按钮行为

再这样来解决这个问题,你必须要明确:

<button type="button">Some button</button>
<form><input type="text" /></form>
<input type="submit" value="Submit" />

现在,这些都是你看到在IE的行为的原因。 @MrSlayer的回答迎合停止的第二个问题, keypress事件已圆满处理之后,使用preventDefault()



Answer 2:

回车键有一个默认的行为提交,所以你需要阻止执行默认行为。 因为button标签,默认情况下, type="submit"被按下回车键时,它正在执行按钮。

//SIMULATE CLICK IF ENTER PRESSED IN SEARCH
$('input[type=text]').keypress(function (event) {
    var keycode = event.keyCode || event.which;
    if (keycode == 13)
    {
        event.preventDefault();
        $('input[type=submit]').click();
    }
});


Answer 3:

如何触发表单的提交按钮点击的呢?

$('input[type=text]').keypress(function(e) {
     var keycode = event.keyCode || event.which,
         frm = $(this).closest('form');

     if (keycode == 13) {
          e.stopPropagation();
          frm.submit();
          return false;
     }
     return true;
});

- 编辑 -

更新稍微停止事件传播。



Answer 4:

首先,你不需要手动附加的事件提交表单当用户按下进入 -浏览器已经处理了这一点。

奇怪的是,这是与元素,隐形式的协会的顺序,以及IE浏览器处理按钮作为提交元素的事实做。

尝试更换这些按钮的顺序,以明白我的意思:

<input type="text" />
<input type="submit" value="Submit" />
<button>Some button</button>

当然,浏览器已经指示,听取对文本输入的输入作出响应。 这导致在浏览器中点击相应的提交按钮。 此外,由于你没有明确提供一个form ,或者通过他们彼此关联元素form属性,浏览器正试图使这种关系对你。

在代码中,所述<button>元件被假定为文本输入的提交按钮(因为它是在隐形式的第一提交按钮)。 因此,任何时候你按Enter键上的文本输入,浏览器自然提高了相关按钮的单击事件。

如果重新排列元素,如我上面,我们看到对面发生。 IE相关联的其他<input>与所述文本框元件。 并按Enter键在文本框隐含提高对提交输入的单击事件。

您可以通过比较确认此行为.form各种元素的属性。 举例来说,加入一些id值会给我们这些更容易获得:

<button id="fiz">Some Button</button>
<input  id="foo" type="text" />
<input  id="bar" type="submit" value="Submit" />

然后运行一些快速的比较:

var button = document.getElementById("fiz"); 
var text = document.getElementById("foo"); 
var submit = document.getElementById("bar"); 

button.form === text.form;   // true 
submit.form === text.form;   // true 
button.form === submit.form; // true 

所以,最后,它给您取出两个按钮之间的模糊性,通过声明<button>元素为type='button' ,或通过将其放置在预期的提交按钮之后。



文章来源: IE bug triggers click for 2 buttons?