前端必看之AJAX功能原理详解篇

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: jax 这个概念是由 Jesse James Garrett 在 2005 年发明的。它本身不是单一技术,是一串 技术的集合,主要有:1.JavaScript,通过用户或其他与浏览器相关事件捕获交互行为;2.XMLHttpRequest 对象,通过这个对象可以在不中断其它浏览器任务的情况下向服务 器发送请求;3.服务器上的文件,以 XML、HTML 或 JSON 格式保存文本数据;4.其它 JavaScript,解释来自服务器的数据(比如 PHP 从 MySQL 获取的数据)并将其 呈现到页面上。

 AJAX

AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术。 

它并不是 JavaScript 的一种单一技术,而是利用了一系列交互式网页应用相关的技术所形 成的结合体。使用 Ajax,我们可以无刷新状态更新页面,并且实现异步提交,提升了用户 体验。

一.Ajax 概述

    • Ajax 这个概念是由 Jesse James Garrett 2005 年发明的。它本身不是单一技术,是一串 技术的集合,主要有:

    • 1.JavaScript,通过用户或其他与浏览器相关事件捕获交互行为;
    • 2.XMLHttpRequest 对象,通过这个对象可以在不中断其它浏览器任务的情况下向服务器发送请求;
    • 3.服务器上的文件,以 XML、HTML 或 JSON 格式保存文本数据;
    • 4.其它 JavaScript,解释来自服务器的数据(比如 PHP 从 MySQL 获取的数据)并将其呈现到页面上。

    由于 Ajax 包含众多特性,优势与不足也非常明显。优势主要以下几点:

    1.不需要插件支持(一般浏览器且默认开启 JavaScript 即可);

    2.用户体验极佳(不刷新页面即可获取可更新的数据);

    3.提升 Web 程序的性能(在传递数据方面做到按需放松,不必整体提交);

    4.减轻服务器和带宽的负担(将服务器的一些操作转移到客户端);

    Ajax 的不足由以下几点:

    1.不同版本的浏览器度 XMLHttpRequest 对象支持度不足(比如 IE5 之前) 

    2.前进、后退的功能被破坏(因为 Ajax 永远在当前页,不会几率前后页面); 

    3.搜索引擎的支持度不够(因为搜索引擎爬虫还不能理解 JS 引起变化数据的内容); 

    4.开发调试工具缺乏(相对于其他语言的工具集来说,JS Ajax 调试开发少的可怜);

    Ajax的两个核心:

    无刷新(也称局部刷新)和异步调用。

    Ajax的原理(也就是异步调用的原理):

    image.gif编辑

    客户端(浏览器)不会直接向服务器发送请求,而是将请求交给ajax引擎(xmlHttpRequest对象),ajax引擎再把请求发送给服务器。我们把ajax引擎理解成代理或者是过滤器。ajax引擎负责与服务器交互,服务器处理后把数据返回给ajax引擎。客户端通过ajax引擎获取到服务器响应的数据。

    image.gif编辑

    服务器在响应请求处理数据时(在还没有处理完),客户端依然可以继续发送请求,不需要等待服务器响应完才能发送请求(这就是异步调用和同步调用的区别)。

    ajax无刷新是不对的,不严谨,它有刷新,应该说是局部刷新。

    Rich Internet Application(RIC)富客户端英特网应用程序。也就是更加优化的交互方式。

    RIC技术的三种实现:ajax(google最先使用,先阶段应用最广泛的RIC技术)、Flex(Adobe公司产品、编译为swf文件运行)、JavaFX(Sun公司规范、前途未知)

    Ajax的核心是JavaScript 对象 XmlHttpRequest。该对象在Internet Explorer 5中首次引入,它是一种支持异步请求的技术。简而言之,XmlHttpRequest使您可以使用JavaScript 向服务器提出请求并处理响应,而不阻塞用户。 对象创建示例

    XMLHttpRequest对象的ReadyState属性值列表。

    ReadyState取值

    描述

    0

    描述一种"未初始化"状态;此时,已经创建一个XMLHttpRequest对象,但是还没有初始化。

    1

    描述一种"发送"状态;此时,代码已经调用了XMLHttpRequest open()方法并且XMLHttpRequest已经准备好把一个请求发送到服务器。

    2

    描述一种"发送"状态;此时,已经通过send()方法把一个请求发送到服务器端,但是还没有收到一个响应。

    3

    描述一种"正在接收"状态;此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收结束。

    4

    描述一种"已加载"状态;此时,响应已经被完全接收。

    <script type="text/javascript">
    function sendRequest(){
    var xmlHttpReq=init();
    function init(){
    if (window.XMLHttpRequest) {
    return new XMLHttpRequest();
    } 
    else if (window.ActiveXObject) {
    return new ActiveXObject("Microsoft.XMLHTTP");
    }
    }
    </script>

    image.gif

    json详解

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

    json是javascript的子集,可以使用js方便的解析json。

    json有两种结构:

    名称/值、值的有序列表(理解成数组)

    键值对

    {name:”王帅”,age:18,sex:”男”};

    image.gif

    JSON中的值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array),且这些结构可以嵌套,这种特性给予JSON表达数据以无限的可能:它既可以表达一个简单的 key/value,也可以表达一个复杂的Map或List,而且它是易于阅读和理解的。

    因为JSON是脱离语言的理想的数据交换格式,所以它被频繁的应用在客户端与服务器的通信过程中,这一点是毋庸置疑的。而在客户端与服务器的通信过程中,JSON数据的传递又被分为服务器向客户端传送JSON数据,和客户端向服务器传送JSON数据,前者的核心过程中将对象转换成JSON,而后者的核心是将JSON转换成对象,这是本质的区别。另外,值得一提的是,JSON数据在传递过程中,其实就是传递一个普通的符合JSON语法格式的字符串而已,所谓的“JSON对象”是指对这个JSON字符串解析和包装后的结果

    为什么使用JSON而不是XML我认为就是说:解析XML太费劲了。

    在服务器端(比如servlet)里定义json数据,可以放到request对象,然后在客户端用EL表达式接收。然后用js的eval()函数将json字符串文本转换成javascript对象

    在服务器端怎么写json数据呢?第一是手写代码,第二是采用json-lib工具包,可以将一个java对象、集合、数组、xml数据转换成符合json规范的字符串数据,客户端用js就可以方便的解析。

    在json官方下载json-lib包。json-lib-2.3-jdk15jar是json的jar包,但是运行这个jar包需要用到apache的几个开源jar包(commons-beanutils-1.7.0.jar、commons-collections.jar、commons-lang.jar、commons-logging-1.0.4.jar、ermorph-1.0.6.jar)。

    注意:apache开源的jar包,好多框架都使用了,比如struts等等,如果加入jar有重复的,就留最高版本,如果高版本有问题,再使用低版本。

    查询所有人员示例:

    $(function(){
    $.ajax({                                      
        type: "POST",          
        url: "ssh/findAllAjax.action",
        data: "",
        success: showDate    
      });
    });
    function showDate(date){
    //$("#mydate").empty();
    var list =eval(date);
    $.each(list, function(index, value) {
      $("#mytable").append(
    "<tr><td>" 
    + "<input type='checkbox' class='ckb' value='"
    + value.id + "' /></td><td>" + value.name
    + "</td><td>" + value.age + "</td><td>" + value.sex
    + "</td><td>" + value.birthday + "</td></tr>");
    });
    }
      <div id="mydate">
       <table id="mytable">
       </table>
      </div>
    public void findAllAjax(){
    System.out.println("haha");
    personList=personService
    .findPersonAll();
    String json=JsonUtil
    .list2json(personList); System.out.println(json);
    outString(json);
    }

    image.gif

    增加人员示例:

    <a href="javascript:void(0)" id="create-person">进入人员列表页面</a>

    image.gif

    JQuery UI 是JQuery官方维护的UI插件库  里面的功能都是基于JQuery库的..不同版本所依赖的JQuery版本不同..目前最新的是jquery-ui-1.9.2版  是依赖jquery1.8.3所使用的

    导入JQuery UI 并使用

    <link rel="stylesheet" href="js/themes/base/jquery.ui.all.css">
    <script src="js/jquery-1.8.3.js"></script>
    <script src="js/jquery.form.js"></script>
    <script src="js/external/jquery.bgiframe-2.1.2.js"></script>
    <script src="js/ui/jquery.ui.core.js"></script>
    <script src="js/ui/jquery.ui.widget.js"></script>
    <script src="js/ui/jquery.ui.mouse.js"></script>
    <script src="js/ui/jquery.ui.button.js"></script>
    <script src="js/ui/jquery.ui.draggable.js"></script>
    <script src="js/ui/jquery.ui.position.js"></script>
    <script src="js/ui/jquery.ui.resizable.js"></script>
    <script src="js/ui/jquery.ui.dialog.js"></script>
    <script src="js/ui/jquery.ui.effect.js"></script>
    我们使用JQuery UI的弹出遮罩功能
    先写一个DIV是要弹出的层
    <div id="dialog-form" title="Create new user">
       <form action="/ssh/savePerson.action" method="post" id="personform">
    <table>
    <tr>
    <td>
    人员姓名:
    <input name="person.name">
    </td>
    </tr>
    <tr>
    <td>
    人员性别:
    <input name="person.sex">
    </td>
    </tr>
    <tr>
    <td>
    人员年龄:
    <input name="person.age">
    </td>
    </tr>
    </table>
    <input type="button" value="提交" id="saveperson">
    <input type="reset" value="重置">
    </form>
    </div>
    之后写
    $(function() {
    $( "#dialog-form" ).dialog({
    autoOpen: false,
    height: 300,
    width: 350,
    modal: true,
    close: function() {
     showlist();
    }
    });
    $( "#create-person" )
    .button()
    .click(function() {
    $( "#dialog-form" ).dialog( "open" );
    });
    });

    image.gif

    之后我们来写一个AJAX的增加,这里要用到另一个插件

    <script src="js/jquery.form.js"></script>

    image.gif

    这是一个表单插件.用来提供并表单中的信息JSON序列化的.

    function addPerson(){
    var queryString = $('#personform').formSerialize();
    $.ajax({                                      
        type: "POST",          
        url: "ssh/savePerson.action",
        data: queryString,
        success: showlist    
      });
    }

    image.gif

    为了增加后可以看到效果写一个showlist    方法

    function showlist(){
    $.post("ssh/findAllAjax.action", "", showDate, "json");
    }

    image.gif

    这里用post方法的原因是缓存的原因

    浏览器缓存问题:浏览器为了提高更好的交互方式,在其内部缓存了已访问页面的信息,当再次向同一个url发送请求时,不提交而使用缓存里数据。

    浏览器缓存只对get请求缓存,对post请求不缓存。缓存不是ajax的问题,任何get请求访问都有这个问题。

    解决缓存:一是禁用浏览器缓存(但会使网页访问速度变慢)、二是只发送post请求、三让每次提交的请求url都不同(在url后加一个参数,并且参数值每次都不一样)。

    在服务器端(servlet)添加响应头的内容,指定不使用缓存。

    response.addHeader(“pragma”,”no-cache”);
    response.addHeader(“cache-control”,”no-cache”);
    response.addHeader(“expires”,”0”);

    image.gif

    在ajax的send方法前加上下面代码:

    xmlHttp.setRequestHeader(“If-Modified-Since”,”0”);

    image.gif

    好大家试着写一下删除和修改功能

    <td><input type="button" value="提交" id="saveperson"/></td>
    $("#saveperson").click(function(){
    $( "#dialog-form" ).dialog( "close" );
    addPerson();
    clearperson();
    });
    function clearperson(){
    $("#personform input").val("");
    }
    function showDate(date){
    $("#mytable").html("");
    var list =eval(date);
    $.each(list, function(index, value) {
      $("#mytable").append(
    "<tr><td>" 
    + "<input type='checkbox' class='ckb' value='"
    + value.id + "' /></td><td>" + value.name
    + "</td><td>" + value.age + "</td><td>" + value.sex
    + "</td><td>" +  + "</td></tr>");
    });
    }

    image.gif


    相关文章
    |
    3月前
    |
    前端开发 API UED
    Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
    Python后端与前端交互新纪元:AJAX、Fetch API联手,打造极致用户体验!
    104 2
    |
    26天前
    |
    JSON 前端开发 搜索推荐
    惊!这些前端技术竟然能让你的网站实现个性化推荐功能!
    【10月更文挑战第30天】随着互联网技术的发展,个性化推荐已成为提升用户体验的重要手段。前端技术如JavaScript通过捕获用户行为数据、实时更新推荐结果等方式,在实现个性化推荐中扮演关键角色。本文将深入解析这些技术,并通过示例代码展示其实际应用。
    58 4
    |
    2月前
    |
    前端开发 JavaScript
    回顾前端页面发送ajax请求方式
    回顾前端页面发送ajax请求方式
    38 18
    |
    2月前
    |
    前端开发 JavaScript
    前端中的“+”连接符,居然有鲜为人知的强大功能!
    【10月更文挑战第9天】前端中的“+”连接符,居然有鲜为人知的强大功能!
    48 0
    前端中的“+”连接符,居然有鲜为人知的强大功能!
    |
    2月前
    |
    编解码 前端开发 JavaScript
    前端:Rem 及其转换原理
    Rem是一种用于前端开发的相对字体大小单位,它基于根元素的字体尺寸来定义文本大小,有助于实现响应式布局和可维护性。Rem的转换原理是通过相对于HTML根元素的字体大小来设置子元素的字体大小,从而实现统一的比例调整,提高页面的适应性和灵活性。此方法简化了跨浏览器和设备的布局调整,增强了用户体验。
    |
    3月前
    |
    前端开发 API
    (WEB前端编辑DWG)在线CAD如何实现图形识别功能
    mxcad 提供的图形识别功能可帮助用户快速识别和提取 CAD 图纸中的各种图形,如直线、多段线、弧线、圆及图块,显著提升设计效率。此功能不仅适用于图形分类,还能进行数量统计和快速定位,减少手动操作。用户可通过 API 进行二次开发,自定义识别逻辑。具体步骤包括打开在线示例、选择识别功能、设置识别参数并开始识别。更多开发文档请关注公众号:梦想云图网页 CAD。
    |
    2月前
    |
    缓存 JavaScript 前端开发
    拿下奇怪的前端报错(三):npm install卡住了一个钟- 从原理搞定安装的全链路问题
    本文详细分析了 `npm install` 过程中可能出现的卡顿问题及解决方法,包括网络问题、Node.js 版本不兼容、缓存问题、权限问题、包冲突、过时的 npm 版本、系统资源不足和脚本问题等,并提供了相应的解决策略。同时,还介绍了开启全部日志、使用替代工具和使用 Docker 提供 Node 环境等其他处理方法。
    618 0
    |
    3月前
    |
    移动开发 前端开发 JavaScript
    浅谈前端路由原理hash和history
    该文章详细解析了前端路由的两种模式——Hash模式与History模式的工作原理及其实现方式,并通过实例代码展示了如何在实际项目中运用这两种路由模式。
    |
    2月前
    |
    Web App开发 存储 前端开发
    前端开发必备:requestAnimationFrame、setInterval、setTimeout——功能解析与优劣对比
    前端开发必备:requestAnimationFrame、setInterval、setTimeout——功能解析与优劣对比
    158 0
    |
    2月前
    |
    移动开发 前端开发 JavaScript
    前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
    前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
    189 0