Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.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
Javascript $(窗口).keypress(函数())在IE7中不起作用?_Javascript_Jquery_Cross Browser - Fatal编程技术网

Javascript $(窗口).keypress(函数())在IE7中不起作用?

Javascript $(窗口).keypress(函数())在IE7中不起作用?,javascript,jquery,cross-browser,Javascript,Jquery,Cross Browser,这个按键事件在Chrome和Firefox中运行良好,但在IE7中根本没有出现: $(window).keypress(function(e) { alert('hello world'); }); 有人知道IE7的替代方案吗 或者,在我的JavaScript中,这是一个更高层次的错误,意味着IE7没有检测到它——在这种情况下,我如何调试它?我在IE中打开了脚本错误,但没有出现任何问题 IE不支持窗口上的关键事件 将其放在文档上 $(document).keypress(functio

这个按键事件在Chrome和Firefox中运行良好,但在IE7中根本没有出现:

$(window).keypress(function(e) {
    alert('hello world');
});
有人知道IE7的替代方案吗


或者,在我的JavaScript中,这是一个更高层次的错误,意味着IE7没有检测到它——在这种情况下,我如何调试它?我在IE中打开了脚本错误,但没有出现任何问题

IE不支持
窗口上的关键事件

将其放在
文档上

$(document).keypress(function(e) {
    alert('hello world');
});

有两件事可以尝试:

1:将事件代码包装在document.onready事件中,如下所示:

jQuery(function()
{
    $(window).keypress(function(e)....
});
这样,在DOM完成加载之前,不会附加事件

2:将事件附加到正文或文档而不是窗口:

jQuery(function()
{
    $("body").keypress(function(e)....
    $(document).keypress(function(e)....
});

(我没有理由认为这会起作用,这只是当事件由于某种原因不会一直冒泡回到文档或窗口时我所做的事情。)

目前我没有IE7来测试它,但我相信您必须将事件处理程序分配给$(文档)而不是$(窗口)。比如:

$(document).keypress(function(e) {
    alert("hello world");
});

我也遇到了这个问题。我发现IE7在事件对象的实现中没有keyChar成员。因此,它尝试计算event.keyChar,得到一个null,并且什么也不做。相反,keyCode是不明确的,返回ascii keyChar或按下的键的keyCode。。。啊。由于我必须捕获特殊密钥和绑定到角色的密钥,这就是我的解决方案

onkeydown
对keyCode求反并保存在持久对象中

为什么?因为在这一点上你不知道钥匙是一个字符还是一个特殊的钥匙!!!

onkeypress
如果钥匙是特殊钥匙,onkeypress事件可能不会触发。 因此,我的策略使用onkeyup来处理特殊的键和控制字符,并使用onkeypress来处理控制字符以外的字符。 当键为字符时,event.keyChar包含该字符,且其值大于0。但是,由于IE7没有event.keyChar成员,因此使用event.keyCode作为字符。通过阻止控制字符的默认行为并将处理延迟到onkeyup,可以强制将所有控制字符(例如enter、esc、tab等)作为特殊键进行处理。为了表示角色已被处理,我们必须将保存的对象设置为找到的角色。

onkeyup
将保存的值添加到event.keyCode。如果总和为零,则onkeypress事件不会发生 处理按键,因为按下的键是特殊键或控制字符。 当总和为正数时,由于键是一个字符,因此无需进一步操作 onkeypress事件处理程序已经处理了它

if (myObject.kSave+event.keyCode == 0) {//this is a special key or control character
  event.preventDefault();
  switch(event.keyCode) {
  //handle special keys here
  }
}

最后一件事,在事件处理程序中调用event.preventDefault(),如果您不希望默认处理程序干扰事件处理程序。

本页底部的示例在IE7中适用吗。对我来说是的。使用keydown,它在browsers@K伊万诺夫:不是。大约14年来,所有主要浏览器都支持
keydown
keypress
keypup
事件。但是,
keypress
确实不会在所有浏览器中为所有键触发:这就是你的意思吗?
窗口
立即可用。无需为此做
.ready()
。谈论你的假设并不能真正帮助他人…:(请考虑为这个问题创建一个问题,而不是对现有的问题添加一个新问题。这给了我char:未定义的。你如何将结果(e)变成以人类可读的方式来决定什么键被推?”StMye你能分享对<代码>的引用吗?KEKEPASE/COD> DESTRATION?
var ch = (event.keyChar == null) ? event.keyCode : event.keyChar;
if (ch >=32) {//ch is a character and not a control character
  myObject.kSave = ch; //tells onkeyup that the key was handled
  event.preventDefault(); //don't let default processing mess with your handler
  switch(ch) {
  //your character handler goes here
  }
} else if (ch > 0) {//ch is a control character
  event.preventDefault();
}
if (myObject.kSave+event.keyCode == 0) {//this is a special key or control character
  event.preventDefault();
  switch(event.keyCode) {
  //handle special keys here
  }
}