神奇的url
一条url包含了很丰富的信息,那么我们如何来获取这些信息并有效的加以利用呢?
随便举个例子:https://github.com/search?utf8=%E2%9C%93&q=javascript
这条url就是在github上搜索javascript后跳转页面对应的url。我们要做的就是获取’?’后面的参数,以及获取后可以用来做什么。
获取参数
window.location的对象方法
获取url所有的参数
我们可以直接通过window.location.search
来取得这部分,也就是我们需要的url参数。
当url
没有包含?
时,window.location.search
会返回undefined
。
1 2 3 4 5 6 7 8 9 10 11 12 13
| function getUrlVal(str){ if(!str || str.indexOf('?') != 0) return false; var urlValArry = str.replace('?','').split('&'); var urlValObject = {}; for(var i in urlValArry){ urlValObject[urlValArry[i].split('=')[0]] = urlValArry[i].split('=')[1]; }; return urlValObject; };
var urlStr = window.location.search.replace('?',''); console.log(getUrlVal(urlStr));
|
获取url中指定键名(name)的键值(val)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function getOneVal(str,name){ if(!str || str.indexOf('?') != 0) return false; var afterNameStr = str.replace('?','').split(name)[1]; var strFirstSite = afterNameStr.indexOf('&'); strFirstSite = (strFirstSite == -1) ? afterNameStr.length : strFirstSite var reslt = afterNameStr.slice(1,strFirstSite); return reslt; };
var urlStr = window.location.search; console.log(getOneVal(urlStr,'time')) console.log(getOneVal(urlStr,'peopleNum'))
|
将方法绑定到原型链上
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
| String.prototype.toObj = function(key){
var str = this; if(str.indexOf('?') != 0) return {}; if(str.indexOf(key) == -1) return undefined; var tmpArry = str.replace('?','').split('&'); var reslt = {}; for(var i in tmpArry){ var tempKeyVal = tmpArry[i].split('='); if(!!key) { if(tempKeyVal[0] != key) reslt = undefined; reslt = tempKeyVal[1]; break; }else { reslt[tempKeyVal[0]] = tempKeyVal[1]; } }; return reslt; };
var urlStr = window.location.search; console.log(urlStr.toObj()) console.log(urlStr.toObj('active'))
|
利用正则表达式来获取参数
强大的正则总是让人心生向往,利用正则无疑是最简洁优雅的一种方法
获取指定某个参数
1 2 3 4 5 6 7 8 9 10
| function getUrlParam(url,name){ if(!name) return; var reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)', 'i'), r = url.substr(1).match(reg); if (r != null) { return (r[2]); }else{ return null; } }
|
获取所有的参数
1 2 3 4 5 6 7 8 9
| function parse_url(url){ if(!url) return; var pattern = /(\w+)=(\w+)/ig; var parames = {}; url.replace(pattern, function(a, b, c){ parames[b] = c; }); return parames; }
|
参数的利用
在项目中这些参数有哪些用处呢,下面列举几个比较常用的用处
导航定位
什么是导航定位?就是点击导航栏的标签,页面跳转后,对应的标签相应的会突出变化。如下图:
跳转后有两种情况:
一种ajax异步刷新,只是局部页面发生变化,因为可以直接用点击事件来控制。
另外一种比较常见的方式就是整个页面刷新,这种情况下,点击事件就没用了,就必须另辟蹊径:
1.比较传统的方法就是每个页面里面写一段CSS样式来控制
2.那么另外一种不用说就是通过url的参数来定位咯
假如用每个页面写CSS样式来控制,可以明显感受到的弊端是:每次新的页面都需要修改对应的CSS
那么利用url来控制又需要做哪些事呢?
1.首先需要约定参数,并且后台来传递这些参数
2.然后在导航栏部分,对应的地方加上参数值,这一步,导航栏都是公用模板,并且规则都一样,所以只需要一次添加
3.跳转后定位
html代码
1 2 3 4 5 6
| <div class="nav"> <a href="/index.htm?nav=index">首页</a> <a href="/layout/post.htm?nav=post">文章</a> <a href="/layout/tag.htm?nav=tags">标签</a> <a href="/layout/about.htm?nav=aboutUs">关于我</a> </div>
|
js代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function getOneVal(name,urlValStr){ var afterNameStr = urlValStr.split(name)[1]; var strFirstSite = afterNameStr.indexOf('&'); strFirstSite = (strFirstSite == -1) ? afterNameStr.length : strFirstSit; var val = afterNameStr.slice(1,strFirstSite); return val; };
var thisUrlVal = window.location.search.replace('?',''); var thisNVal = getOneVal('nav',urlValStr);
$('.nav a').each(function(){ var _this = $(this); var urlValStr = _this.attr('href').split('?')[1]; var nVal = getOneVal('nav',urlValStr); if(nVal == thisNVal) { _this.addClass('on'); } })
|