【问题标题】:$(window).keypress(function()) does not work in IE7?$(window).keypress(function()) 在 IE7 中不起作用?
【发布时间】:2013-12-31 20:12:50
【问题描述】:

这个按键事件在 Chrome 和 Firefox 中对我来说很好,但在 IE7 中根本没有被拾取:

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

有人知道 IE7 的替代品吗?

或者它是我的 JavaScript 中更高级别的错误,这意味着它没有在 IE7 中被拾取 - 在这种情况下,我该如何调试它?我在 IE 中打开了脚本错误,但没有弹出任何内容。

【问题讨论】:

  • 本页底部的示例是否适用于 IE7。它对我有用。 api.jquery.com/keypress
  • 使用keydown,它在浏览器中得到更广泛的接受
  • @K Ivanov:不是这样。所有主流浏览器都支持 keydownkeypresskeyup 事件大约 14 年。但是,keypress 确实不会针对所有浏览器中的所有键触发:这就是您的意思吗?

标签: javascript jquery cross-browser


【解决方案1】:

IE 不支持window 上的按键事件。

请将其放在document 上。

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

【讨论】:

  • 这给了我字符:未定义。您如何将结果 (e) 转化为以人类可读的方式按下的键?
  • @Stormie 您能否分享.keypress 弃用的参考资料? doc 似乎没有意识到这一点。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    有几件事可以尝试:

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

    jQuery(function()
    {
        $(window).keypress(function(e)....
    });
    

    这样,在 DOM 完成加载之前,您的事件不会被附加。

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

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

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

    【讨论】:

    • window 立即可用。无需为它做.ready()
    • 谈论你的假设并不能真正帮助别人...... :(
    【解决方案4】:

    我也遇到过这个问题。我发现 IE7 在其事件对象的实现中没有 keyChar 成员。因此,它尝试评估 event.keyChar,得到一个 null 并且什么都不做。相反,keyCode 是模棱两可的,返回 ascii keyChar 或按下的键的键码......呃。由于我不得不捕获特殊键和与字符相关的键,这是我的解决方案。

    onkeydown
    否定 keyCode 并保存在持久对象中

    myObject.kSave=-event.keyCode;
    

    为什么?因为此时你不知道键是字符还是特殊键!!!

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

    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();
    }
    

    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()。

    【讨论】:

    • 请考虑为此创建一个问题,而不是在现有问题中添加一个新问题。
    猜你喜欢
    • 2014-11-24
    • 1970-01-01
    • 2012-02-09
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    相关资源
    最近更新 更多