SPA路由器开发手记-解决chrome下location.replace后,浏览器返回操作导致页面刷新的问题...

本文介绍了在使用Backbone.js处理URL fragment到handler映射时遇到的问题,即在Chrome环境下通过location.replace替换hash后用户进行后退操作会导致页面刷新。提出了解决方案:使用history.replaceState更新hash,避免了页面刷新的问题,并分享了自定义history模块的_updateHash方法。

我的路由器是参考的backbone和EXT5做的。其中history采用的hashchange的方式来进行监控,IE67不支持的问题可以参考司徒大这篇文章

我要说的是在chrome下通过location.replace替换完hash的时候,用户调用浏览器的后退操作,将导致页面刷新

相信backbone的用户也会有这个问题,我的解决方法是用history.replaceState的方式更新hash 就木有这个问题了

以下是我修改的backbone  history中的_updateHash方法

_updateHash: function(location, fragment, replace) {
  var me = this,
    hash
= '#' + fragment; if (replace) { //由于chrome下location.replace替换当前页后 进行返回操作会刷新页面
  //ff无辜受到牵连 同罚之 //所以我们这里采用replaceState的方式更新hash if ((typeof me.history.replaceState === 'function') && !me.iframe) { me.history.replaceState(me.history.state, '', hash); }
else { //先移除location中的锚点信息 var href = location.href.replace(/(javascript:|#).*$/, ''); //替换当前页 这么做不会产生浏览历史 location.replace(href + hash); } } else { // Some browsers require that `hash` contains a leading #. // 如果不是 则简单的location.hash='#xxxx' location.hash = hash; } }

  值得说一下的是backbone的Router非常非常薄,从URL Fragement->handler 映射的方式我觉得并不可取,人们常常抱怨路随着项目扩张由规则注册越来越膨胀很大一部分就是因为这个原因(另外一部分是路由规则的单一)。

  我的路由模块 是从URL Fragement->routeData的映射, 该模块由Router、Route,History三个部分组成,History就不说了 主要就是围绕hashchange进行的封装,Router主要是处理History的hashchange事件,在发生hashchange事件的时候 通过调用其中的Route一个一个对hash进行识别,如果能够匹配 则从hash中提取并返回routeData

转载于:https://www.cnblogs.com/xmlsvg/p/3722669.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值