最近很多小伙伴都在问浅谈ajax和二这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Ajax入门(二)Ajax函数封装、Ajax学习(二)——一个简单的Ajax实例、AJAX总结(
最近很多小伙伴都在问浅谈ajax和二这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Ajax入门(二)Ajax函数封装、Ajax学习(二)—— 一个简单的Ajax实例、AJAX总结(二),手写AJAX、Ajax调用后台方法的几种写法(二) Ajax.dll等相关知识,下面开始了哦!
本文目录一览:浅谈ajax(二)(ajax2)
我们在使用open()的时候会有一个URL的参数,url参数其实就是指服务器上的文件地址,这个地址可以是任何类型的文件:txt、xml或者其他页面文件。
第三个参数是异步(true orfalse):不推荐使用false
服务器响应
如果需要获得服务器的响应,我们可以使用XMLHttpRequest对象的reponseText 或者reponsexml属性。
当来自服务器的响应不是XML的时候,需要使用requestText属性,该属性可以返回字符串形式的响应:
document。getElementById("myDiv").innerHTML=xmlhttp.reponseText;
如果来自服务器的响应时XML,那么需要作为XML对象进行解析,需要使用reponseXML属性。
例如请求hello.xml,并解析。
xmlDoc=xmlhttp.responseXML; txt=""; x=xmlDoc.getElementsByTagName("ARTIST"); for (i=0;i<x.length;i++) { txt=txt + x[i].childNodes[0].nodeValue + "<br />"; } document.getElementById("myDiv").innerHTML=txt;
onreadystatechange事件
当请求被发送到服务器,我们需要执行一些基于响应的任务,每当readyState改变时,就会触发onreadystatechange事件。
readystate属性存有XMLHttpRequest的状态信息。
onreadystatechange:存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
readyState | 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
|
status | 200: "OK" 404: 未找到页面 |
当readystate等于4而且状态为200的时候,表示响应已经就绪。
xmlhttp.onreadystatechange=function(){ if(xmlhttp.readystate==4&&xmlhttp.status==200){ document。gtElementById("myDiv").innerHTML=xmlhttp.reponseText; } }
Callback()
该函数是一种以参数形式传递给另一函数的函数。
如果一个网站上面存在有多个ajax的任务,那么当创建对象编写一个编著的函数,并给每个ajax任务调用该函数。
该函数调用应该包含url以及发生onreadystatechange时间时执行的任务(每次调用不尽相同)
function myFunction() { loadXMLDoc("ajax_info.txt",function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } }); }
Ajax入门(二)Ajax函数封装
转自我的个人博客原址
如果看了的我上一篇博客《Ajax入门(一)从0开始到一次成功的GET请求》的话,肯定知道我们已经完成了一个简单的get请求函数了。如下:
/**
* 一个简单的get请求
* @param {String} url 请求地址,文件名
* @param {Function} fnSucc 请求成功时执行的函数
* @param {Function} fnFaild 请求失败执行的函数
*/
function AJAX(url, fnSucc, fnFaild) {
//1.创建ajax对象
var oAjax = null;
/**
* 此处必须需要使用window.的方式,表示为window对象的一个属性.不存在时值为undefined.
* 进入else若直接使用XMLHttpRequest在不支持的情况下会报错
**/
if (window.XMLHttpRequest) {
//IE6以上
oAjax = new XMLHttpRequest();
} else {
oAjax = new ActiveXObject("Microsoft.XMLHTTP");
}
//2.连接服务器
//open(方法,url,是否异步)
oAjax.open("GET", url, true);
//3.发送请求
oAjax.send();
//4.接收返回
//OnRedayStateChange事件
oAjax.onreadystatechange = function () {
if (oAjax.readyState === 4) {
if (oAjax.status === 200) {
// alert("成功" + oAjax.responseText);
fnSucc(oAjax.responseText);
} else {
// alert("服务器响应失败!");
if (fnFaild) {
fnFaild();
}
}
}
};
}
为什么要继续进行Ajax函数封装?
原因如下:
目前方法只能使用get请求,而不能使用post请求,而在用户注册时必须使用POST,因为POST,现在不够完整。
目前请求参数只能直接写在url里,不利于动态获取数据,应该使用参数解析的方式,便于使用。
get请求方式请求缓存问题。
学习封装方法,
改造目标
function ajax(url, options) {
// your implement
}
options是一个对象,里面可以包括的参数为:
type: post或者get,可以有一个默认值
data: 发送的数据,为一个键值对象或者为一个用&连接的赋值字符串
onsuccess: 成功时的调用函数
onfail: 失败时的调用函数
改造开始(三步)
(一)原函数的改造
形参中,删除fnSucc
、fnFaild
添加options
。使成功与失败执行的函数变成options对象的 onsuccess
、onfail
两个方法对应的值。
主要是在4、接收返回部分进行更改,如下
//4.接收返回
oAjax.onreadystatechange = function () {
if (oAjax.readyState === 4) {
if (oAjax.status === 200) {
//请求成功。形参为获取到的字符串形式的响应数据
options.onsuccess(oAjax.responseText);
} else {
//先判断是否存在请求失败函数
//存在时,形参为XMLHttpRequest对象,便于进行错误进行处理
if (options.onfail) {
options.onfail(oAjax);
}
}
}
};
(二)请求参数的处理
首先我们要知道的是在使用请求参数存在时,GET方式的请求参数特别简单。直接在url后面添加?参数名=参数值&参数名二=参数值二
实现思路:
-
首先判断options.data是否存在,不存在时使用
"?timestamp= + new Date().getTime();
链接在url后,以清除缓存。这里只是我使用的方法,这里的timestamp可以随意更改
new Date().getTime();
也可以用Math.random();
主要是保持每次请求的url都不一样。还有许多别的方法参考Ajax缓存问题怎么解决?。有兴趣的自己再多google一下吧。
存在options.data时,应该限制请求data格式便于处理,设定为JSON(当然没必要像JSON那么严格,但是应该保持键值对的格式)。
使用for in 遍历data,使用
=
来连接键与值,使用&
来连接多个请求参数只需要对原函数中的2.连接服务器进行更改
实现如下:
原:
//2.连接服务器
//open(方法,url,是否异步)
oAjax.open("GET", url, true);
现:
//open(方法,url,是否异步)
var param = "";//请求参数。
//判断data存在时缓存它,不存在时,设为0
var data = options.data ? options.data : 0;
if(typeof(data)==="object"){//只有data为对象使才执行
for (var key in data){//请求参数拼接
if (data.hasOwnProperty(key)) {
param += key+"="+data[key]+"&";
}
}
param.replace(/&$/,"");//去除结尾的&。
}else{
param= "timestamp=" + new Date().getTime();
}
//2.连接服务器
oAjax.open("GET", url+"?"+param, true);
(三)请求类型选择
使用post发送数据,模拟form提交。在url看不到请求参数,更加安全。
实现思路:
判断是否type是否存在,存在时转为大写,默认为GET请求。
判断请求的类型,GET 或 POST 。
在使用post请求提交数据时,请求参数不跟在url后面。
-
使用post请求数据必须添加在
open()
与send()
直接添加头信息。xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
使用post请求数据,对2.连接服务器、3.发送请求部分进行处理
实现如下:
原:
//2.连接服务器
oAjax.open("GET", url+"?"+param, true);
现:
//3.发送请求
var type = options.type ? options.type.toUpperCase() : "GET" ;
if(type ==="GET"){
oAjax.open("GET", url+"?"+param, true);
oAjax.send();
}else{
oAjax.open("POST", url, true);
oAjax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
oAjax.send(param);
}
最终完成
结合之前写的,集合起来。
/**
* AJAX函数封装
* @param {string} url 请求地址(必须)
* @param {object} options 发送请求的选项参数
* @config {string} [options.type] 请求发送的类型。默认为GET。
* @config {Object} [options.data] 需要发送的数据。
* @config {Function} [options.onsuccess] 请求成功时触发,function(oAjax.responseText, oAjax)。(必须)
* @config {Function} [options.onfail] 请求失败时触发,function(oAjax)。(oAJax为XMLHttpRequest对象)
*
*@returns {XMLHttpRequest} 发送请求的XMLHttpRequest对象
*/
function AJAX(url, options) {
//1.创建ajax对象
var oAjax = null;
/**
* 此处必须需要使用window.的方式,表示为window对象的一个属性.不存在时值为undefined,进入else
* 若直接使用XMLHttpRequest,在不支持的情况下会报错
**/
if (window.XMLHttpRequest) {
//IE6以上
oAjax = new XMLHttpRequest();
} else {
oAjax = new ActiveXObject("Microsoft.XMLHTTP");
}
//2.连接服务器
//open(方法,url,是否异步)
var param = ""; //请求参数。
//只有data存在,且为对象使才执行
var data = options.data ? options.data : -1; //缓存data
if (typeof (data) === "object") {
for (var key in data) { //请求参数拼接
if (data.hasOwnProperty(key)) {
param += key + "=" + data[key] + "&";
}
}
param.replace(/&$/, "");
} else {
param = "timestamp=" + new Date().getTime();
}
//3.发送请求
var type = options.type ? options.type.toUpperCase() : "GET";
if (type === "GET") {
oAjax.open("GET", url + "?" + param, true);
oAjax.send();
} else {
oAjax.open("POST", url, true);
oAjax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
oAjax.send(param);
}
//4.接收返回
//OnRedayStateChange事件
oAjax.onreadystatechange = function () {
if (oAjax.readyState === 4) {
if (oAjax.status === 200) {
//请求成功。形参为获取到的字符串形式的响应数据
options.onsuccess(oAjax.responseText, oAjax);
} else {
//先判断是否存在请求失败函数
//存在时,形参为XMLHttpRequest对象,便于进行错误进行处理
if (options.onfail) {
options.onfail(oAjax);
}
}
}
};
return oAjax;//发送请求的XMLHttpRequest对象
}
最终完成就是这样了。当然还远远算不上完美,比如
try catch
的使用 ,但是通过这样的封装,还是学到很多知识。
Ajax学习(二)—— 一个简单的Ajax实例
通过上篇博客认识Ajax之后,我们通过一个简单的实例来消化消化理论知识,一睹Ajax的庐山真面目。
1.实例功能:
当用户输入用户名,文本框失去焦点后,通过异步调用来判断该用户名是否已经存在。若存在,则在上图中红框处显示提示。当用户名可用时,提交按钮变为可用状态。
2.设计Html页面:
<spanhttps://www.jb51.cc/tag/ims/" target="_blank">imsun;font-size:18px;"><strong><spanhttps://www.jb51.cc/tag/ims/" target="_blank">imsun;font-size:18px;"><strong><body> <form name="myForm"> 用户名:<input type="text" name=" myName" onblur="checkName()" /> <span id="myDiv"></span><br /> 密 码:<input type="text" name="myPwd"/><br /> <input type="button" value=" 提交" name="submitButton" disabled /> </form> </body></strong></span></strong></span>在“用户名”文本框后添加了一个span标签,该标签划分一个区域,用于显示用户名的验证信息。 还要添加一个事件,当失去焦点时触发“checkName()”。
3.javascript代码部分:
//定义用户存储XMLHttpRequest对象的变量 var xmlHttp = null; //创建XMLHttpRequest对象 function creatXMLHTTP() { //判断浏览器是否支持ActiveX控件,针对IE6及之前版本 if (window.ActiveXObject) { //将所有可能出现的ActiveXObject版本都放在一个数组中 var arrXmlHttpTypes = ['Microsoft.XMLHTTP','MSXML2.XMLHTTP.6.0','MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP']; //通过循环创建XMLHttpRequest对象 for (var i=0;i<arrXmlHttpTypes.length;i++) { try { //创建XMLHttpRequest对象 xmlHttp = new ActiveXObject(arrXmlHttpTypes[i]); //如果创建XMLHttpRequest对象成功,则跳出循环 break; } catch(ex) { } } } //判断浏览器是否将XMLHttpRequest作为本地对象实现,针对IE7,Firefox,Opera等浏览器 else if(window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } } //响应XMLHttpRequest对象状态变化的函数 function httpStateChange() { if (xmlHttp.readyState==4)//异步调用完毕 { if (xmlHttp.status==200 || xmlHttp.status==0)//异步调用成功,在本机上调试 { //获得服务器返回的数据 var userNames = xmlHttp.responseText; var arrUserName = userNames.split(";");//把获取到的一个字符串分割成字符串数组。 //定义一个变量,用于判断用户名是否已经存在 var bFlag = false; for(i=0;i<arrUserName.length;i++) { if (arrUserName[i]==myForm.myName.value) { bFlag = true;//用户名存在 break; } } //查找用于显示提示信息的节点 var node = document.getElementById("myDiv"); //更新数据 if (bFlag) { node.firstChild.nodeValue = "用户名已存在"; myForm.submitButton.disabled = true;//提交按钮不可用 } else { node.firstChild.nodeValue = "用户名不存在,可以使用"; myForm.submitButton.disabled = false;//提交按钮可用 } } } } //校验用户名是否有效 function checkName() { //创建XMLHttpRequest对象,调用前面定义好的函数 creatXMLHTTP(); if (xmlHttp!=null) { //创建响应XMLHttpRequest对象状态变化的函数 xmlHttp.onreadystatechange = httpStateChange; //创建http请求 xmlHttp.open("get","userName.txt",true); //发送http请求 xmlHttp.send(null); } else { alert("您的浏览器不支持XMLHTTP"); } }
注意:需要建一个userName.txt存储已存在的用户名,各个用户名之间用分号隔开。
通过这个小例子,我们从理论阶段向代码实现迈了一步。从代码中很容易发现XMLHttpRequest是Ajax的核心对象。也正是因为各大浏览器对XMLHttpRequest对象的广泛支持,使得Ajax成为一项热门技术。IE浏览器将XMLHttpRequest实现为一个ActiveX对象,其他三大浏览器(Firefox,Opera,netscape)将其实现为一个本地javascript对象,所以在创建XMLHttpRequest对象时要经历一番周旋。虽然创建方式不同,但XMLHttpRequest对象拥有的方法和属性大致相同。下篇博客我们来一起揭开XMLHttpRequest对象的神秘面纱,深入解读上面的代码,敬请期待!
AJAX总结(二),手写AJAX
前言
博主博客:Stillwater的博客
知乎专栏:前端汪汪
本文为作者原创转载请注明出处:
http://hiztx.top/2017/01/12/a...
在前端面试的时候经常会有如下情景。AJAX会吗?能不能手写个AJAX?第一个问题可以参见我的另一篇博客,AJAX总结(一),AJAX概述。这篇博文我们来回答第二个问题,手写AJAX。
一、手写AJAX的步骤
手写AJAX并没有一个固定的标准的答案,但是AJAX的关键步骤就那么几步,我会先用文字介绍关键步骤,然后给出两个版本的手写AJAX的代码及注释。帮助大家很好地理解和记忆。
创建XMLHttpRequest对象
指定响应函数
打开连接(指定请求)
发送请求
创建响应函数
注:第三步是使用XMLHttpRequest对象的open()方法,字面意思open是打开的意思,即打开连接。但是准确的说应该是指定Http请求。因为浏览器在使用AJAX技术与服务通信时,发送的是Http请求,那么就要指定Http的请求方法,url等信息。
二、参考代码(W3C)
var xmlhttp=null;//声明一个变量,用来实例化XMLHttpRequest对象
if (window.XMLHttpRequest)
{
xmlhttp=new XMLHttpRequest();// 新版本的浏览器可以直接创建XMLHttpRequest对象
}
else if (window.ActiveXObject)
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");// IE5或IE6没有XMLHttpRequest对象,而是用的ActiveXObject对象
}
if (xmlhttp!=null)
{
xmlhttp.onreadystatechange=state_Change;//指定响应函数为state_Change
xmlhttp.open("GET","/example/xdom/note.xml",true);//指定请求,这里要访问在/example/xdom路径下的note.xml文件,true代表的使用的是异步请求
xmlhttp.send(null);//发送请求
}
else
{
alert("Your browser does not support XMLHTTP.");
}
//创建具体的响应函数state_Change
function state_Change()
{
if (xmlhttp.readyState==4)
{
if (xmlhttp.status==200)
{
// 这里应该是函数具体的逻辑
}
else
{
alert("Problem retrieving XML data");
}
}
}
创建XMLHttpRequest对象 (1-10行代码)
指定响应函数(第15行代码)
打开连接(指定请求)(第16行代码)
发送请求(第18行代码)
创建响应函数(25-38行代码)
这个是W3C上讲解AJAX的代码,比较权威,我做了一些注释,方便大家理解。面试的时候写这段代码应该是没有问题的。
W3C原文链接
三、参考代码(MDN)
<!--html部分,创建一个按钮控件-->
<span id="ajaxButton">
Make a request
</span>
<script type="text/javascript">
(function() {
var httpRequest;//声明一个变量,用来实例化XMLHttpRequest对象
document.getElementById("ajaxButton").onclick = function() { makeRequest(''test.html''); }; //这里将AJAX操作封装在makeRequest函数中,函数的参数为要请求的url,即根目录下的test.html文件。
function makeRequest(url) {
httpRequest = new XMLHttpRequest();//创建XMLHttpRequest对象
if (!httpRequest) {
alert(''Giving up :( Cannot create an XMLHTTP instance'');
return false;
}
httpRequest.onreadystatechange = alertContents;//指定响应函数为alertContents
httpRequest.open(''GET'', url); //指定请求,方法为GET,url为上面的test.html
httpRequest.send();//发送请求
}
//创建响应函数alertContents
function alertContents() {
if (httpRequest.readyState === XMLHttpRequest.DONE) {
if (httpRequest.status === 200) {
alert(httpRequest.responseText);
} else {
alert(''There was a problem with the request.'');
}
}
}
})();//这是一个立即执行函数
</script>
创建XMLHttpRequest对象 (第13行代码)
指定响应函数(第19行代码)
打开连接(指定请求)(第21行代码)
发送请求(第23行代码)
创建响应函数(29-37行代码)
这个是MDN上讲解AJAX的代码,我做了一些注释,方便大家理解。
MDN原文链接
四、总结
这篇文章讲解了如何较为规范的手写AJAX,下篇文章我会具体介绍XMLHttpRequest对象的有关知识以及AJAX相关的Http请求的知识。
Ajax调用后台方法的几种写法(二) Ajax.dll
使用插件Ajax.dll或者AjaxPro.dll。咱使用了Ajax.dll,需先去网上下载Ajax.dll,然后引用到项目中,并在Web.Config中配置如下:
在system.web的节点下加上这句,
<httpHandlers> <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory,Ajax" /> </httpHandlers>
页面代码:
<div id="Div_1"> </div> <asp:Button ID="btnOK" runat="server" Text="OK" OnClientClick="return Calltest();" /> <br/><asp:Label ID="lblEmpNo" runat="server"></asp:Label>
JS代码:
<script> //这个方法用户接受并处理服务器端返回的结果。 function getGroups_callback(response) { var dt = response.value; //这个值就是最终传回来的值,想怎么用就怎么用,反正回前台了。 document.getElementById("Div_1").innerHTML = dt; } function Calltest() { var EmpName = document.getElementById('txtClientId').value; WebFormAjax.Test(EmpName,getGroups_callback); return false; } </script>
protected void Page_Load(object sender,EventArgs e) { Ajax.Utility.RegisterTypeForAjax(typeof(WebFormAjax)); //typeof的参数是该页面所在的类名 } [Ajax.AjaxMethod] //必须加上这个标签 public string Test(string EmpName) { Thread.Sleep(3000); if (lblEmpNo != null) //前台调用还是无法访问服务器控件Label,该控件为null,遗憾,也就是说明无法在后台给前台的服务器控件赋值 { lblEmpNo.Text = EmpName + "123"; } return EmpName + "abc"; }
局限性:使用Ajax.dll在调用后台方面确实方便许多,但是无法再后台给前台的服务器控件赋值,只能在后台方法中返回值到前台,在前台通过JS赋值给控件。
其实本人的目的是想试验一个这样的功能,前台的按钮在后台事件中能给其他服务器控件赋值,特别是GridView绑定数据这种,但是由于数据量多,这个过程会比较慢,又想在前台加一个等待的遮罩提示,直到数据完全绑定到GridView上,遮罩层才消失。这就必须用Ajax。
很显然,上面的这种方式无法满足我,因为它无法再后台绑定GridView。但是它可以返回一个DataTable,然后在前台用JS取出DataTable的值,一行一行绑定到GridView上,这个复杂啊,郁闷啊,若再来个分页的,就更麻烦了。
这是从网上看来的一个例子,说明刚才的这种情况。此处用的是AjaxPro.dll,它与Ajax.dll区别不大。
HTML代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ajaxpro-no-refresh-update-gridview.aspx.cs" Inherits="ajaxpro_no_refresh_update_gridview" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <Meta http-equiv="content-type" content="text/html;charset=utf-8" /> <title>ajaxpro无刷新更新gridview数据</title> </head> <body> <script type="text/javascript"> function reload() { ajaxpro_no_refresh_update_gridview.GridViewSource(callback); } function callback(r) { var rows = r.value.Rows,tb = document.getElementById('gv1'),tr,td; while (tb.rows.length > 1) tb.deleteRow(1); //删除除了页头的行,此处保留了表头 for (var i = 0; i < rows.length; i++) { tr = tb.insertRow(tb.rows.length); td = tr.insertCell(0); td.innerHTML = rows[i].Id; td = tr.insertCell(1); td.innerHTML = rows[i].rndNum; //一个格子一个格子的赋值,多么悲催啊,况且它还没有分页行,这个例子就暂且参考吧。 } } </script> <table id="tb1"></table> <form id="form1" runat="server"><input type="button" value="马上更新" onclick="reload()"/> <asp:GridView runat="server" ID="gv1"></asp:GridView> </form><!--一定不能缺少runat为server的表单,要不然ajaxpro不会自动生成对应的脚本和导入相关的框架代码--> </body> </html>
C# 后台代码:
using System; using System.Data; public partial class ajaxpro_no_refresh_update_gridview : System.Web.UI.Page { protected void Page_Load(object sender,EventArgs e) { AjaxPro.Utility.RegisterTypeForAjax(typeof(ajaxpro_no_refresh_update_gridview)); gv1.DataSource = CreateDataSouce(); gv1.DataBind(); //正是因为第一次Load就绑定了GridView,才有了它的表头。若此处从未绑定,上面的JS就无从找表头了 } private DataTable CreateDataSouce() {//创建数据源 DataTable dt = new DataTable(); dt.Columns.Add("Id"); dt.Columns.Add("rndNum"); Random r = new Random(); for (int i = 0; i < 20; i++) dt.Rows.Add(i,r.Next(1,1000)); return dt; } [AjaxPro.AjaxMethod] public DataTable GridViewSource() { return CreateDataSouce(); //返回了DataTable去前台 } }
关于浅谈ajax和二的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Ajax入门(二)Ajax函数封装、Ajax学习(二)—— 一个简单的Ajax实例、AJAX总结(二),手写AJAX、Ajax调用后台方法的几种写法(二) Ajax.dll等相关知识的信息别忘了在本站进行查找喔。
本文标签: