博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
给你的jQuery项目赋予Router技能吧
阅读量:6546 次
发布时间:2019-06-24

本文共 2771 字,大约阅读时间需要 9 分钟。

现在你不会React/Vue都不好意思说自己是前端,不过我相信很多前端项目还是基于jquery类库的传统模式的,假如你有追求的态度使用过requireJs这个库,你一定思考过一个问题,或者说一种组件化的雏形思维,那就是运用一个模板引擎如artTemplate+requireJs实现一个单页面组件化的开发模式(spa)

先贴一个目录结构

834823-20180211102704216-204135785.png

这是近段时间做的一个中后台系统的基本目录结构,就是使用上述的模式。如图所示:其中index.html为网页唯一入口,其他每一个页面均对应一个tpl+css+js,页面跳转均通过require['xx',cb]实现,看上去好像其实也挺好的,简单、快捷,那么这样的模式有个很大的问题就是不产生浏览记录,页面无法后退!无法单独刷新!所以,应运而生,是时候给他赋予路由功能了

简要思路

在页面跳转的时候使用history.pushState(stateObject, title, url)改变url的hash值(如:#....),通常情况是预先配置好的路由key,这个时候会触发window.onhashchange事件,回调函数里执行业务逻辑并最终控制页面的跳转,这样一来就基本达到了路由的能力。同时再配合window.onpopstate事件,当页面后退时触发,进行相关的逻辑控制。

简要实现

API

router.config(obj) //配置路由对应的key-value
var roleid = 2;router.config({    view: '.module-container', //渲染模板的dom    baseUrl: '/', //资源根路径    router: {        'page-test1': {            templateUrl: 'tpl/test/test1.tpl', //模板或页面地址            controller: 'js/test/test1.js', //页面对应的js            role: [1, 2] //能访问页面的角色id        },        'page-test2': {            templateUrl: 'tpl/test/test2.tpl',            controller: 'js/test/test2.js',            role: 1        },        'page-test3': {            controller: 'js/test/test3.js',            role: 2        },        'defaults': 'page-test1' //默认路由    },    errorTplId: '#errorTpl',  //可选的错误模板,用来处理加载html模块异常时展示错误内容    enterCallback: function (routeObj) {        //回车键后的回调函数,通常可做页面权限控制、数据统计等等        console.log('enterCallback')        if (!routeObj.url) return;        if (typeof routeObj.role == 'object') {            var notLook = false;            for (var i = 0; i < routeObj.role.length; i++) {                if (routeObj.role[i] == roleid) {                    notLook = true;                    break;                }            }            if (!notLook) {                router.isNotLook = false;                alert('无权访问')            } else {                router.isNotLook = true;            }        } else {            if (routeObj.role != roleid) {                router.isNotLook = false;                alert('无权访问')            } else {                router.isNotLook = true;            }        }    }});
router.to(string, {}, [null || '_self' || '_blank'] , callback) //页面跳转、显示传参
router.to('page-test1', {    'test1': '我是带过来的参数'})router.getUrlParameter('test1')
router.get/set/delParam/clear() //隐式传参
router.setParam({    'test1': '我是带过来的参数,不显示在url上哦'})router.to('page-test1');router.getParam('test1')

属性

  • view 渲染模板的dom,默认body
  • baseUrl 资源根路径
  • errorTplId 错误时渲染的模板id,后续可扩展404、500等
  • templateUrl 模板或页面地址,这里暂时只能是静态的
  • controller 页面对应的js,如需动态页面,在这里面渲染模板
  • role 页面级角色权限id

完整版js

demo

存在问题

  1. 没有集成ES6,无法享受新特性带来的技术红利。(尝试使用gulp-babel编译成ES5,并通过webpack构建成bundle.js,但是遇到各种问题,如使用jquery和jquery系列插件,很多并不支持CommonJS规范等等,最终无奈放弃)
  2. 独立组件并没有形成生命周期,如注册事件后,已跳转到其他页面,并不能销毁事件等,必须妥协使用先off再on的做法
  3. 没有数据流的概念,数据操作很混乱

转载于:https://www.cnblogs.com/liliangel/p/8442772.html

你可能感兴趣的文章
Linux 查看进程和删除进程
查看>>
[Shell]Bash基本功能:通配符与特殊符号
查看>>
嵌入式 uboot以及kernel添加看门狗临时记录(个人记录未整理乱)
查看>>
hibernate的一些缺陷(转)
查看>>
An easy to use android color picker library
查看>>
忘记Django登陆账号和密码的处理方法
查看>>
C++的头文件和实现文件分别写什么
查看>>
C语言 · 学生信息(P1102)
查看>>
做项目,还是标准点好(对象命名标准),呵呵
查看>>
iOS开发学习笔记:使用xcode里的单元测试,放在STAssert…里面的语句无法使用自动完成功能...
查看>>
R12 AR的应收票据(Bill Receivable)的标准处理流程
查看>>
利用批处理文件和任务计划实现Oracle数据库的自动备份
查看>>
测地变换
查看>>
28个你必须知道的HTML5的新特性,技巧以及技术
查看>>
Windows Server的类Xinetd服务-srvany
查看>>
SqlServerExpress2005 自动备份
查看>>
android 图片旋转
查看>>
Ant 替换某一文件中的字符串
查看>>
Java的数据库连接编程(JDBC)技术
查看>>
iphone网络交互json实现
查看>>