Javascript IE不在具有一个字段的窗体上触发键盘事件

Javascript IE不在具有一个字段的窗体上触发键盘事件,javascript,html,events,Javascript,Html,Events,我在这里看到我朋友的密码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> Check action </TITLE> <script> function detectEvent(){ if(window.event.keyCode==13) {

我在这里看到我朋友的密码

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> Check action </TITLE>

<script>

    function detectEvent(){
    if(window.event.keyCode==13)
        {
            alert("you hit return!");
        }

    }
</script>


</HEAD>

<BODY>
    <form name="name1" onkeyup="detectEvent()" action="page2.html">
        <p> Field1
            <input type="text" id="text1"/>
        </p>
    </form>
</BODY>
</HTML>

检查动作
函数detectEvent(){
if(window.event.keyCode==13)
{
警惕(“你点击了回车键!”);
}
}
字段1

当他尝试在文本框中输入一个值并按下enter键时,它没有调用DetecteEvent()。我说,它总是会在输入按钮上调用onSubmit。。。。。 他让我吃惊

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> Check action </TITLE>

<script>

    function detectEvent(){
    if(window.event.keyCode==13)
        {
            alert("you hit return!");
        }

    }
</script>


</HEAD>

<BODY>
    <form name="name1" onkeyup="detectEvent()" action="page2.html">
        <p> Field1
            <input type="text" id="text1"/>
        </p>
        <p> Field1
            <input type="text" id="text2"/>
        </p>
    </form>
</BODY>
</HTML>

检查动作
函数detectEvent(){
if(window.event.keyCode==13)
{
警惕(“你点击了回车键!”);
}
}
字段1

字段1

现在按enter键,函数将被调用。。。。。 为什么会这样


为什么不在只有一个字段的表单上调用onKeyUp呢。!!!我遗漏了什么吗?

事件的顺序是:

keydown
keypress
submit
keyup
因此,当调用
keyup
处理程序时,表单已经开始提交。如果表单的
操作
是本地文件系统上的
page2.html
,那么在调用
keyup
之前,它将快速导航并可能离开页面;另一方面,将
操作设置为外部站点,
键控
将有时间触发

添加第二个输入字段是另一个问题:在这种情况下,根本不提交表单。这是一个奇怪的历史怪癖,浏览器会提交一个只有一个输入且没有提交按钮的表单,但拒绝提交一个有多个输入且没有提交按钮的表单。这可以追溯到HTML 2.0规范:

当表单中只有一个单行文本输入字段时,用户代理应接受在该字段中输入作为提交表单的请求

HTML2.0没有指定在任何其他情况下是否应接受Enter来提交表单(其目的似乎只是为了复制古老的
元素的功能),但当时的浏览器似乎认为这意味着在有多个字段的情况下不应该输入提交,但任何提交按钮都会导致输入提交。IE和其他后来的浏览器复制了这种奇怪的行为

无关点:依赖于
window.event
使得代码只是不必要的IE。对于所有其他浏览器,事件对象作为参数传递给事件处理程序函数。您可以在HTML中执行
onkeyup=“detectEvent(event)”
,然后在
detectEvent
函数中使用该参数,这两种模型都适用,因为使用了局部参数
event
或全局
窗口。event
。但通常的方法是丢失事件处理程序属性并从JavaScript分配:

<form action="page2.html" id="enterform">
    <p> Field1
        <input type="text" id="text1">
        <!-- Note: *no* trailing slash - the doctype says HTML4, not XHTML -->
    </p>
</form>

<script type="text/javascript">
    document.getElementById('enterform').onkeyup= function(event) {
        if (event===undefined) event= window.event; // for IE
        if (event.keyCode===13)
            alert('You pressed Enter');
    };
</script>

字段1

document.getElementById('enterform')。onkeyup=函数(事件){ if(event==未定义)event=window.event;//用于IE 如果(event.keyCode===13) 警报(“您按下了Enter键”); };

说了这么多。。。我一般都怀疑是不是把回车键给卡住了。我不太确定你想做什么,但是如果在表单中更改默认按钮是一种常见的情况,那么这肯定不是一种方法,并且会导致各种各样的问题。没有充分的理由让您在表单上捕获Enter键来调用
.submit()

有趣的是,在Google Chrome中,带有第二个输入字段的表单仍然会提交,因此无论有多少字段,它都不会在keyup事件中捕获Enter键


解决方案=使用按键或向下键。

我同意你的答案,通常你应该有一个提交处理程序,如果表单不应该提交,它会返回false。然而,我编写了很多ajax代码,不仅仅是提交表单和刷新页面。因此,不必担心设计,bobince得到了正确的答案,您需要为他们列出keydown事件,因为当提交事件被取消时,key事件被取消fired@bobince谢谢!这就解释了这种行为。。但当时的浏览器似乎认为这意味着在有多个字段的情况下不应该输入提交,但任何提交按钮都会导致输入提交。IE和其他后来的浏览器复制了这种奇怪的行为。不是铬的情况。,。。chrome按enter按钮提交表单。!我在哪里可以了解更多关于html事件优先级的信息?w3schools似乎没有谈论优先事项。不幸的是,没有,我不知道这方面的任何参考资料(当然不是在总是不可靠的w3schools!)。HTML5规范花了一些时间来指定事件的作用,但它的可读性不强,也没有涵盖这种情况。一般来说,如果没有取消,主事件的“默认操作”是触发激活事件。因此,
keypress
是主键事件,默认情况下会触发默认按钮上的
单击
(或者如果没有按钮,则直接
提交
)。类似地,
单击
是导致按钮或链接激活的主鼠标事件(可能会调用更多事件)而
mousedown
mouseup
则不是。如果您不确定某个案例,最好在页面上放置一个文本区域,让每个事件处理程序在其
值中添加一行,如
单击调用
,以便您可以按顺序记录事件。我只为IE编写代码。但是,是的,我朋友昨天在chrome上测试了这个行为,它没有捕捉到按键事件。