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 浏览器检测的主要内容,如果未能解决你的问题,请参考以下文章