转自:点击打开链接

现在的js框架将ajax请求封装得非常简单,例如下面:

  1. $.ajax({
  2. type: "POST",
  3. url: "some.php",
  4. data: { name: "John", location: "Boston" }
  5. }).done(function( msg ) {
  6. alert( "Data Saved: " + msg );
  7. });

上面是基于jQuery框架的一段ajax请求代码,使用了POST请求方式
但在某些场景中我们还是得使用GET方式,并且需要拼出请求参数,比如window.open时,a标签的href等等.像这种拼接字符串的代码很容易发生错误,比如要将一个对象的所有属性和值拼接为URL的请求参数,我们可能需要这样:

  1. var params = '';
  2. params += 'key1='+obj.key1;
  3. params += 'key2='+obj.key2;
  4. params += 'key3='+obj.key3;
  5. params += 'key4='+obj.key4;
  6. ...


不用说太多,痛苦啊,就像苦力,一点也体会不到程序员高大上的感觉.或许,我们可以这样

  1. var params = urlEncode(obj);

既然这样,这是怎么实现的呢?先看一看网上一哥们基于jQuery的实现方案

  1. var parseParam=function(param, key){
  2. var paramStr="";
  3. if(param instanceof String||param instanceof Number||param instanceof Boolean){
  4. paramStr+="&"+key+"="+encodeURIComponent(param);
  5. }else{
  6. $.each(param,function(i){
  7. var k=key==null?i:key+(param instanceof Array?"["+i+"]":"."+i);
  8. paramStr+='&'+parseParam(this, k);
  9. });
  10. }
  11. return paramStr.substr(1);
  12. };
  1. //test
  2. var obj={name:'tom','class':{className:'class1'},classMates:[{name:'lily'}]};
  3. parseParam(obj);
  4. //output: "name=tom&class.className=class1&classMates[0].name=lily"
  5. parseParam(obj,'stu');
  6. //output: "stu.name=tom&stu.class.className=class1&stu.classMates[0].name=lily"

引用自刘家华 http://www.oschina.net/code/snippet_139242_7584

由于是这段代码本身并不算多,为了增强其通用性,我使用了原生Javascript重写了该方法,如下:

  1. /**
  2. * param 将要转为URL参数字符串的对象
  3. * key URL参数字符串的前缀
  4. * encode true/false 是否进行URL编码,默认为true
  5. *
  6. * return URL参数字符串
  7. */
  8. var urlEncode = function (param, key, encode) {
  9. if(param==null) return '';
  10. var paramStr = '';
  11. var t = typeof (param);
  12. if (t == 'string' || t == 'number' || t == 'boolean') {
  13. paramStr += '&' + key + '=' + ((encode==null||encode) ? encodeURIComponent(param) : param);
  14. } else {
  15. for (var i in param) {
  16. var k = key == null ? i : key + (param instanceof Array ? '[' + i + ']' : '.' + i);
  17. paramStr += urlEncode(param[i], k, encode);
  18. }
  19. }
  20. return paramStr;
  21. };
  22. var obj={name:'tom','class':{className:'class1'},classMates:[{name:'lily'}]};
  23. console.log(urlEncode(obj));
  24. //output: &name=tom&class.className=class1&classMates[0].name=lily
  25. console.log(urlEncode(obj,'stu'));
  26. //output: &stu.name=tom&stu.class.className=class1&stu.classMates[0].name=lily

JS对象转URL参数(原生JS和jQuery两种方式)的更多相关文章

  1. iOS 通过URL网络获取XML数据的两种方式

    转载于:http://blog.csdn.net/crayondeng/article/details/8738768 下面简单介绍如何通过url获取xml的两种方式. 第一种方式相对简单,使用NSD ...

  2. 常见浏览器的宽高代码写法!有原生JavaScript和jquery两种写法-------------------------------以及我的个人网站

    我的个人网站 点击链接!欢迎大家访问 下面是网页一些常见的宽高的获取.........这是原生的写法(JavaScript) 网页可见区域宽: document.body.clientWidth 网页 ...

  3. Python与数据库[2] -> 关系对象映射/ORM[2] -> 建立声明层表对象的两种方式

    建立声明层表对象的两种方式 在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 from sqlalchemy.sql.schema i ...

  4. Python与数据库 sqlalchemy 建立声明层表对象的两种方式

    在对表对象进行建立的时候,通常有两种方式可以完成,以下是两种方式的建立过程对比 首先导入需要的模块,获取一个声明层 1 from sqlalchemy.sql.schema import Table, ...

  5. 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 ...

  6. 原生js更改css样式的两种方式

    下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3  &quo ...

  7. JS中访问对象的两种方式区别

    可以使用下面两种方式访问对象的属性和方法 1.对象名.属性名 对象名.方法名() 2.对象名["属性名"] 对象名["方法名"]() var obj = { n ...

  8. 【javascript】原生js更改css样式的两种方式

    下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3  &quo ...

  9. js实现页面跳转的两种方式

      CreateTime--2017年8月24日08:13:52Author:Marydon js实现页面跳转的两种方式 方式一: window.location.href = url 说明:我们常用 ...

随机推荐

  1. css 字体英文对照

    宋体: SimSun 黑体: SimHei 华文细黑: STHeiti Light [STXihei] 华文黑体: STHeiti 微软雅黑: Microsoft YaHei 微软正黑体: Micro ...

  2. appium 滑动封装

    #获得机器屏幕大小x,y def getSize():     x = dr.get_window_size()['width']     y = dr.get_window_size()['heig ...

  3. Oracle归档与非归档模式

    一.什么是Oracle归档模式 Oracle数据库有联机重做日志,这个日志是记录对数据库所做的修改,比如插入,删除,更新数据等,对这些操作都会记录在联机重做日志里.一般数据库至少要有2个联机重做日志组 ...

  4. C# List泛型转换,int,string 转字符,转数组

    List转字符串 List<string> List = new List<string>(); string strArray = string.Join(",&q ...

  5. PHP环境基础配置

    域名访问设置(本地局域网) 用记事本打开 127.0.0.1是本地回环地址 配置完后 通过在本地浏览器输入www.0705.com就可以访问本地站点了 Wamp集成环境多站点配置 配置条件: 一个服务 ...

  6. Julia - 三元运算符

    三元运算符的格式: a ? b : c a 是条件表达式,如果条件 a 为真,就执行 b:如果条件 a 为假,就执行 c 二选一 julia> println(1 < 2 ? " ...

  7. 华为交换机S5700 vty 0 4

    最佳答案   vty 0 4 代表有5条VTY线路 由0到4 这个要看设备的版本有的设备会有更多条VTY线路比如一些企业版的设备 显示用户界面 进入TELNET 设置模式 user-interface ...

  8. Vcf文件格式

    Vcf文件格式是GATK钟爱的表示遗传变异的一种文件格式. 就拿GATK给出的vcf例子说明吧,下面这个文件只表示了一个完整vcf文件的前几个SNP. 看上去确实有点复杂,那就把它分为两部分看吧,第一 ...

  9. 初识Dash -- 构建一个人人都能够轻松上手的界面,操控数据和可视化

    从事数据科学工作,少不了使用Pandas.scikit-learn这些Python生态系统中的利器,还有就是控制工作流的Jupyter Notebooks,没的说,你和同事都爱用.但是,要想将工作成果 ...

  10. Spring Boot启动流程详解

    注:本文转自http://zhaox.github.io/java/2016/03/22/spring-boot-start-flow 环境 本文基于Spring Boot版本1.3.3, 使用了sp ...