25

既然 jQuery 1.3 已经被弃用(我假设在未来的版本中被删除)$.browser.msie和类似的,应该如何进行浏览器检测?

我经常使用它来确定我们在哪个浏览器中进行几乎所有浏览器的 CSS 修复,例如:

$.browser.opera
$.browser.safari
$.browser.mozilla

...好吧,我认为这就是全部:)

在我使用它的地方,我不确定是什么浏览器问题导致了问题,因为很多时候我只是试图修复1 px浏览器中的差异。

编辑:使用新的 jQuery 功能,无法确定您使用的是 IE6 还是 IE7。现在应该如何确定这一点?

4

16 回答 16

33

是的,浏览器检测已被弃用,但被弃用的属性可能不会很快从 jQuery 中删除。当它们被删除时,如果您仍然绝对需要进行浏览器检测,您可以使用一个小而简单的插件轻松添加相同的功能。

所以,我的回答是暂时不做任何事情:)

编辑:我什至会为您提供将来使用的插件(未经测试,从 jquery 源复制粘贴):

(function($) {
    var userAgent = navigator.userAgent.toLowerCase();

    $.browser = {
        version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1],
        safari: /webkit/.test( userAgent ),
        opera: /opera/.test( userAgent ),
        msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
        mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
    };

})(jQuery);
于 2009-02-24T09:24:17.517 回答
9

我遇到了类似的情况,没有 $.support.png (p.ej.),所以我需要使用 $.browser.version,也许我们可以继续要求更多的 $.support.XXXX 属性,一样多如所须。

于 2009-01-19T07:52:43.003 回答
8

.browser 已被弃用,取而代之的是 .support。更多信息在这里:jquery.support 这本质上意味着,jquery 现在没有使用浏览器嗅探,而是支持检测,并允许对浏览器可以执行的操作进行更细粒度的控制。

从描述:

在 jQuery 1.3 中添加了一组属性,表示存在不同的浏览器功能或错误。

jQuery 附带了许多属性,您可以随意添加自己的属性。这些属性中的许多都是相当低级的,因此它们在一般的日常开发中是否有用值得怀疑,但主要由插件和核心开发人员使用。

所有支持属性的值都是使用特征检测确定的(并且不使用任何形式的浏览器嗅探)

于 2009-01-18T09:32:59.860 回答
5

功能支持听起来是个好主意,但只有在它支持所有可能的“错误”时才能按预期工作。像第一个评论者一样,没有 $support.png,或 $support.stepping,或 $support.peekaboo,或一个,哦,名单还在继续。这样做的问题是,使一个浏览器兼容的一些代码将不可避免地最终由不需要它的浏览器执行。

于 2009-02-04T17:19:18.110 回答
5

浏览器检测在 jQuery中不被弃用。jQuery.browser的文档页面,其中指出:

我们建议不要使用此属性,请尝试改用特征检测(请参阅 jQuery.support)。

弃用的意思是“计划在未来删除”。这个关于嗅探功能而不是用户代理的建议只是很好的一般建议,而不是特定于 jQuery。他们所说的只是他们让做正确的事情变得更容易。

然而,总是需要用户代理嗅探。除非jQuery.support由大量开发人员每天更新,否则它无法跟上每个浏览器的每个次要版本中的每个错误和每个功能。

我认为对此的困惑源于这样一个事实,即在内部,jQuery 不再进行浏览器嗅探。但实用 API jQuery.browser 将继续存在。

于 2009-11-19T07:07:45.970 回答
4
function browserLessThanIE7(){
   return (/MSIE ((5\\.5)|6)/.test(navigator.userAgent) && navigator.platform == "Win32");
}

也可以正常工作...这个检查版本 5、5.5 和 6。

@Nate:将 (5\.5)|6 更改为 7 并检查版本 7。

于 2009-10-09T14:19:28.893 回答
2

我说从 jQuery 1.2 的代码库对它进行逆向工程。

请参阅代码的这一部分:

jQuery.browser = {
    version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
    safari: /webkit/.test( userAgent ),
   opera: /opera/.test( userAgent ),
  msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
  mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
};

尊重 GPL 和 MIT 许可并从代码中学习。不要复制和粘贴。

或者专门用于嗅出 IE6。你可以这样做:

function IsThisBrowserIE6() {
    return ((window.XMLHttpRequest == undefined) && (ActiveXObject != undefined))
}
于 2009-03-12T21:22:12.823 回答
2

特征检测听起来很不错,但是当我编写一些在某个浏览器中不起作用的代码时,最快的方法是浏览器检测。

使用自动边距将元素水平居中适用于除 IE 之外的所有浏览器。我要测试什么功能?我不知道。但我确实知道它在哪个浏览器中不起作用。

我可以看到为什么特征检测在某些情况下会很有用,例如。如果浏览器处于怪癖/严格模式。最好的折衷办法是同时使用这两种方法。

鉴于此“我们建议不要使用此属性,请尝试使用特征检测”,应该从 jQuery.browser 文档页面中删除。这是误导。

于 2010-03-04T02:01:24.523 回答
2

为什么不能重写 jquery.browser 以在内部使用 jquery.support 来根据功能确定浏览器(可能在需要时补充来自 jquery.browser 的当前方法),以提供一种方便的方式来选择浏览器系列和版本, 虽然可能比今天的 jquery.browser 更可靠?

于 2010-04-21T00:09:16.120 回答
1

jQuery 1.3 已经取代了浏览器测试

坦率地说,我很惊讶 Web 开发人员如此频繁地关心他们的站点在什么浏览器中运行。在 10 多年的 Web 开发中,我能想到一些我关心的案例,更不用说费心去做任何不同的事情了。最常见的原因是 Firefox 和 IE 之间的命名字体大小差异很大(font-size: large在 IE 中比在 FF 中大很多),所以我使用了 IEfix.css 文件来更正它。

也许你应该看看什么更好:CSS hacks 还是浏览器检测?以便就该主题进行更深入的讨论。

总而言之,您应该关心是否支持某个功能,而不是它是哪个浏览器。

如果不知道你为什么关心它是否是 IE,就很难再说什么,因为你可能会发现有一个更好的解决方案来做你正在做的事情。

于 2009-01-18T09:32:48.487 回答
1

在http://code.labor8.eu/geckoFix尝试 GeckoFix 脚本,它会检测低于 3.0 的 Firefox,因此您可以根据需要自定义它(即通过添加更多规则,例如检测 Firefox 2、Firefox 3、Opera 和苹果浏览器)。我认为这可能是您正在寻找的东西。要检查用户代理,只需在地址栏中输入 javascript:alert(navigator.userAgent) 并找到一些您需要输入脚本的特定字符。

于 2009-02-24T09:14:32.407 回答
1

我有一段在 Mozilla 和 Webkit 浏览器以及 IE8 中运行良好的 Javascript。但是,在 6 和 7 中它会中断。这与 CSS 无关,也与糟糕的 Javascript 无关,而是 IE<8 的糟糕支持。

我可以看到人们从哪里来检查“功能”而不是浏览器嗅探,但是,嗅探可用于的功能与破坏代码无关,那么浏览器嗅探和功能嗅探之间有什么区别,直到$.support 对象中的所有功能都可用?

于 2009-05-14T07:25:47.347 回答
1

这可能不是 IE 6 最干净的方式,但它确实有效且易于理解:

$(document).ready(function() {
    ie6catch = $.browser.msie + $.browser.version;
    if (ie6catch.indexOf("true6") == -1) {
        alert("This is not Internet Explorer 6");
    }
});
于 2010-02-23T04:15:14.200 回答
1

我想指出这navigator.userAgent不是很值得信赖,因为它很容易修改并且可能不代表查看页面的实际浏览器。这可能是$.browser最初被弃用的原因之一。

但是为了这个问题,让我们假设浏览器检测是绝对需要的。

我遇到了 James Padolsey 的这个非常酷的片段,它实际上通过使用条件注释来区分 Internet Explorer。

我用上面的代码片段和一些来自yepnope.js的代码编译了一小段代码:

(function(window, doc) {
    window.detector = window.detector || (function() {
        var undef,
            docElement = doc.documentElement,       
            v = 3,
            div = document.createElement('div'),
            all = div.getElementsByTagName('i'),
            isGecko = ( 'MozAppearance' in docElement.style ),
            isGeckoLTE18 = isGecko && !! doc.createRange().compareNode,
            isOpera = !! ( window.opera && toString.call( window.opera ) == '[object Opera]' ),
            isWebkit = ( 'webkitAppearance' in docElement.style ),
            isNewerWebkit = isWebkit && 'async' in doc.createElement('script');

            while (
                div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
                all[0]
            );

            return {
                isGecko: isGecko,
                isGeckoLTE18: isGeckoLTE18,
                isGeckoGT18: isGecko && ! isGeckoLTE18,
                isOpera: isOpera,
                isWebkit: isWebkit,
                isNewerWebkit: isWebkit && 'async' in doc.createElement('script'),
                isIE: ( v > 4 ),
                ieVersion: ( v > 4 ? v : undef )
            };
    }());
}(window, document));

这通过它们的功能来区分浏览器。

唯一的问题是,我目前无法区分 Safari 和 Chrome(都是 Webkit 浏览器),以及 Gecko、Webkit 和 Opera 浏览器本身的版本。

我知道它并不完美,但它比navigator.userAgent.

于 2011-08-17T03:10:54.063 回答
0

一个好主意是将浏览器作为一个类添加到 css 的 body 标记中。不确定这是否有效,因为我不运行 Windows,而且我有一台 powerPC,但它应该为所有 Internet Explorer 6-9 放置一个 .ie6 类,不是很有帮助。其他一切使用mooModernizr

if (Browser.Engine.trident) {

    var IEbrowser = $('body');

    IEbrowser.addClass('ie');

}​
于 2010-03-30T05:42:18.877 回答
0
var browser = {
        chrome: false,
        mozilla: false,
        opera: false,
        msie: false,
        safari: false
    };
    var sBrowser, sUsrAg = navigator.userAgent;
    if(sUsrAg.indexOf("Chrome") > -1) {
        browser.chrome = true;
    } else if (sUsrAg.indexOf("Safari") > -1) {
        browser.safari = true;
    } else if (sUsrAg.indexOf("Opera") > -1) {
        browser.opera = true;
    } else if (sUsrAg.indexOf("Firefox") > -1) {
        browser.mozilla = true;
    } else if (sUsrAg.indexOf("MSIE") > -1) {
        browser.msie = true;
    }
console.log(browser.msie);
于 2013-05-07T01:48:36.340 回答