我正在寻找一个解释为什么特定的修复工作,所以我可以更好地理解正在发生的机制。
我有一个ASP.NET MVC 5应用程序; “一切都工作正常”(TM),直到我允许NuGet更新jQuery包。
然后,当我尝试在IE 10中运行webapp时,我开始收到错误消息/异常:
Unhandled exception at line 3398, column 4 in http://localhost:53242/Scripts/jquery-2.1.0.js
0x800a01b6 - JavaScript runtime error: Object doesn't support property or method 'addEventListener'
Unhandled exception at line 7, column 38 in http://localhost:53242/Scripts/bootstrap.js
0x800a139e - JavaScript runtime error: Bootstrap requires jQuery
我无法使用Firefox和Chrome重新创建。当我在这些浏览器中打开页面时,Firefox 27和Chrome 31都没有抛出这些错误。
这是jquery-2.1.0.js的相关部分
jQuery.ready.promise = function( obj ) {
if ( !readyList ) {
readyList = jQuery.Deferred();
// Catch cases where $(document).ready() is called after the browser event has already occurred.
// we once tried to use readyState "interactive" here, but it caused issues like the one
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
setTimeout( jQuery.ready );
} else {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", completed, false ); //This is line 3398
// A fallback to window.onload, that will always work
window.addEventListener( "load", completed, false );
}
}
return readyList.promise( obj );
};
我找到的修复是添加此行
<meta http-equiv="X-UA-Compatible" content="IE=edge;chrome=1" />
到我的<head>
文件的_LayoutBootstrap.cshtml
。
为什么将meta
标记添加到文档的head
会解决我看到的错误?
给出的解释是标签“强制IE使用它可以使用的最佳模式”。假设这是正确的,这是什么意思,为什么IE没有能够找到没有该标签的正确行为?
full detail here中描述的问题以及在不受支持的IE 8中具有相同问题的其他人。如果您感到好奇,重新创建的步骤大约包含在帖子中的2/3。
答案 0 :(得分:4)
它解决了您的问题,因为通过添加兼容性标志,您强制浏览器进入最新版本而不是允许它选择兼容模式(这是IE7模式,jquery 2.x不支持)< / p>
IE默认为兼容模式,具体取决于您在浏览器中设置的设置。例如,默认情况下,Intranet站点(本地网站)将以兼容模式自动打开。
当使用较旧版本的IE(IE&lt; 10)时,您应该使用条件注释来包含1.1x版本的jquery,这将完全避免此问题,允许您的用户使用他们想要的任何浏览器而无需修改其设置以正确使用您的应用程序。