我目前只是在我的ASP.net网页(实际上是Site.Master文件)中包含jQuery(1.9.1,但旧的1.8.3表现相同)。在IE9 / Win7-64下运行良好,但自从我升级到IE10(仍然是Win7-64)之后,现在当我在本地运行网页,选择Internet Explorer并在Visual Studio中运行时,我遇到了异常。
例外是在jquery-1.9.1.js文件的第4224行。
// Opera 10-12/IE8 - ^= $= *= and empty values
// Should not select anything
div.innerHTML = "<input type='hidden' i=''/>";
if ( div.querySelectorAll("[i^='']").length ) {
rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
}
// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
// IE8 throws error here and will not see later tests
if ( !div.querySelectorAll(":enabled").length ) {
rbuggyQSA.push( ":enabled", ":disabled" );
}
// Opera 10-11 does not throw on post-comma invalid pseudos
div.querySelectorAll("*,:x");
rbuggyQSA.push(",.*:");
jQuery,无论新旧,似乎都无法在Windows 7上正确处理IE10。我在Opera 10-11崩溃,这很有趣。
我也看到了4242的崩溃
if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||
docElem.mozMatchesSelector ||
docElem.webkitMatchesSelector ||
docElem.oMatchesSelector ||
docElem.msMatchesSelector) )) ) {
assert(function( div ) {
// Check to see if it's possible to do matchesSelector
// on a disconnected node (IE 9)
support.disconnectedMatch = matches.call( div, "div" );
// This should fail with an exception
// Gecko does not error, returns false instead
matches.call( div, "[s!='']:x" );
rbuggyMatches.push( "!=", pseudos );
});
以下是其中一个错误:
Exception was thrown at line 4224, column 4 in http://localhost:49928/jquery/jquery-1.9.1.js
0x800a139e - JavaScript runtime error: SyntaxError
Source line: div.querySelectorAll("*,:x");
有人有任何想法吗?
答案 0 :(得分:17)
jQuery团队在某些情况下使用异常来处理逻辑流程。 查看我针对WinJS应用程序提出的相同问题提出的此问题:http://bugs.jquery.com/ticket/14123
自处理异常以来,他们认为不是问题。我这样做,因为它使得调试应用程序的方式更难,而没有“break on throw”设置。
所以,这就是问题所在。你无能为力。
答案 1 :(得分:1)
除了消息之外,出了什么问题?正如评论所说,“这应该失败,但有例外。”该异常由assert()
方法处理,不应导致程序终止。 Visual Studio中应该有一个选项,只显示未处理的异常。
更多信息:This page描述了如何在Visual Studio中找到“JavaScript first chance exceptions”设置,将其关闭可以消除您所看到的内容。请注意,如果您正在调试promise,则可能不希望将其关闭,链接中的文章将进一步讨论它。但我相信jQuery在这种情况下正确处理异常,如果你没有在调试器中运行,你就不会看到消息。
答案 2 :(得分:0)
当调试器设置为在未捕获的错误上中断时,我在Windows 7上的Safari中遇到了同样的问题。问题似乎是调试器期望catch(e)在同一个函数中发生。如果你继续执行语句执行语句,catch(e)确实会在assert()函数中很好地选择错误:
function assert( fn ) {
var div = document.createElement("div");
try {
return fn( div );
} catch (e) {
return false;
} finally {
// release memory in IE
div = null;
}
}
令人沮丧,嗯!?