(转)通过Javascript得到URL中的参数(query string)
原文地址:http://www.cnblogs.com/season-huang/p/3322561.html
我们知道,"GET"请求中,通常把参数放在URL后面,比如这样
http://www.cnblogs.com/season-huang/index?param=yes&article=1
其中,红色部分便是URL中的参数。
那么,如何通过Javascript得到它呢?而且怎么从这么一堆字符串中找到我所需要的参数所对应的值呢?
方法一:

function getParameterByName(name) {
name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results == null ? "": decodeURIComponent(results[1]);
}
console.log(getParameterByName("param")) //yes

先来解释下这段代码吧:
1:定义一个 getParameterByName 函数,接收需要查询的参数的key,然后返回这个参数的value
2:name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
这句代码的作用是把 "[" 换成 "\[" , 把 "]" 换成 "\]" ,之所以做这么一个转换,是因为下面需要使用name这个变量去构造一个正则表达式,而 [ 和 ] 在正则中是关键字,所以需要转义。
3 var regex = new RegExp("[\\?&]" + name + "=([^&#]*)")
这句代码比较简单,匹配 ? 或者 & 然后是 name 然后是 = 和 非(&或者#)。
4 results = regex.exec(location.search); return results == null ? "" : decodeURIComponent(results[1]);
这两句放一起看把,首先 location.search 拿到全部的查询字符串(即文章最开头给的范例URL中红色部分),然后使用正则的exec方法去匹配出结果,这个方法会返回一个数组,在这个例子里面,results这个数组为["?params=yes","yes"]。这里要说明下,因为在正则中,给匹配出yes的部分加了个括号分组,所以结果中数组的第二项(results[1])为yes。
这个函数的确写的很优雅,很强大。但是呢,有一个缺点,就是每次我需要查询的一个参数的时候,都需要进行这么一个过程,构造正则,匹配location.search,返回结果。但是很明显,当我们页面载入完成的时候,URL是固定的,不会变得(不考虑html5 history api),所以每次进行这么一个过程很浪费资源,所以有了下面这个方法。
方法二

var urlParams;
(window.onpopstate = function() {
var match,
pl = /\+/g,
search = /([^&=]+)=?([^&]*)/g,
decode = function(s) {
return decodeURIComponent(s.replace(pl, " "));
},
query = window.location.search.substring(1);
urlParams = {};
while (match = search.exec(query))
urlParams[decode(match[1])] = decode(match[2]);
})();
//urlParams的结果
urlParams = {
param: "yes",
article: "1"
} console.log(urlParams["param"]); // -> "yes"
console.log("article" in urlParams); // -> true

这段代码比较简单,唯一要说明的是 pl = /\+/g, s.replace(pl, " ")); 之所以会有这么一句,是因为在URL规范里面,加号(+)会被编码为空格,所有在decode的时候,需要把加号转回空格去。
这个方法里面,当页面加载完成时,会把URL中所有参数放在urlParams这个对象里面。之后只需要查找这个对象的属性就可以找到相应的结果了。
在实际工作中,个人认为,这种方法比第一种可取。
方法三

var qs = (function(a) {
if (a == "") return {};
var b = {};
for (var i = 0; i < a.length; ++i)
{
var p=a[i].split('=');
if (p.length != 2) continue;
b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
}
return b;
})(window.location.search.substr(1).split('&'));
qs["param"]; // yes
qs["article"]; // 1
qs["nothere"]; // undefined (object)

比较简单明了,这里对代码就不做解释了。和方法二一样,把结果存储在qs这个对象里面。
方法四
function getParameterByName(name) {
var match = RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
}
如果是在一个页面里偶尔用一次,并且对代码的字节数有强迫症的人,可以使用这个方法。
最后,有一些jQuery插件也实现了这样的功能。不过个人认为这种小方法写成插件形式并不是很有必要的感觉,所以在这里就不列举出来了,可以自行谷歌。
本文参考 : http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values
(转)通过Javascript得到URL中的参数(query string)的更多相关文章
- 通过Javascript得到URL中的参数(query string)
我们知道,"GET"请求中,通常把参数放在URL后面,比如这样http://www.cnblogs.com/season-huang/index?param=yes&art ...
- javascript对URL中的参数进行简单加密处理
javascript的api本来就支持Base64,因此我们可以很方便的来进行编码和解码. var encodeData = window.btoa("name=xiaoming&a ...
- javaScript获取url中的参数
var urlTools = { //获取RUL参数值 getUrlParam: function(name) { /*?videoId=identification */ var params = ...
- javascript 删除 url 中指定参数,并返回 url
// 删除url中某个参数,并跳转function funcUrlDel(name){ var loca = window.location; var baseUrl = loca.origin + ...
- 使用JavaScript获取URL中的参数(两种方法)
本文给大家分享两种方法使用js获取url中的参数,其中方法二是使用的正则表达式方法,大家可以根据需要选择比较好的方法,废话不多说了,直接看详细介绍吧. 方法一: //取url参数 var type = ...
- 使用javascript获取url中的参数
方法一: //取url参数 var type = request("type") function request() { var query = location.search; ...
- javascript获取url中对应参数的方法
利用正则表达式和location.search方法,可以简便的获取到对应的参数: function getQueryString(name) {var reg = new RegExp(" ...
- JavaScript:隐藏Url中的参数
<script type="text/javascript"> function submitForm(url, data) { var eleForm = docum ...
- JavaScript如何获取网页url中的参数
我们可以自定义一个公共函数来实现网页url中的参数获取,返回的是一个数组 GetUrlRequest: function () { var url = decodeURI(location.searc ...
随机推荐
- VUE API 重点
VUE API 重点 生命周期方法 每个组件都有生命周期,是向 ReactJs 学习的. computed 在一个组件声明一个人,人有名,人有姓,输入姓和名.((&--&%--& ...
- mybatis参数
分是不是用@Param注解的这两种情况, 1,使用@Param注解,就不用理parameterType xml文档直接用 字符串的值,若是一个类,class.property 2, 不使用@Param ...
- poj 3128 Leonardo's Notebook——思路(置换)
题目:http://poj.org/problem?id=3128 从环的角度考虑. 原来有奇数个点的环,现在点数不变: 原来有偶数个点的环(设有 k 个点),现在变成两个大小为 k/2 的环. 所以 ...
- Linux 安装交叉编译工具链
交叉编译工具链下载地址: 链接:http://pan.baidu.com/s/1dE7P9rb 密码:300i 声明:下面每一步中的“pwd”指令都是为了看清楚当前的目录,没有其他实际意义. 系统:u ...
- DataSnap侦听端口动态设置问题
使用DataSnap做服务器,端口设置为可配置,然后在程序中动态指定: procedure TscUPower.DataModuleCreate(Sender: TObject); begin dst ...
- android httpclient 设置超时
3.X是这样的 HttpClient httpClient=new DefaultHttpClient();4.3是这样的CloseableHttpClient httpClient = HttpCl ...
- Tair ldb(leveldb存储引擎)实现介绍
简介 tair 是淘宝自己开发的一个分布式 key/value 存储引擎. tair 分为持久化和非持久化两种使用方式. 非持久化的 tair 可以看成是一个分布式缓存. 持久化的 tair 将数据存 ...
- [置顶]
STM32的ADC1采集多条通道,可以不使用DMA功能吗?
类似的问题 为什么我采集5条通道的电压,而采集到的值却都是第一条的呢? 我什么时候需要使用DMA功能? Ⅰ关于ADC的一些知识 STM32的ADC是一种12位逐次逼近型的模拟数字转换器.它有多达18条 ...
- PHP文件操作(三)-文件的写入
fwrite() //对文件进行写入 fwrite(file,string,length)file:必选项,需要写入的文件string:必选项,规定要写入文件的字符串length:可选项,规定要写入 ...
- 2014.8.8 CAD系统连接
CDA数据库连接生产库.研发库.临时库对应3个连接名 cad = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = backupserver)(POR ...