【问题标题】:Javascript IE error: 'target' is null or not an objectJavascript IE 错误:“目标”为空或不是对象
【发布时间】:2012-11-12 02:03:20
【问题描述】:
document.onkeydown = function(event) {
    var tagName = event.target.tagName;
    if (tagName != 'INPUT' && tagName != 'TEXTAREA' && !event.alt && event.control) {

        if (event.ctrlKey && event.keyCode == 37) {
            if (_this.currentPage > 1) {
                window.location.href = _this.baseUrl.replace(/%page%/i, _this.currentPage + 1);
            }
        } else if (event.ctrlKey && event.keyCode == 39) {
            if (_this.currentPage < _this.pagesTotal) {
                window.location.href = _this.baseUrl.replace(/%page%/i, _this.currentPage - 1);
            }
        }
    }
}

这只会在 IE 8 中给我一个错误:

'target' 为 null 或不是对象

对于那条线var tagName = event.target.tagName;

如何解决。当我按下 Ctrl 或箭头按钮时发生错误。

【问题讨论】:

  • event.target 在 IE8 中不存在。欢迎使用 IE 的旧事件系统。
  • 请你举例说明如何解决这个问题?
  • 使用第三方事件 API 为您处理跨浏览器不兼容问题。这是我的建议。
  • 是的,但我一点也不擅长 Javascript。我需要示例要更改的内容。

标签: javascript internet-explorer javascript-events


【解决方案1】:

IE 不会将event 对象传递给事件处理程序。相反,它们使用window 对象的全局event 属性。所以对于 IE,你应该使用window.event

通常的做法是先测试提供的参数。您还必须考虑到 IE 使用 srcElement 而不是 target 的事实。要考虑所有这些,请使用类似于以下内容的内容:

document.onkeydown = function(event) {
    event = event || window.event;
    var tagName = (event.target || event.srcElement).tagName;
    // Keep up the good work...
}

这应该可以解决问题。

【讨论】:

  • 有一秒钟,它看起来像是直接复制/粘贴。为什么要删除toUpperCase
  • 你知道我以前试过。它没有帮助我。然后它在下一行 var tagName = event.target.tagName; 上给出相同的错误。
  • @user1689607 - 我只是认为人们不应该仍然使用怪癖模式。我绝对希望 OP 使用正确的doctype。 AFAIK,在标准模式下,IE 将以大写形式返回元素的名称。如果我错了,请有人纠正我。
  • IE 有几个边缘情况(我不记得是哪个版本)。
  • 谢谢!下面的附加答案解决了这个问题。
【解决方案2】:

这样做:

event = event || window.event;
var tagName = (event.target || event.srcElement).tagName.toUpperCase();

【讨论】:

  • 相同然后在下一行var tagName = event.target.tagName.toUpperCase();给出相同的错误。
猜你喜欢
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-29
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多