JS对象转URL参数(原生JS和jQuery两种方式)
转自:点击打开链接
现在的js框架将ajax请求封装得非常简单,例如下面:
- $.ajax({
- type: "POST",
- url: "some.php",
- data: { name: "John", location: "Boston" }
- }).done(function( msg ) {
- alert( "Data Saved: " + msg );
- });
上面是基于jQuery框架的一段ajax请求代码,使用了POST请求方式
但在某些场景中我们还是得使用GET方式,并且需要拼出请求参数,比如window.open时,a标签的href等等.像这种拼接字符串的代码很容易发生错误,比如要将一个对象的所有属性和值拼接为URL的请求参数,我们可能需要这样:
- var params = '';
- params += 'key1='+obj.key1;
- params += 'key2='+obj.key2;
- params += 'key3='+obj.key3;
- params += 'key4='+obj.key4;
- ...
不用说太多,痛苦啊,就像苦力,一点也体会不到程序员高大上的感觉.或许,我们可以这样
- var params = urlEncode(obj);
既然这样,这是怎么实现的呢?先看一看网上一哥们基于jQuery的实现方案
- var parseParam=function(param, key){
- var paramStr="";
- if(param instanceof String||param instanceof Number||param instanceof Boolean){
- paramStr+="&"+key+"="+encodeURIComponent(param);
- }else{
- $.each(param,function(i){
- var k=key==null?i:key+(param instanceof Array?"["+i+"]":"."+i);
- paramStr+='&'+parseParam(this, k);
- });
- }
- return paramStr.substr(1);
- };
- //test
- var obj={name:'tom','class':{className:'class1'},classMates:[{name:'lily'}]};
- parseParam(obj);
- //output: "name=tom&class.className=class1&classMates[0].name=lily"
- parseParam(obj,'stu');
- //output: "stu.name=tom&stu.class.className=class1&stu.classMates[0].name=lily"
引用自刘家华 http://www.oschina.net/code/snippet_139242_7584
由于是这段代码本身并不算多,为了增强其通用性,我使用了原生Javascript重写了该方法,如下:
- /**
- * param 将要转为URL参数字符串的对象
- * key URL参数字符串的前缀
- * encode true/false 是否进行URL编码,默认为true
- *
- * return URL参数字符串
- */
- var urlEncode = function (param, key, encode) {
- if(param==null) return '';
- var paramStr = '';
- var t = typeof (param);
- if (t == 'string' || t == 'number' || t == 'boolean') {
- paramStr += '&' + key + '=' + ((encode==null||encode) ? encodeURIComponent(param) : param);
- } else {
- for (var i in param) {
- var k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '.' + i);
- paramStr += urlEncode(param[i], k, encode);
- }
- }
- return paramStr;
- };
- var obj={name:'tom','class':{className:'class1'},classMates:[{name:'lily'}]};
- console.log(urlEncode(obj));
- //output: &name=tom&class.className=class1&classMates[0].name=lily
- console.log(urlEncode(obj,'stu'));
- //output: &stu.name=tom&stu.class.className=class1&stu.classMates[0].name=lily
JS对象转URL参数(原生JS和jQuery两种方式)的更多相关文章
- iOS 通过URL网络获取XML数据的两种方式
转载于:http://blog.csdn.net/crayondeng/article/details/8738768 下面简单介绍如何通过url获取xml的两种方式. 第一种方式相对简单,使用NSD ...
- 常见浏览器的宽高代码写法!有原生JavaScript和jquery两种写法-------------------------------以及我的个人网站
我的个人网站 点击链接!欢迎大家访问 下面是网页一些常见的宽高的获取.........这是原生的写法(JavaScript) 网页可见区域宽: document.body.clientWidth 网页 ...
- Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式
建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...
- Python与数据库 sqlalchemy 建立声明层表对象的两种方式
在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 1 from sqlalchemy.sql.schema import Table, ...
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
js_html_input中autocomplete="off"在chrom中失效的解决办法 分享网上的2种办法: 1-可以在不需要默认填写的input框中设置 autocompl ...
- 原生js更改css样式的两种方式
下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3 &quo ...
- JS中访问对象的两种方式区别
可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名["方法名"]() var obj = { n ...
- 【javascript】原生js更改css样式的两种方式
下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3 &quo ...
- js实现页面跳转的两种方式
CreateTime--2017年8月24日08:13:52Author:Marydon js实现页面跳转的两种方式 方式一: window.location.href = url 说明:我们常用 ...
随机推荐
- 如何安装nginx第三方模块
nginx文件非常小但是性能非常的高效,这方面完胜apache,nginx文件小的一个原因之一是nginx自带的功能相对较少,好在nginx允许第三方模块,第三方模块使得nginx越发的强大. 在安装 ...
- redis 命令集
进入客户端 /usr/local/bin/redis-cli 选择数据库 select index (0-15) 退出 quit
- 初学java记录
记录一: if语句: if(x < y) System.out.println("x is less than y"); 记录二: 强制转换字符类型赋值的方法: num2= ...
- jmeter数据关联_后置处理器_正则表达式提取器
- 热门数据挖掘模型应用入门(一): LASSO回归
热门数据挖掘模型应用入门(一): LASSO回归 2016-10-10 20:46 作者简介: 侯澄钧,毕业于俄亥俄州立大学运筹学博士项目, 目前在美国从事个人保险产品(Personal Line)相 ...
- 大数据,物联网(Internet of Things),万物互联网(Internet of Everything),云计算,雾计算,边缘计算(Edge Computing) 的区别和联系
大数据是一种规模大到在获取.存储.管理.分析方面大大超出了传统数据库软件工具能力范围的数据集合,具有海量的数据规模.快速的数据流转.多样的数据类型,高价值性和准确性五大特征,即5V(Volume, V ...
- Rhythmk 一步一步学 JAVA(8) JUnit 使用
1. 创建被测试类: package com.rhythmk; public class Man { public Man(){ } public void Move() { System.out.p ...
- eclipse中的实用快捷键
之前有写过“myeclipse实用快捷键”,今天总结一下“eclipse中的快捷键”. 1.打开文件Crtl+Shift+R: 2. 打开类文件包括能看到字在哪个jar Ctrl+Shift+T: ...
- mongodb 的操作
查找 db.collection的名字.find({"group":"kkkk","key":{$regex:/.*one.*/i}}); ...
- shell脚本里切换用户执行命令的注意事项
功能说明:用root用户执行一个脚本,脚本里需要切换到普通用户DT去执行其他命令,其中就用到了EOF,用法如下: #!/bin/bash su - DT<<EOF cd apache-to ...