jQuery 1.9 浏览器检测

Posted

技术标签:

【中文标题】jQuery 1.9 浏览器检测【英文标题】:jQuery 1.9 browser detection 【发布时间】:2013-01-10 18:53:45 【问题描述】:

在早期版本中,我曾经测试是否应该在页面加载时手动触发popstate,因为 Chrome 会在加载后立即触发,而 Firefox 和 IE 则不会。

if ($.browser.mozilla || $.browser.msie) 
    $(window).trigger('popstate');

现在他们在 1.9 中删除了浏览器对象,我应该如何测试这些浏览器?或者我如何确定是否需要在页面加载时popstate

代码是:

$(function()
    $(window).on('popstate', popState);

    // manual trigger loads template by URL in FF/IE.
    if ($.browser.mozilla || $.browser.msie) 
       $(window).trigger('popstate');
    
);

更新

为此:

    function popState(e)
        var initial = e.originalEvent === undefined || e.originalEvent.state === null;
        if(!initial)
            activateRoute(
                key: e.originalEvent.state.key,
                settings: e.originalEvent.state.settings
            ,'replace');
        
    

    function init()
        $(window).on('popstate', popState);

        $(function()
            var route = getRoute(document.location.pathname);
            activateRoute(route, 'replace');
        );
    

【问题讨论】:

您能否改为监听该事件,如果它在页面加载触发它之前没有发生? 请注意,Chrome 的行为是错误的。不过,规格已修复,根据此:w3.org/Bugs/Public/show_bug.cgi?id=18605我实际上不知道那张票在说什么,但我的已作为副本关闭:w3.org/Bugs/Public/show_bug.cgi?id=18405 【参考方案1】:

我想把这段代码给你了。如果您需要根据您的要求进行更改,请不要忘记进行更改。

var matched, browser;

// Use of jQuery.browser is frowned upon.
// More details: http://api.jquery.com/jQuery.browser
// jQuery.uaMatch maintained for back-compat
jQuery.uaMatch = function( ua ) 
    ua = ua.toLowerCase();

    var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
        /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
        /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
        /(msie) ([\w.]+)/.exec( ua ) ||
        ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
        [];

    return 
        browser: match[ 1 ] || "",
        version: match[ 2 ] || "0"
    ;
;

matched = jQuery.uaMatch( navigator.userAgent );
browser = ;

if ( matched.browser ) 
    browser[ matched.browser ] = true;
    browser.version = matched.version;


// Chrome is Webkit, but Webkit is also Safari.
if ( browser.chrome ) 
    browser.webkit = true;
 else if ( browser.webkit ) 
    browser.safari = true;


jQuery.browser = browser;

供您参考 - jQuery Docs

我们建议不要使用此属性;请尝试使用功能 代替检测(参见 jQuery.support)。 jQuery.browser 可以移动到 jQuery 未来版本中的插件。

jQuery.browser

jQuery.support

【讨论】:

从浏览器重新插入代码不是答案...不是嗅探是。另外,请注明那段巨大的代码,或在 github 存储库中链接到它。那是许可代码。【参考方案2】:

您应该为您的popstate 处理程序添加一点健全性检查,并确保如果您“弹出”到您开始时的相同状态,它不会做任何昂贵的事情。然后您就不必关心浏览器了,相反,只需在文档就绪时调用您的 popstate:

$(function()
    $(window).on('popstate', popState);

    // call popstate on document ready
    $(popstate);
);

建议您将 $.browser 中的代码粘贴回您的环境的答案对于支持不良做法来说太过分了。您可以检测 99% 的您需要的东西。几乎每次使用$.browser 都是危险的。 几乎总有办法检测到这一点。

javascript 社区长期以来一直反对浏览器嗅探。 Here 是 2009 年的一篇文章,告诉我们为什么这是一个坏主意。还有很多其他的。

我请求你不要将$.browser 复制回你的代码中,jQuery 团队决定取消它是有原因的。

【讨论】:

我没有,我实际上做了类似于你提议的事情。我更新的问题有我得到的解决方案。 另外,我建议您发布最终解决方案的答案,而不是编辑您的问题。这根本不是“糟糕的形式”,实际上是受到鼓励的。 我很欣赏这个答案的最后一行。我正要这样做。 确实如此; “$.browser”已经死了。 jquery 在内部通过“jQuery.support”使用特征检测,但他们强烈建议使用外部库,例如 Modernizr。【参考方案3】:

Here 是解决此问题的快速方法。 将这行代码添加到您的 jQuery-1.9.js 中,并将 $.browser 替换为 jQuery.browser

jQuery.browser = ;
jQuery.browser.mozilla = /mozilla/.test(navigator.userAgent.toLowerCase()) && !/webkit    /.test(navigator.userAgent.toLowerCase());
jQuery.browser.webkit = /webkit/.test(navigator.userAgent.toLowerCase());
jQuery.browser.opera = /opera/.test(navigator.userAgent.toLowerCase());
jQuery.browser.msie = /msie/.test(navigator.userAgent.toLowerCase());

here

【讨论】:

以上是关于jQuery 1.9 浏览器检测的主要内容,如果未能解决你的问题,请参考以下文章

$.browser.msie' 为空或不是对象

使用 JQuery 检测啥浏览器 [关闭]

如何使用 jQuery 检测浏览器类型?

如何使用 jQuery 检测浏览器是不是是 Chrome?

JQuery:检测浏览器调整大小

jQuery 效果