7

我目前只是在我的 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");

有人有什么想法吗?

4

3 回答 3

17

jQuery 团队在某些情况下使用异常来实现逻辑流。请参阅我针对 WinJS 应用程序的相同问题提交的此错误:http: //bugs.jquery.com/ticket/14123

由于处理了异常,他们不认为这是一个问题。我这样做了,因为它使调试应用程序变得更加困难,而没有设置“抛出中断”。

所以,这就是问题所在。你无能为力。

于 2013-07-11T12:25:46.407 回答
1

除了消息,还有什么问题吗?正如评论所说,“这应该失败并出现异常。” 异常由assert()方法处理,不应导致程序终止。Visual Studio 中应该有一个选项来仅显示未处理的异常。

更多信息:此页面描述了如何在 Visual Studio 中找到“JavaScript 首次机会例外”设置,将其关闭应该会消除您所看到的内容。请注意,如果您正在调试 Promise,您可能不想将其关闭,链接中的文章进一步讨论了它。但我相信 jQuery 在这种情况下会正确处理异常,如果您没有在调试器中运行,您将看不到该消息。

于 2013-03-05T04:19:03.473 回答
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;
    }
}

令人沮丧,是吧!?

于 2013-03-14T09:25:44.253 回答