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); } ... },

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

backbone之路由锚点的替换的更多相关文章

  1. Router和History (路由控制)-backbone

    Router和History (路由控制) Backbone.Router担任了一部分Controller(控制器)的工作,它一般运行在单页应用中,能将特定的URL或锚点规则绑定到一个指定的方法(后文 ...

  2. 全面解析JavaScript的Backbone.js框架中的Router路由

    这篇文章主要介绍了Backbone.js框架中的Router路由功能,Router在Backbone中相当于一个MVC框架中的Controller控制器功能,需要的朋友可以参考下. Backbone ...

  3. BackBone结合ASP.NET MVC实现页面路由操作

    1. 问题的背景 什么是页面路由操作,就是通过浏览器地址栏的标记来实现页面内部的一些操作,这些操作具有异步性和持久性.应用场景主要有页面操作过程中的添加收藏夹的操作.后退操作等过程中能完全恢复界面. ...

  4. backbone.Router History源码笔记

    Backbone.History和Backbone.Router history和router都是控制路由的,做一个单页应用,要控制前进后退,就可以用到他们了. History类用于监听URL的变化, ...

  5. Backbone源码阅读手记

    Backbone.js是前端的MVC框架,它通过提供模型Models.集合Collection.视图Veiew赋予了Web应用程序分层结构.从源码中可以知道,Backbone主要分了以下几个模块: ( ...

  6. Backbone框架浅析

    Backbone是前端mvc开发模式的框架.它能够让view和model相分离,让代码结构更清晰简答,开发进度加快,维护代码方便.但是,现在出了一种mvvm框架,它是下一代前端mvc开发模式的框架,代 ...

  7. backbone库学习-Router

    backbone库的结构http://www.cnblogs.com/nuysoft/archive/2012/03/19/2404274.html 本文的例子来自http://blog.csdn.n ...

  8. Backbone笔记(续)

    Backbone Bockbone 总览 Backbone 与 MVC 模式:解决某一类问题的通用方案 - 套路 MVC:一种架构模式,解耦代码,分离关注点 M(Model) - 数据模型 V(Vie ...

  9. Backbone源码分析-Backbone架构+流程图

    作者:nuysoft/高云/nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. Backbone0.9.1源码分析分析系列 jQuery1.6.1源码分析系 ...

随机推荐

  1. c# Lambda扩展

    扩展类 public static class LinqExtensions { /// <summary> /// 创建lambda表达式:p=>true /// </sum ...

  2. DUI-Windows消息机制要点(34篇)

    [隐藏] 1窗口过程概念 2消息类型 2.1系统定义消息 2.1.1窗口消息 2.1.2命令消息 2.1.3控件通知消息 2.1.4程序定义消息 3消息队列 3.1系统消息队列 3.2线程消息队列 4 ...

  3. 怎样让窗口不显示在任务栏和ALT+TAB中(隐藏窗口再嵌套,几乎是万能的办法)

    之前想弄个像QQ旋风那样的悬浮窗口,就研究了下怎么让窗口不显示在任务栏中,方法其实很简单就是将窗口的扩张属性设置成WS_EX_TOOLWINDOW,MSDN中对该属性有详细介绍,代码如下: ::Set ...

  4. QtStaticBuildScript(会有这么容易)

    https://github.com/dankrusi/QtStaticBuildScript

  5. Google C++测试框架系列高级篇:第一章 更多关于断言的知识

    原始链接:More Assertions 词汇表 现在你应该已经读完了入门篇并且会使用GTest来写测试.是时候来学一些新把戏了.这篇文档将教会你更多知识:用断言构造复杂的失败信息,传递致命失败,重用 ...

  6. C#最新功能(6.0、7.0)

    一直用C#开发程序,.NET的功能越来越多,变化也挺大的,从最初的封闭,到现在的开源,功能不断的增加,一直在进步.作为C#的强烈支持者,C#的变化,我不能不关注,这篇文章主要介绍,C#6.0和C#7. ...

  7. asp.net core 系列之Startup

    这篇文章简单记录 ASP.NET Core中 ,startup类的一些使用. 一.前言 在 Startup类中,一般有两个方法: ConfigureServices 方法: 用来配置应用的 servi ...

  8. vue项目接入api接口

    我们在做项目时,一切基础在于数据上面,所以接入api接口是关键. 访问接口是我们会遇到跨域,而,vue-cli给我们提供了反向代理,所以我们只需要配置一下就可以了. 在config文件中找到index ...

  9. C++标准库(体系结构与内核分析)(侯捷第一讲)

    一.C++标准库介绍 C++标准库:C++ Standard Library C++标准库与STL有什么关系: STL:Standard Template Library STL包含6大部件,基本占标 ...

  10. springboot如何读取自定义配置项

    我们springboot项目有自己默认的配置文件,一般地由application.yml和bootstrap.yml组成,前者是模块的配置,后者是微服务的配置,后台比前者先被框架加载. 我们有时需要自 ...