Ajax这个词,不代表任何东西,它仅仅是称呼一系列促进客户端与服务器通信的技术时所用的一个术语。服务器通信时Ajax技术的核心内容,其目标就是从客户端向服务器发送信息,并接受后者的回传,以求在此过程中创建出更好地打用户体验来。Ajax之前所有的服务器通信都是在服务器上完成的,所以那是若想重绘页面的一部分,要么使用iframe(已淘汰),要么刷新整个页面。这两种方式都称不上是良好的用户体验。

Ajax提供了两类服务器通信手段:同步通信和异步通信。

异步通信Ajax比同步通信要常见的多了,大概是98%的使用频次。异步意味着此类Ajax调用并不和其他任务同时触发,这种通信行为发生在后台,具备相当的独立性,与页面和web应用程序相互分离。

使用异步调用,可以避免同步调用的阻塞性,它不需要与页面中的其他HTTP请求挤在一起处理。

XMLHttpRequest对象

XMLHttpRequest对象是所有Ajax调用的核心。我们的目的是使用Ajax技术异步获取JSON中的数据,并以适当的形式将其展现出来:

 //创建ajax通信服务器对象

 function getHTTPObject(){

     "use strict";  //注意使用严格模式

     var xhr;

     //使用主流的XMLHttpRequest通信服务器对象

     if(window.XMLHttpRequest){

         xhr = new window.XMLHttpRequest();

     //如果是老版本ie,则只支持Active对象
} else if(window.ActiveXObject){ xhr = new window.ActiveXObject("Msxml2.XMLHTTP");
} //将通信服务器对象返回
return xhr; }

跨浏览器的兼容问题:微软Ie起初发明了XMLHttp对象,那就导致了IE5、IE6只支持ActiveXObject对象,所以要考虑对它的兼容问题。

创建Ajax调用

首先,我在本地的data目录下创建好了Salad.json文件,等待Ajax程序去调用它:

 //ajax JSON Salad
var ingredient = {
"fruit":[
{
"name" : "apple",
"color" : "green"
},
{
"name" : "tomato",
"color" : "red"
},
{
"name" : "peach",
"color" : "pink"
},
{
"name" : "pitaya",
"color" : "white"
},
{
"name" : "lettuce",
"color" : "green"
}
]
};

然后要做的是向服务器发送请求和接受传回的数据:

在接收到返回的服务器通信对象“xhr”后,我们紧接着要做的是使用readystatechange 事件对通信对象 “xhr”进行 Ajax请求状态和服务器状态,当readystate状态请求完成和status状态服务器正常时在进行之后 的通信工作。

 //输出ajax调用所返回的json数据

 var request = getHTTPObject();

 request.onreadystatechange = function(){

     "use strict";

         //当readyState全等于“4”状态,status全等于“200”状态 代表服务器状态服务及客户端请求正常,得以返回
if(request.readyState ===4 || request.status ===200 ){ //为了方便起见,将数据打印到浏览器控制台(F12查看)
console.log(request.responseText);
} //使用GET方式请求.json数据文件,并且不向服务器发送任何信息
request.open("GET","data/ingredient.json",true);
request.send(null);
};

Ajax也通过GET和POST方法进行调用,GET方式会把数据暴露在URL之中,所以它的处理工作较少;POST相对较安全,但性能不如GET。   接下来分别使用 open()和 send()方法对服务器请求数据文件和发送数据。

通常在实际的开发项目中,不可能仅仅有一个Ajax调用。为了复用,为了方便起见,我们需要将这个Ajax程序封装成复用函数,在这里我传入了一个outputElement参数,用于给用户提示等待;还传入了一个callback参数,用于传入一个回调函数,根据用户在搜索框键入的关键字在JSON文件中进行匹配,将合适的数据渲染到页面响应的位置:

 //将其封装成一个供调用函数

 function ajaxCall(dataUrl,outputElement,callback){
"use strict"; //这是一段截取的js(ajax)代码 var request = getHTTPObject();
//我想要提醒大家的是:当网页的某个区域在向服务器发送http请求的过程中,要有一个标识提醒用户正在加载... outputElement.innerHTML = "Loding..."; //也可以根据各位的需求添加一个循环小动画 request.onreadystatechange = function () { if(request.readyState ===4 || request.status ===200){ //将request.responseText返回的数据转化成JSON格式
var contacts = JSON.parse(request.responseText); //如果回调函数是function类型,则使用callback函数处理返回的JSON数据
if(callback === "function"){
callback(contacts);
}
}
}; request.open("GET","data/ingredient.json",true);
request.send(null);
}

然后调用 ajaxCall():

 //调用程序,我们将使用Ajax请求的JSON数据显示到HTML文档的某个区域中!
(function () {
"use strict"; //下面将给出DOM语句相对应的HTML代码
var searchForm = document.getElementById("search-form"),
searchField = document.getElementById("q"),
getAllButton = document.getElementById("get-all"),
target = document.getElementById("output"); var search = { salad : function(event){ var output = document.getElementById("output");
//请求的JSON数据文件名,输出到HTML的区域,检索数据文件的核心function语句 ajaxCall('data/ingredient.json','output',function(data){ //searchValue为搜索条目,准备循环检索
var searchValue = searchField.value, //找到食材条目(详见JSON数据文件)
fruit = data.fruit, //统计水果的数量
count = fruit.length,
i; //阻止默认行为
event.preventDefault(); //初始化
target.innerHTML = ""; if(count > 0 || searchValue !==""){
for(i = 0;i < count;i++){ var obj = fruit[i],
//将name与searchvalue值相匹配,如果值不等于 -1,那么就确定两者相匹配 inItfount = obj.name.indexOf(searchValue); //将JSON中匹配的数据规范的写入到DOM
if(isItfount != -1){
target.innerHTML += '<p>'+obj.name+'<a href="mailto:" '+obj.color+'>'+obj.color+'</a></p>'
}
}
}
})
}
};
//事件监听器,监听鼠标单击事件后调用函数并请求JSON数据文件
searchField.addEventListener("click",search.salad,false); })();

Ajax 所对应的HTML文档:

  <h1>制作沙拉所需要的食材</h1>

     <form action="" method="get" id="search-form">

         <div class="section">

             <label for="q">搜索食材</label>
<input id="q" name="q" required placeholder="type a name">
</div> <div class="button-group"> <button type="submit" id="btn-search">搜索</button>
<button type="button" id="get-all">get all contacts</button> </div> </form> <div id="output"></div>

使用Ajax与服务器端通信的更多相关文章

  1. 使用ajax与服务器通信的步骤

    使用ajax与服务器通信的步骤: 1. 创建一个XMLHttpRequest对象 2. 创建url,data,通过xmlHttpRequest.send() 3. 服务器端接收ajxa的请求,做相应处 ...

  2. AngualrJS之服务器端通信

    译自<AngularJS> 与服务器通信 目前,我们已经接触过下面要谈的主题的主要内容,这些内容包括你的Angular应用如何规划设计.不同的angularjs部件如何装配在一起并正常工作 ...

  3. 创建一个TCP服务器端通信程序的步骤

    创建一个TCP服务器端通信程序的步骤: 1). 创建一个ServerSocket 2). 从ServerSocket接受客户连接请求 3). 创建一个服务线程处理新的连接 4). 在服务线程中,从so ...

  4. C#Socket_TCP(客户端,服务器端通信)

    客户端与服务器通信,通过IP(识别主机)+端口号(识别应用程序). IP地址查询方式:Windows+R键,输入cmd,输入ipconfig. 端口号:可自行设定,但通常为4位. 服务器端: usin ...

  5. 客户端请求服务器端通信, Web 编程发展基础|乐字节

    乐字节的小伙伴们,好久不见,甚是想念啊! 前面我发布的文章算是把Java初级基础阶段讲完了,接下来小乐将会给大家接着讲Java中级阶段——Javaweb. 首先,我们要看看Javaweb阶段主要重点掌 ...

  6. Android客户端与Python服务器端通信之上传图片

    继上篇成功的与服务器端通信上之后,我现在需要将安卓本地的图片上传到服务端.服务端接收图片存下来. 参考:https://blog.csdn.net/qq_26906345/article/detail ...

  7. Ajax向服务器端发送请求

    Ajax向服务器端发送请求 Ajax的应用场景 页面上拉加载更多数据 列表数据无刷新分页 表单项离开焦点数据验证 搜索框提示文字下拉列表 Ajax运行原理 Ajax 相当于浏览器发送请求与接收响应的代 ...

  8. JavaScript中利用Ajax 实现客户端与服务器端通信(九)

    一:Ajax (Asynchronous JavaScript and XML)不是一个新的技术,事实上,它是一些旧有的成熟的技术以一种全新的更加强大的方式整合在一起 Ajax的关键技术: 1.使用X ...

  9. 嵌入式开发——boa服务器下的ajax与cgi通信

    博主最近在最有做一个嵌入式课程设计,要求是利用基于cortax a8的物联网实验箱做一个简单的嵌入式网页交互系统作为课程设计来验收评分.因为本身自己是学前端的,所以网页部分并不是重点,主要是和boa服 ...

随机推荐

  1. jQuery中常用的元素查找方法

    $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myElement所以得到的是唯一的元素 $("div&q ...

  2. sql server2008中左连接,右连接,等值连接的区别

    数据库中的连接我了解到有left join,right join,inner join这些,以下是它们的区别: 1)左连接(left join):先取出a表的所有数据,再取出a.b表相匹配的数据 2) ...

  3. 在一个未知的CentOS服务器中如何加上PHP的openssl扩展

    1. 服务器是定制过的,不知对应的centos版本: 2. PHP是自己编译的,而且服务器上没有保留对应版本的源代码,通过/pathto/php -v 找出php版本号,然后wget去下载对应的php ...

  4. Maven多模块项目使用MyBatis Generator

    开发环境: JDK:8u102 Maven:3.3.9 MySQL:5.7.10 MySQL Connector:5.1.40 IDE:IntelliJ IDEA 2016 MyBatis:3.4.1 ...

  5. java系统库性能优化注意点

    对于大部分的应用系统开发来说,微秒级别的优化通常是被忽略不计或者不关心的,因为有着更多优化点,但是对于开发供应用系统使用的公用库来说,大部分的操作通常都是对字符.数字.字符串.字节的操作,且这些系统库 ...

  6. R语言归一化处理

    归一化化就是要把你需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内.首先归一化是为了后面数据处理的方便,其次是保正程序运行时收敛加快. R语言中的归一化函数:scale 数据归一化包括 ...

  7. C#常用集合的使用(转载)

    大多数集合都在System.Collections,System.Collections.Generic两个命名空间.其中System.Collections.Generic专门用于泛型集合. 针对特 ...

  8. Android图像处理之Bitmap类

      Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bitmap来实现 ...

  9. C语言中do...while(0)用法小结

    在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 本文地址:http://www.cnblogs.com/archimedes/p/ ...

  10. 在Mac上配置Android adb命令

    一 adb定义: adb(android debug bridge)是android系统中的一种命令行工具,通过它可以和android设备或模拟器通信. 二 在Mac上的配置过程 启动终端 进入当前用 ...