我试图触发当用户按下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/
这里有几件事情要考虑:
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()
回车键有一个默认的行为提交,所以你需要阻止执行默认行为。 因为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();
}
});
如何触发表单的提交按钮点击的呢?
$('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;
});
- 编辑 -
更新稍微停止事件传播。
首先,你不需要手动附加的事件提交表单当用户按下进入 -浏览器已经处理了这一点。
奇怪的是,这是与元素,隐形式的协会的顺序,以及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'
,或通过将其放置在预期的提交按钮之后。