获取 SCRIPT5009:'id' 在 Internet Explore IE 11 中未定义

Getting SCRIPT5009: 'id' is undefined in Internet Explore IE 11

我有一个非常简单的脚本 (setUser),它在单击 button.This 脚本时调用,在 chrome 中运行良好,但在 IE 11 中我收到控制台错误。 另一个奇怪的事情是,只有当开发工具 open.It 如果 devtool 未打开时工作正常,我才会收到该错误。

错误是:- SCRIPT5009:'id' 未定义

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        function setUser(eventType){
            console.log(eventType);
        }
    </script>
</head>
<body>
    <button id="vish" onclick="setUser(id)" style="height:40px;width:200px">Click Me</button>
</body>
</html>

对此的简单解决方法是声明一个 变量标识;在 script.But 下方,我需要正确的记录原因,为什么这在 ie11 中不起作用,但在 chrome.And 中同样有效是比我尝试的更好的解决方案

解决方法:- 通过在顶部添加 var id

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript">
        var id;
        function setUser(eventType){
            console.log(eventType);
        }
    </script>
</head>
<body>
    <button id="vish" onclick="setUser(id)" style="height:40px;width:200px">Click Me</button>
</body>
</html>

预计:- 当开发工具在 ie11 中打开时,当我们单击按钮时,我们应该将控制台日志显示为 "vish"

实际结果:- SCRIPT5009:'id' 是未定义的 js 错误

id 只是未定义,如错误消息所述。如果你声明它,错误就消失了,但它不会像你预期的那样表现。如果您声明它,它会以未定义的值存在。你可能想要

onclick="setUser(this.id)"

this.id 表示按钮上下文,而只是 id 试图在全局上下文中找到它。如果您的错误,id 声明 ,而

var id; // or var id=undefined;

声明它,并保留它未定义,所以浏览器至少知道它是一个变量。说 id 未定义 Explorer 表示它未声明。

我相信原因是浏览器搜索变量 命名元素(通过 name 或 id 属性引用;这不是标准的,但浏览器这样做),这实际上在全局上下文中不存在并通过引用查找,Explorer 显然无法处理这种情况。如果它声明为 var,javascript 知道它不是命名元素引用。

下面的示例显示了 non-standard 行为:它应该以错误结束 test is not defined (实际上没有),但是浏览器说 你好.

<input id="test" value="hello">
<script>
  alert(test.value);
</script>

使用 onclick="setUser(this.id)" 应该可以。

但是,更简洁的解决方法是在 JavaScript 中完成所有 onclick 处理:

onload = function() {
  var buttons = document.getElementsByTagName("button");
  for(var i = 0; i < buttons.length; i++) {
    buttons[i].onclick = function() {
      console.log(this.id);
    }
  }
}
<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
    <button id="vish" style="height:40px;width:200px">Click Me</button>
    <button id="vish2" style="height:40px;width:200px">Click Me 2</button>
</body>
</html>

它在 IE11 中不起作用的原因是因为您没有在引发错误的代码块中为 HTML 文档指定文档类型。

如果我将 <!DOCTYPE html> 添加到 HTML 的开头,就像您展示的解决方法一样;它在 IE11 中也适用于我,无需添加 var id;

我不知道确切的原因,但如果没有文档类型,IE 将 运行 页面以怪异模式显示。当浏览器试图将 onclick="setUser(id)" 解析为有效的 JS 代码时,这似乎搞乱了函数范围的确定。

如果文档类型正确,则不会发生这种情况,因此页面可以 运行 处于正确的模式。 如果浏览器 HTML 引擎在使用前不必将 HTML 字符串 setUser(id) 解析为有效的 JS 代码,这也不会发生。因此,这不再是一个常见问题,因为现在的标准是不在 HTML 标签上使用内联事件处理程序属性。

因此,尽可能使用 javascript 进行显式事件绑定,而不是 运行 出现这样的问题,在这种情况下,完全不相关的部分 doctype 会扰乱您的代码。