JavaScript窗口.元素没有定义,如果主机名在IE上没有'为什么
JavaScript window.Element is not defined if hostname doesn't have a dot on IE. Why?
我有以下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 ?
加载每个页面,然后:
- 加载页面后,使用F12工具的"仿真"选项卡检查文档模式。
- 右键单击该页面,选择"属性",然后检查区域。
我想你会发现页面加载在不同的安全区域,这取决于点。由于不同的区域,您将获得不同的文档模式,并看到与您描述的类似的行为差异。
不带点的主机名被解释为网络引用,通常在Intranet区域加载。这个区域通常被商业和企业用来托管旧的应用程序,因此IE假定您对遗留的兼容性比互操作性更感兴趣。如果我的怀疑是正确的,你的无点URL在IE7标准模式下加载。IE7不支持addEventListener(支持在IE9中添加)。
默认情况下,带点的主机名在Internet区域中加载,这假定您希望标准互操作性和标准遵从性,因此您的页面以Edge模式加载。Edge模式支持addEventListener,所以你以后的代码可以正常工作。
对于不支持addEventListener的旧版本IE,请使用attachEvent。本文中展示的registerEvent样例函数是一个合理的开始。整个概念被称为文档兼容性,它很快就会让人感到困惑。
最初的想法是让web开发人员有机会选择最适合他们需求的焦点。不幸的是,实现是如此的灵活,它变得混乱。
希望这对你有帮助。
—Lance
注:如果您需要在不同的安全区域(例如Internet区域)加载内网页面,您可以使用web标记来完成此操作。
- 为什么这在IE中的工作方式与在Firefox中不同
- 为什么我得到错误IE修剪方法是't支持
- 为什么Telerik cdn在IE中不起作用
- 为什么我的上下文选择器和.buttonset()在ie中花费了这么长时间
- 为什么这个按钮在IE中有效,但在Firefox中无效
- 对于Ajax调用,为什么innerHTML没有显示在IE中
- 为什么这个书签脚本是't在IE工作
- 为什么我的网站在IE中是空白屏幕?(包括IE9!
- 为什么我的脚本应该只在 IE 上触发时在 Mozilla 上触发
- 为什么IE浏览器不喜欢我的点击事件
- 为什么IE JavaScript断点在Visual Studio 2013中停止工作
- 为什么这会在IE 11中引发异常
- 为什么对img标记的前向引用在Chrome上失败,但在FireFox和IE上有效
- IE与我的javascript后台更改代码配合得更好.为什么?
- 为什么setTimeout在Chrome中触发两次,而在IE或Firefox中却没有
- 为什么在IE和Chrome中提交表单不起作用
- 为什么在Firefox中后台不会改变,但在IE中会改变
- 为什么这个表达式在 Firefox/Chrome 中返回 true,而在 IE 中返回 false
- 为什么IE不支持在现有应用程序中使用的iFrame js和css文件
- Javascript适用于Firefox而不是IE.为什么