侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

比较Ajax的三种实现及JSON解析

微信(小程序)  /  管理员 发布于 5年前   542

本文主要是比较三种实现Ajax的方式,为以后的学习开个头。

准备:

1、  prototype.js
2、  jquery1.3.2.min.js
3、  json2.js

后台处理程序(Servlet),访问路径servlet/testAjax:

Java代码

package ajax.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /**  * Ajax例子后台处理程序  * @author bing  * @version 2011-07-07  *  */ public class TestAjaxServlet extends HttpServlet {   public void doGet(HttpServletRequest request, HttpServletResponse response)       throws ServletException, IOException {     response.setContentType("text/html;charset=utf-8");     PrintWriter out = response.getWriter();     String name = request.getParameter("name");     String age = request.getParameter("age");     System.out.println("{\"name\":\"" + name + "\",\"age\":\"" + age + "\"}");     out.print("{\"name\":\"" + name + "\",\"age\":" + age + "}");     out.flush();     out.close();   }   public void doPost(HttpServletRequest request, HttpServletResponse response)       throws ServletException, IOException {     doGet(request,response);   } } 

TestAjaxServlet接收两个参数:name和age,并返回一个以JSON格式编写的字符串。

前台页面参数输入界面:

Html代码 

<div id="show">显示区域</div> <div id="parameters">   name:<input id="name" name="name" type="text" /><br />   age:<input id="age" name="age" type="text" /><br /> </div> 

一、prototype实现

Html代码

<script type="text/javascript" src="//article/prototype.js"></script>   <script type="text/javascript">     function prototypeAjax()     {         var url = "servlet/testAjax";//请求URL     var params = Form.serialize("parameters");//提交的表单    var myAjax = new Ajax.Request(     url,{       method:"post",// 请求方式        parameters:params, // 参数       onComplete:pressResponse, // 响应函数       asynchronous:true     });     $("show").innerHTML = "正在处理中...";     }     function pressResponse(request)     {     var obj = request.responseText; // 以文本方式接收     $("show").innerHTML = obj;     var objJson = request.responseText.evalJSON(); // 将接收的文本用解析成Json格式     $("show").innerHTML += "name=" + objJson['name'] + " age=" + objJson['age'];     } </script> <input id="submit" type="button" value="提交" onclick="prototypeAjax()" /><br /> 

在prototype的Ajax实现中,用evalJSON方法将字符串转换成JSON对象。

二、jquery实现

Html代码 

<script type="text/javascript" src="//article/jquery-1.3.2.min.js"></script> <script type="text/javascript" src="//article/json2.js"></script> <input id="submit" type="button" value="提交" /><br /> <script type="text/javascript">     function jqueryAjax()       {         var user={"name":"","age":""};         user.name= $("#name").val();         user.age=$("#age").val();        var time = new Date();            $.ajax({            url: "servlet/testAjax?time="+time,            data: "name="+user.name+"&age="+user.age,            datatype: "json",//请求页面返回的数据类型            type: "GET",            contentType: "application/json",//注意请求页面的contentType 要于此处保持一致            success:function(data) {//这里的data是由请求页面返回的数据           var dataJson = JSON.parse(data); // 使用json2.js中的parse方法将data转换成json格式           $("#show").html("data=" + data + " name="+dataJson.name+" age=" + dataJson.age);            },            error: function(XMLHttpRequest, textStatus, errorThrown) {             $("#show").html("error");          }         });       }     $("#submit").bind("click",jqueryAjax); // 绑定提交按钮  </script> 

刚接触jQuery,在json的处理上借助了json2.js。还请前辈们指教。。

三、XMLHttpRequest实现

Html代码 

<script type="text/javascript">     var xmlhttp;      function XMLHttpRequestAjax()      {       // 获取数据      var name = document.getElementById("name").value;         var age = document.getElementById("age").value;       // 获取XMLHttpRequest对象      if(window.XMLHttpRequest){       xmlhttp = new XMLHttpRequest();       }else if(window.ActiveXObject){        var activxName = ["MSXML2.XMLHTTP","Microsoft.XMLHTTP"];         for(var i = 0 ; i < activexName.length; i++){         try{           xmlhttp = new ActiveXObject(activexName[i]);            break;          }catch(e){}       }      }        xmlhttp.onreadystatechange = callback; //回调函数        var time = new Date();// 在url后加上时间,使得每次请求不一样        var url = "servlet/testAjax?name="+name+"&age="+age+"&time="+time;        xmlhttp.open("GET",url,true); // 以get方式发送请求        xmlhttp.send(null);  // 参数已在url中,所以此处不需要参送     }        function callback(){         if(xmlhttp.readyState == 4){          if(xmlhttp.status == 200){ // 响应成功           var responseText = xmlhttp.responseText;  // 以文本方式接收响应信息          var userdiv = document.getElementById("show");          var responseTextJson = JSON.parse(responseText); // 使用json2.js中的parse方法将data转换成json格式           userdiv.innerHTML=responseText + " name=" + responseTextJson.name + " age=" + responseTextJson.age;        }       }         } </script> <input id="submit" type="button" value="提交" onclick="XMLHttpRequestAjax()" /><br /> 

ps:字符串转换成JSON的三种方式

采用Ajax的项目开发过程中,经常需要将JSON格式的字符串返回到前端,前端解析成JS对象(JSON )。
ECMA-262(E3) 中没有将JSON概念写到标准中,但在 ECMA-262(E5) 中JSON的概念被正式引入了,包括全局的JSON对象和Date的toJSON方法。

1,eval方式解析,恐怕这是最早的解析方式了。

function strToJson(str){   var json = eval('(' + str + ')');   return json;} 

记得str两旁的小括号哦。

2,new Function形式,比较怪异哦。

function strToJson(str){  var json = (new Function("return " + str))();  return json;} 

IE6/7中当字符串中含有换行(\n)时,new Function不能解析,但eval却可以。

3,使用全局的JSON对象。

function strToJson(str){  return JSON.parse(str);} 

目前IE8(S)/Firefox3.5+/Chrome4/Safari4/Opera10 已实现了该方法。

使用JSON.parse需严格遵守JSON规范,如属性都需用引号引起来,如下

var str = '{name:"jack"}';var obj = JSON.parse(str); // --> parse error 

name没有用引号引起来,使用JSON.parse所有浏览器中均抛异常,解析失败。而前两种方式则没问题。


  • 上一条:
    基于Proxy的小程序状态管理实现
    下一条:
    详解微信小程序开发(项目从零开始)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 微信模板消息改版后发送规则记录(微信订阅消息参数值内容限制说明)(1个评论)
    • 微信支付v3对接所需工具及命令(0个评论)
    • 2023年9月1日起:微信小程序必须备案才能上线运营(0个评论)
    • 腾讯官方客服回应了:微信好友上限约10000个!(1个评论)
    • 2023年做微信小程序的老铁注意:新增收费项、微信小程序获取手机号也收费了(2个评论)
    • 近期文章
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2017-10
    • 2018-01
    • 2020-03
    • 2021-06
    • 2021-10
    • 2022-03
    • 2023-02
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-10
    • 2023-11
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客