上一篇基本介绍了History API,这篇咱们可以同jquery插件来简单封装一个pjax来使用和体验下。
Jquery 插件脚手架
这块不用多说,网上有好多种插件开发的脚手架,直接上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| (function($) { var defaults = { }; var methods = null; var _methods = null; methods = { init : function(options) { defaults = $.extend(defaults, options); _methods._initEvent(); }, }; _methods = { }; $.pjax = function() { var method = arguments[0]; if (methods[method]) { method = methods[method]; arguments = Array.prototype.slice.call(arguments, 1); } else if (typeof (method) == 'object' || !method) { method = methods.init; } else { $.error('Method ' + method + ' does not exist on jQuery.pjax'); return this; } return method.apply(this, arguments); }; })(jQuery);
|
基本的脚手架完成,下一步咱们直接说说我们需要的参数。
Pjax 参数定义
参数的话,咱们可以方法 defaults 这个Object中。
下面讨论下咱们需要初始化pajx的参数:
1.mainContainer -> 主容器,也就是需要把异步加载的HTML内容加载到哪个DOM中,这里一般都是一个DIV吧。
2.defaultLoad->默认初始化哪个页面,初始化成功的时候,咱们需要一个默认加载页面。还有就是如果在url找不到的时候这里也可以起到一个默认路由的作用,直接跳到默认的页。
3.suffix -> 后缀,其实这个参数是方便书写,如果项目中的页面都是html的话,这个参数可以写成’html’ 然后在后续的操作跳转等操作的时候就不用写’xxx.html’了,直接写’xxx’即可
代码片段:
1 2 3 4 5
| var defaults = { mainContainer:"mainContainer", suffix:"html", defaultLoad:"index", };
|
后续还可以添加更丰富的功能,比如缓存机制,自定义跳转动画效果等功能,咱们现在就把基础的pjax现玩明白再说。
Pjax 方法定义和实现DOM Attr跳转
关于页面的跳转其实就是主要的方法:
1.load -> 跳转到指定的页面,还可以传各种参数(还可以允许是否可回退)。
2.back -> 回退到之前的页面。
这里还需要DOM 属性来支持咱们的pjax,举个栗子:
这种代码需要直接支持pjax跳转怎么办?
这样写,然后看下后续的JS代码就知道了:
1
| <a pa-href="demo2" >跳转到demo2.html</a>
|
下面代码是暴漏给外部的方法
代码片段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| methods = { init : function(options) { defaults = $.extend(defaults, options); _methods._initEvent(); }, load :function(url,param,isNotBack){ _methods._load(url,param,!isNotBack); }, back :function(){ _methods._back(); } };
|
下面介绍下私有的方法
代码片段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| _methods ={ _initEvent:function(){ $('body').delegate('*[pa-href]', 'click', function(event) { var $this=$(this); var href = $this.attr("pa-href"); if($this.attr("pa-noBack")!=undefined && $this.attr("pa-noBack") ==''){ _methods._load(href); }else{ _methods._load(href,{},true); } }); if (history.pushState) { _methods._changeHistory(true); window.addEventListener("popstate", function(e){ _methods._changeHistory(false); }); } }, _changeHistory:function(refresh){ var href=_methods._getParam('paHref'); if(href){ _methods._load(href,{},refresh); }else{ _methods._load(defaults.defaultLoad); } }, _getParam:function(name){ var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; }, _load:function(url,param,isBack){ var main=$("#"+defaults.mainContainer); window.scrollTo(0,0); main.fadeOut(200, function(){ main.load(url+"."+defaults.suffix,{},function(html){ main.fadeIn(200); var matches = html.match(/<title>(.*?)<\/title>/); if (matches) { title = matches[1]; document.title = title; } }) }); var href=location.href.split("?")[0]; if(isBack){ href+="?paHref=" + url; if(param && !$.isEmptyObject(param)){ href+="&"+$.param(param); }else{ var p=window.location.search; if(p.indexOf('&')!= -1){ href+=p.substring(p.indexOf('&')) } } history.pushState({isBack:isBack}, document.title, href); } }, _back:function(){ history.back(); } }
|
下一篇介绍怎么来实际使用插件来工作。
git项目地址
用右眼看世界