检测jQuery不支持的浏览器(2)

时间:2013-08-06 17:59:01

标签: jquery jquery-2.0

如果对这个问题有明显的答案,请原谅我,但我还没能找到它。我正在考虑转换到jQuery 2,尽管我并不担心支持旧浏览器,但我希望能够告诉用户使用不受支持的浏览器他们无法使用该网站。

我在这里看到(http://blog.jquery.com/2013/03/01/jquery-2-0-beta-2-released/)您可以使用条件注释在不同版本的IE上分支.js文件,但我相信jQuery 2.0也会支持其他一些浏览器,而不仅仅是IE,所以我不认为会单独执行此操作[编辑:这是错误的,请参阅下面的更大编辑]。

在理想的世界中,我切换到jQuery 2,然后在jQuery告诉我它不支持浏览器时调用一个javascript函数。是否有一种直截了当的方式来做到这一点我错过了?

感谢。

修改

我发现了这篇文章(http://bugs.jquery.com/ticket/13404),它指示我:http://jquery.com/browser-support/。事实证明,就支持而言,jQuery 2仅与IE浏览器上的jQuery 1.9不同。因此,或许更好的问题是如何检测jQuery不支持的浏览器(通常,不仅仅是版本2) - 我已经更新了问题标题。

EDIT2:

由于特征检测是此问题最常推荐的方法,因此jQuery支持方法在此处看起来很相关(http://api.jquery.com/jQuery.support/)。然而,依赖它似乎也很不合理(因为它可以在不事先通知的情况下改变)。

我认为这会产生关键问题。 我怎么知道jQuery的功能是什么或者不受旧浏览器的潜在不支持?例如,如果有人带着4版本的旧版本访问该网站Firefox,我不会任何想法我需要测试哪些功能。如果jQuery可以为HTML5提供某种完全支持的功能测试,那将是一件好事:http://html5test.com/

EDIT3:

好的,使用条件包含语句(在下面的答案和jQuery网站上突出显示),您可以处理旧版本的IE。但是,对于其他浏览器,它有点棘手。既然你不能依赖jQuery告诉你关于浏览器对函数x,y或z的支持,我的方法就是查询底层的javascript。如果要查询基于CSS的支持,可以使用modernizr。对于基于javascript的支持,这是我用来检测其他浏览器的旧版本的方法:

function browser_ok() {

    if  (
            ( !Array.prototype.indexOf ) ||
            ( !Array.prototype.forEach ) ||
            ( !String.prototype.indexOf ) ||
            ( !String.prototype.trim ) ||                
            ( !Function.prototype.bind ) ||
            ( !Object.keys ) ||
            ( !Object.create ) ||
            ( !JSON ) ||
            ( !JSON.stringify ) ||
            ( !JSON.stringify.length ) ||
            ( JSON.stringify.length < 3 )
        )
    {
        return false;
    }

    // # local storage support
    // source: http://diveintohtml5.info/storage.html

    try {
        var local_storage_support = ( 'localStorage' in window && window['localStorage'] !== null );
        if ( !local_storage_support ) {
            throw new Error("local_storage_support: failed");
        }
    }
    catch ( e ) {
        return false;
    }

    // # AJAX uploads

    if ( !window.FormData || !window.FileReader ) {
        return false;
    }

    // # HTML data elements

    var body = $("body");
    body.data("browser_support_test",42);
    if ( body.data("browser_support_test") !== 42 ) {
        return false;
    }
    else {
        body.removeData("browser_support_test");
    }

    return true;
}

AFAICT,此功能应该消除所有可能因其基本功能而给jQuery带来麻烦的浏览器。如果你想做任何奇特的事情,那么你可能知道自己需要的特定功能,所以你可以专门检查它。

2 个答案:

答案 0 :(得分:9)

在支持IE 6,7和8的同时获得jQuery 2.0优势的一种方法是使用条件注释:

<!--[if lt IE 9]><script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script><![endif]-->
<!--[if IE 9]><!--><script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script><!--<![endif]-->
<script>window.jQuery||document.write('<script src="jquery.js"><\/script>');</script>
  • 第一个条件注释确保为IE&lt;加载jQuery 1.x. 9。
  • 最新版本的jQuery(2.0.3)用于IE 9和浏览器中,其中无法识别条件注释(IE 10不再支持条件注释)。
  • 当jQuery无法从CDN加载时,会加载托管在您服务器上的后备(jquery.js)。

答案 1 :(得分:7)

看起来它只是放弃了对IE 6,7和8的支持 - 你应该可以使用:

HTML:

<!--[if lt IE 9]> <html data-browser="lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html> <!--<![endif]-->

JS:

if( document.documentElement.getAttribute('data-browser') !== null ){
    // not supported by jQuery 2.x
}

如果您决定支持旧浏览器但仍希望jQuery团队包含在2.x中的改进,那么您可以使用1.x版本:http://jquery.com/download/

<强>更新

检测每个不支持jQuery的浏览器很困难/不切实际,原因是jQuery只是一个javascript库。

不同的浏览器和版本过去常常使用不同的方法在javascript中做一些基本的事情(比如ajax),这意味着一些旧的浏览器会支持某些功能而不会支持其他功能。没有直接 此浏览器支持所有功能 此浏览器不支持任何功能 测试

Rob W的建议非常好,为现有浏览器提供新版本(2.x),为旧浏览器提供1.x版本(带有旧版支持)。

查看这篇文章:Graceful degradation versus progressive enhancement并考虑使用Modernizr库。这使您可以检查用户浏览器支持的功能,并允许您编写应用程序以充分利用最新进展,同时仍为旧浏览器的用户提供良好的体验。