在早期版本中,我经常测试是否应该在页面加载时手动触发popstate
,因为Chrome会在加载后立即触发它,而Firefox和IE不会。
if ($.browser.mozilla || $.browser.msie) {
$(window).trigger('popstate');
}
既然他们在1.9中删除了browser对象,我应该如何测试这些浏览器呢?或者我如何计算我是否需要在页面加载时使用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');
});
}
发布于 2013-02-12 06:13:51
您应该向popstate
处理程序添加一些健全性检查,并确保如果您“弹出”到与开始时相同的状态,它不会执行任何代价高昂的操作。这样你就可以不关心浏览器了,只需在document ready上调用popstate就可以了:
$(function(){
$(window).on('popstate', popState);
// call popstate on document ready
$(popstate);
});
建议您将代码从$.browser
粘贴回您的环境的答案过于夸张,无法支持一个糟糕的实践。你可以检测你需要的99%的东西。几乎每次使用$.browser
都是危险的。几乎总是有方法可以检测到这一点。
JavaScript社区反对浏览器嗅探已经有很长时间了。Here是2009年的一篇文章,告诉我们为什么这是一个坏主意。还有很多其他的。
我恳求您不要将$.browser
复制回您的代码中,jQuery团队决定终止它是有原因的。
发布于 2013-05-15 20:01:00
Here是解决这个问题的一种快速方法。将这行代码添加到jQuery-1.9.js中,并用jQuery.browser替换$.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());
https://stackoverflow.com/questions/14545023
复制相似问题