JavaScript窗口.元素没有定义,如果主机名在IE上没有'为什么

JavaScript window.Element is not defined if hostname doesn't have a dot on IE. Why?

本文关键字:IE 为什么 主机 元素 窗口 定义 JavaScript 如果      更新时间:2023-09-26

我有以下html代码:

<!DOCTYPE html>
<html>
<head>
<title>
Test window.Element
</title>
</head>
<body>
<script>
alert(window.Element);
</script>
</body>
</html>

该页面托管在远程机器上的IIS中。如果我使用如下所示的主机名访问该页面http://testserver/index.html,则警报会告诉我该窗口。元素未定义。如果我像这样访问页面http://testserver.com/index.html(也就是说,我在主机名中包含了一个点),那么窗口。元素实际上是一个有效的对象。

所以,我的第一个问题是,为什么IE 11(不确定其他版本)做这样的事情?

我需要窗户的原因。元素是因为我正在处理一些遗留代码,这些代码试图为旧版本的ie设置eventlistener,如下所示:

!window.addEventListener && Element.prototype && function (a) { 
/* setup event listeners an old-fashioned way */
}

因为当主机名没有点时Element是未定义的,所以这段代码会崩溃。我还想知道是否有更好的方法来检查不支持addEventListener的旧版本IE ?

加载每个页面,然后:

  1. 加载页面后,使用F12工具的"仿真"选项卡检查文档模式。
  2. 右键单击该页面,选择"属性",然后检查区域。

我想你会发现页面加载在不同的安全区域,这取决于点。由于不同的区域,您将获得不同的文档模式,并看到与您描述的类似的行为差异。

不带点的主机名被解释为网络引用,通常在Intranet区域加载。这个区域通常被商业和企业用来托管旧的应用程序,因此IE假定您对遗留的兼容性比互操作性更感兴趣。如果我的怀疑是正确的,你的无点URL在IE7标准模式下加载。IE7不支持addEventListener(支持在IE9中添加)。

默认情况下,带点的主机名在Internet区域中加载,这假定您希望标准互操作性和标准遵从性,因此您的页面以Edge模式加载。Edge模式支持addEventListener,所以你以后的代码可以正常工作。

对于不支持addEventListener的旧版本IE,请使用attachEvent。本文中展示的registerEvent样例函数是一个合理的开始。整个概念被称为文档兼容性,它很快就会让人感到困惑。

最初的想法是让web开发人员有机会选择最适合他们需求的焦点。不幸的是,实现是如此的灵活,它变得混乱。
希望这对你有帮助。

—Lance

注:如果您需要在不同的安全区域(例如Internet区域)加载内网页面,您可以使用web标记来完成此操作。