javascript - IE 在不支持的代码后不解析任何 JS?

标签 javascript css internet-explorer

我想使用某些 JS 代码,但只能根据浏览器是否支持 @supports (CSS) 和 CSS.supports() (JS) 属性/函数。

现在,Internet Explorer 不支持 CSS.supports() 或 @supports。这很好 - 这个想法是构建 JS 代码,这样,如果浏览器不支持它们中的任何一个,那么它会回退到一个工作版本。

这在所有其他浏览器上都能完美运行,即使是那些不支持 @supports/CSS.supports() 的浏览器。

但在 IE 中,它会一直解析 JS 代码,直到第一次提到 CSS.supports(),然后它就会完全中断,并且不会解析之后的单个字符。

我正在使用 IE 11,这是我正在使用的 JS 代码(我也在使用 jQuery):

$(function() {
    var port = $(window);
    var container = $('html, body');

    if( !CSS.supports("-webkit-overflow-scrolling", "touch") & CSS.supports("perspective", "1px")) {
        var port = $('.prllx');
        var container = $('.prllx');
    };

    // OTHER CODE GOES HERE
});

但是,正如我所说,IE 在 IF 检查后不会读取任何代码。

然后我试着写了一个测试代码,用一个更简单的例子看看会发生什么:

    var helloworld = !CSS.supports("-webkit-overflow-scrolling", "touch");
    $("#test").html(helloworld);            
    if (helloworld == true) {
        $("#test2").html("HELLO WORLD FROM WITHIN IF");         
    };

但 IE 在第一行之后不解析任何内容(我一直在插入 $("#div").html("HELLO WORLD"); 每隔一行查看 IE 在哪一点停止解析 JS,它确实发生在第一次提到 CSS.supports 之后。

我似乎无法理解:在所有其他不支持 CSS.supports() 的浏览器中,IF(在我的第一个示例中)显然会触发 false,并且变量保持不变。但是他们继续解析该实例之后的剩余代码,即使他们不/不能解析 CSS.supports() 因为他们不支持该功能。但是 IE 完全停止解析。

我不得不说我对 javascript 不是特别流利,所以我可能在这里遗漏了一些非常简单的东西 - 或者它实际上可能是一个错误,在这种情况下,我该如何解决它?如果是 IE,如何在不破坏整个代码的情况下检查浏览器是否支持 CSS.supports()?

提前致谢!

最佳答案

任何不具有引用函数的 supports 属性的 CSS 对象的浏览器都将抛出异常,如下所示:

$(function() {
    var port = $(window);
    var container = $('html, body');

    // vv Exception on this line
    if( !CSS.supports("-webkit-overflow-scrolling", "touch") & CSS.supports("perspective", "1px")) {
        var port = $('.prllx');
        var container = $('.prllx');
    };

    // OTHER CODE GOES HERE
});

当函数中抛出未处理的异常时,控制权会转移到函数之外,发生异常的地方后面的代码将不会运行。这不是 IE 的事情,这是 JavaScript 和大多数其他有异常的语言的工作方式。

相反,放置一个守卫检查 CSS 是否存在,如果存在,它是否有一个 supports 是一个函数:

$(function() {
    var port = $(window);
    var container = $('html, body');

    if( typeof CSS === "object" &&
        typeof CSS.supports === "function" &&
        !CSS.supports("-webkit-overflow-scrolling", "touch") &&
        CSS.supports("perspective", "1px")) {
        var port = $('.prllx');
        var container = $('.prllx');
    }

    // OTHER CODE GOES HERE
});

一些主机提供的函数错误地报告typeof。在这种情况下,您可能需要将上面的 === "function" 更改为 !== "undefined"。这是一个较弱的守卫,因为并非所有未定义的东西都是可调用的,但有时主机提供的函数不会按应有的方式报告 "function"


旁注:JavaScript 中的逻辑“与”运算符是 &&(如上),而不是 &&按位“与”运算符(将其操作数强制为 32 位整数并在位级别组合它们)。它之所以重要,主要是因为 && 短路,这意味着如果它的左侧操作数是假的(例如,typeof CSS === "object" 不为真),它根本 不评估其右手操作数,因此我们可以安全地做一些假设左手操作数为真(例如查看 CSSsupport 属性)。

旁注 2:您不要在附加到控制流语句的 block 结束后放置 ;。它无害,但毫无意义。

关于javascript - IE 在不支持的代码后不解析任何 JS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35827537/

相关文章:

javascript - 如何对数组中并不总是具有属性的对象进行排序?

javascript - RxJS 中的 self 修复错误处理

javascript - Accordion 下拉菜单不适用于手机/平板电脑

css - 框阴影 : inset 1px 1px 0px 0px white not working in IE8

html - 如何通过使用相同的填充将内容保留在图像上来保持图像的纵横比

javascript - 重新启动一个 jquery 函数

javascript - 使用 Backbone.js 发布请求中的 header

testing - IE9中的IE7/IE8浏览器/文档模式等同于真正的浏览器吗?

从 VBS 调用的 Javascript 代码在运行时抛出未指定的错误

css - 如何消除 IE 中链接/JavaScript 元素的边框?