backbone之路由锚点的替换

简介: 1、需求由于项目一开始做的时候不甚完善,所有的网页没有路由功能,导致一些搜索结果在页面跳转之后,没有被记录下来,在页面跳转之后回退,得到的是页面最原始的结果,没有指定的搜索条件。最近项目的在完善这些小的细节,所以在此记录一下。

1、需求

由于项目一开始做的时候不甚完善,所有的网页没有路由功能,导致一些搜索结果在页面跳转之后,没有被记录下来,在页面跳转之后回退,得到的是页面最原始的结果,没有指定的搜索条件。最近项目的在完善这些小的细节,所以在此记录一下。

2、操作

由于项目的所有传参都是使用 '?' 来标识的,而Backbone的路由是使用锚点 '#' 来的,为了兼容以前的做法,不得不去修改Backbone的源码,还好路由部分的源码不多

2.1 修改Backbone的源码,版本1.3.3

1)修改标识 '#' -> '?'

把源代码中的字符串中的'#'修改为'?',把单个的'#'修改为'?'


例:

var pathStripper = /#.*$/;

修改为:

var pathStripper = /\?.*$/;

例:

this.location.replace(rootPath + '#' + this.getPath());

修改为:

this.location.replace(rootPath + '?' + this.getPath());

注:字符串中的?需要\来转义,字符不需要

2)修改锚点的路由设置


_updateHash: function(location, fragment, replace) {

if (replace) {

var href = location.href.replace(/(javascript:|\?).*$/, '');

location.replace(href + '?' + fragment);

} else {

// Some browsers require that `hash` contains a leading #.

//        location.hash = '?' + fragment;

var href = location.href.replace(/(javascript:|\?).*$/, '');

//          window.history.pushState({}, 0, href + '?' + fragment);

window.history.replaceState({}, 0, href + '?' + fragment);

}

}

注:

location.hash是原始的修改参数方法,会替换url中'#'以及后的所有内容

window.history.pushState可选目标方法,会增加一次历史记录,刷新页面

window.history.replaceState可选目标方法,会替换掉当前的页面记录,不刷新页面(目前选用方案)

2.2 写一个Util

写一个工具类用于Router的快速使用,和统一修改


/**

* RouterUtil.js

*/

var RouterUtil = (function() {

// Backbone Router with a custom parameter extractor

var Router = Backbone.Router.extend({

params : "",

routes : {

"*actions": "defaultRoute" // 匹配 http://example.com/#anything-here

},

defaultRoute : function(params) {

Router.params = params;

},

});

var routerUtil = {

web_router : null,

init(){

// 初始化

if(!routerUtil.web_router){

routerUtil.web_router = new Router;

Backbone.history.start();

}

},

getParam(cbFn){

routerUtil.init();

// 获取#之后的参数

if(cbFn){

cbFn(Router.params);

}

},

route(returnUrl, cbFn){

// 动态的调整 路由规则 例:topic/:pageno/:pagesize

routerUtil.web_router.route(returnUrl,"page", cbFn)

},

start(){

// 启用路由

if(!Backbone.History.started){

Backbone.history.start();

}

},

stop(){

// 关闭路由

if(Backbone.History.started){

Backbone.history.stop();

}

},

navigate(returnUrl){

/**

* 重构 ,路由导向

*/

//此处根据自己的需求去构建参数拼接

//returnUrl为'?'之后的内容

if(returnUrl){

}else{

returnUrl = "searchType=" + SearchBoxUtil.searchType + "&" + SearchBoxUtil.formData;

}

routerUtil.web_router.navigate(returnUrl, {

trigger: true

});

}

}

return routerUtil;

})();
2.3 使用

在js中引用的一些方法


// 页面的初始化

initPagi : function(){

RouterUtil.getParam(function(params){

if(!params){

params = "";

}

//处理参数

...

});

},

//查询函数

queryData : function(returnUrl,isInitSearchBox){

if(!returnUrl){

returnUrl = "";

}

if(isInitSearchBox){

//第一次初始化查询

}else{

//非第一次初始化查询

RouterUtil.navigate(returnUrl);

}

...

},

菜鸟一枚,随便弄弄的一点代码,有更好的方案请赐教

遗失的拂晓
目录
相关文章
|
3月前
|
JavaScript 前端开发
js中模糊搜索 模糊匹配如何实现?
js中模糊搜索 模糊匹配如何实现?
|
8月前
|
机器学习/深度学习 前端开发 JavaScript
路由动画详解(附加代码效果)
路由动画详解(附加代码效果)
68 0
|
9月前
|
中间件
Nuxt处理全局组件的显示与隐藏
在Nuxt开发过程中,大家会遇到需要控制全局组件的显示与隐藏。比如说移动端的路由导航栏、头部的返回操作。。。 为了使切换页面的同时,确定是否展示全局组件,保证页面展示的平稳过渡。 下面是我在项目中用到一个办法,已实现。
167 0
|
9月前
|
算法 数据挖掘 计算机视觉
|
10月前
|
前端开发 JavaScript UED
前端路由分割
今天我们将探讨一项重要的前端技术 - 路由分割(Route Based Splitting)。作为一名资深的 web 前端技术博主,我将向您介绍这个技术的优点和缺点,适用场景,以及在知名项目中的使用。通过本文,初学者将能够快速掌握路由分割的概念和实践。废话不多说,让我们开始吧!
93 0
|
12月前
|
前端开发 容器
CSS 从大图中选取部分区域作为目标图标
CSS 从大图中选取部分区域作为目标图标
79 0
|
人工智能 计算机视觉
CVPR 2019|APCNet:基于全局引导的局部匹配度自适应金字塔上下文网络
不同物体可能有相似的特征,如木桌和椅子有相似的纹理,会造成歧义
99 0
CVPR 2019|APCNet:基于全局引导的局部匹配度自适应金字塔上下文网络
|
算法 Serverless 计算机视觉
YoloX | SimOTA标签匹配策略
YoloX | SimOTA标签匹配策略
641 0
YoloX | SimOTA标签匹配策略
|
网络协议 网络架构
浮动路由配置实验
浮动路由配置实验
浮动路由配置实验
|
移动开发 JavaScript 网络架构
Angular最新教程-第九节 路由二(路由策略、base标签、路由参数)
Angular最新教程-第九节 路由二(路由策略、base标签、路由参数)
280 0
Angular最新教程-第九节 路由二(路由策略、base标签、路由参数)