当前位置: 首页 > news >正文

白话 Ajax 及其入门基础(1)

白话 Ajax 及其入门基础(1)

一、白话Ajax的原理

这个可以从 C/S 和 B/S 的原理说起。Windows操作系统的诞生,为单机通信提供了很大的支持,程序设计也从早期DOS的单任务单用户向网络的分布式应用过度。C/S提供的客户/服务器编程模式为网络应用提供了一个有效的通信手段。浏览器与Web服务器之间的请求/ 服务,就是一个典型的C/S应用。
有人说,怎么是C/S?这应该是B/S呀!其实是这样理解的:浏览器/Web服务器作为我们实现网页发布的一个平台,对于我们在这个平台上开发的应用,我们的应用是由浏览器从Web服务器上下载下来然后展示在浏览器的“容器”里的,我们的应用是B/S模式的。但是浏览器与Web服务器的通信,却是C/S模式的。可以说,B/S模式是建立在C/S模式之上的。
Windows早期的桌面应用程序(包括单机程序和C/S结构的网络应用程序),其界面是调用Windows的API来实现的,后来,出现了VB、Delph(VCL)、VC++(MFC)等应用程序框架,把繁杂的API包装起来,使Windows程序开发大大降低、效率大大提高。
进入B/S编程阶段后,我们只需要面向Web服务器和浏览器编程,不需要考虑网络通信和并发等复杂的问题。但是在浏览器和Web服务器之间,为了进行数据交互,浏览器经常频繁的向Web服务器提交一些信息,现在的网络环境又极差,使我们经常等待于浏览器与Web服务器的通信状态,用户体验很差。而传统的桌面程序没有这个缺陷。
怎样既能利用B/S程序极强的界面表现力,又能避免其提交后的那一段眩晕的“真空”状态呢?
其实,在浏览器的设计阶段,设计师已经为我们考虑到了这个问题。这就是我们要说到的Ajax!Ajax英文是Asynchronous JavaScript and XML,就是在浏览器里通过一个机制,实现浏览器端与Web服务器端的一个异步通信,参与这个过程的有javascript、XML等技术。Ajax的引入,使B/S信息传递的量减少了,浏览器界面不再闪烁了,浏览者的感觉好多了。
Ajax并不是一项新技术,而是几个现有技术的新组合,而且它的发展也得益于几家大的互联网企业的率先应用(大家常拿Google的在线Maps来举例)。连浏览器寡头微软当初都没怎么看得起这项技术,后来才在VS.NET2.0时代玩命的赶呀追。

二、Ajax的实现

Ajax是由浏览器通过内部的一个组件实现的,这个组件负责接收用户的请求,以XML作为信息中介,并与Web服务器实现异步通信,并把请求的结果返回给浏览器,再由浏览器呈现给用户界面。“异步”的意思就是组件在后台工作期间,浏览器与用户保持在交互状态,并不更新当前窗口。也不是所有的数据都被组件提交到后台去。
Ajax实现的基础是:浏览器有一个Ajax引擎;浏览器支持Javascript;Web服务器端也支持XML数据格式。并不是所有浏览器都支持Ajax技术的,但支持Ajax的浏览器越来越多。
这个组件在Windows下是一个COM组件,由IE浏览器调用。IE浏览器也是在5.0版本以后才提供这个组件的。不同的浏览器实现和创建XMLHttpRequest对象的方式是不太一样的。但作为一个通用的Ajax接口,其外在表现是一致的。
Ajax其实是一项复杂的技术,牵扯到的东西很多。除过XMLHttpRequest对象和Javascript,还有DOM(文档对象模型),XML等。Javascript是一个粘合剂,它通过XMLHttpRequest对象对浏览器端页面的诸多元素进行操控,实现与Web服务器的后台交互,实现数据验证、存取等功能。

三、Ajax编程示例

1,客户端(文件client.htm)
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
<title>AJAX 客户端</title>
<script language=”javascript”>
var xmlhttp = false;
开始初始化XMLHttpRequest对象
//这段代码考虑到了xmlhttp对象与目前主流浏览器的兼容
//如果在IE浏览器下测试,一条
//xmlhttp = new ActiveXObject(”Msxml2.XMLHTTP”)
//或xmlhttp = new ActiveXObject(”Microsoft.XMLHTTP”)语句就可以了
if(window.XMLHttpRequest)
{
//Mozilla 浏览器
xmlhttp = new XMLHttpRequest();
if (xmlhttp.overrideMimeType)
{//设置MiME类别
xmlhttp.overrideMimeType(’text/xml’);
}
}
else
if (window.ActiveXObject)
{
// IE浏览器
try
{ xmlhttp = new ActiveXObject(”Msxml2.XMLHTTP”); }
catch (e)
{
try
{ xmlhttp = new ActiveXObject(”Microsoft.XMLHTTP”); }
catch (e)
{ }
}
}

function send_request(url, data)
{
//初始化、指定处理函数、发送请求的函数
if (!xmlhttp)
{ //异常,创建对象实例失败
window.alert(”不能创建XMLHttpRequest对象实例.”);
return false;
}

// 确定发送请求的方式和URL以及是否同步执行下段代码
xmlhttp.open(”POST”, url, true);
xmlhttp.onreadystatechange = processRequest; //根据Web服务器应答,触发该状态改变事件
xmlhttp.setRequestHeader(”Content-Type”,”application/x-www-form-urlencoded”);
xmlhttp.send(”username=” + data); //发送信息到后台程序
}

状态改变事件处理函数:处理返回的信息
function processRequest()
{
if (xmlhttp.readyState == 4)
{ // 判断对象状态
if (xmlhttp.status == 200) //正常返回信息,状态编号200
{ // 信息已经成功返回,开始处理信息
alert(xmlhttp.responseText);
}
else
{ //页面不正常
alert(”您所请求的页面有异常。”);
}
}
}

function userCheck()
{
var f = document.form1;
var username = f.username.value;
if(username==”")
{
window.alert(”用户名不能为空。”);
f.username.focus();
return false;
}
else
{
//该语句由用户按“唯一性检查”按钮后执行
send_request(’server.php’, username);
}
}
</script>

</head>

<body>
<body>
<form name=”form1″ action=”" method=”post”>
用户名:<input type=”text” name=”username” value=”">
<input type=”button” name=”check” value=”惟一性检查” onClick=”userCheck()”>
<input type=”submit” name=”submit” value=”提交”>
</form>
</body>
</html>

2,Web服务器端(文件server.php)
<?php
//取得客户端数据
$username = $_POST[”username”];

//判断用户名的惟一性
if( $username==”网眼”) //实际工程中,这里一般是从数据库取用户名的值
{
printf(”用户名“%s”已经被注册,请更换一个用户名”, $username);
}
else
{
printf(”用户名“%s”尚未被使用,您可以继续”, $username);
}
?>

在以上Client.htm代码中,首先建立XMLHttpRequest对象实例,然后很据对象的状态触发事件处理函数,对返回的信息进行处理。一切控制逻辑都是用Javascript脚本来书写的,XMLHttpRequest对象与Web服务器的XML信息交换对我们是隐含的,我们不必关心。

这是一个最原始的Ajax编程框架,它能简单的处理一些少量数据。经过代码重构,完全可以用在我们自己的小型工程中。

注意Ajax本身是一种浏览器端技术,它和Web服务器端采用什么脚本书写代码是没有关系的。比如我们把Client.htm的语句send_request(’server.php’, username)换为send_request(’server.asp’, username),再相对应的建立server.asp文件,内容为:

<%
dim username
username = request(”username”)

if username=”Thomas” then
response.write(”用户名” & username & “已经被注册,请更换一个用户名”)
else
response.write(”用户名” & username & “尚未被使用,您可以继续”)
end if
%>
做了这样的改变后,在浏览器端,用户看到的效果是一模一样的。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • linux 维护shell脚本,Linux运维 | Shell脚本(2)
  • 白话 Ajax 及其入门基础(2)
  • linux系统如何安装git,linux安装git_Linux系统中怎么安装Git
  • cookie概述
  • 共享nas盘添加本地用户 linux,一步一步地把NAS的硬盘共享给Linux
  • VBA教程
  • linux 编译x264,Linux 下编译FFmpeg 支持x264, x265
  • 现在,该你出场(英雄会刊首语)
  • linux中获取网络时间,linux C++通过ntp协议获取网络时间
  • IT书讯 -- Inside Microsoft SQL Server 2005 Query Tuning and Optimization
  • Linux取消函数折叠,Linux下面对于VIM编辑器的代码折叠使用与screen
  • linux下如何修改终端名称,修改linux终端显示目录和主机名称
  • SQL 2008 T-Prep 之旅
  • 树莓派Linux中文怎样修改,树莓派修改键盘布局和支持中文
  • 计算机基础知识
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • @angular/forms 源码解析之双向绑定
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • ECMAScript6(0):ES6简明参考手册
  • FastReport在线报表设计器工作原理
  • github指令
  • JavaScript服务器推送技术之 WebSocket
  • mysql 5.6 原生Online DDL解析
  • React16时代,该用什么姿势写 React ?
  • vuex 笔记整理
  • yii2中session跨域名的问题
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 实战|智能家居行业移动应用性能分析
  • 一个SAP顾问在美国的这些年
  • 异常机制详解
  • 用Canvas画一棵二叉树
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • MyCAT水平分库
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 湖北分布式智能数据采集方法有哪些?
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #《AI中文版》V3 第 1 章 概述
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • ( 10 )MySQL中的外键
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (35)远程识别(又称无人机识别)(二)
  • (C语言)球球大作战
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (回溯) LeetCode 131. 分割回文串
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (每日一问)操作系统:常见的 Linux 指令详解
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试