`
shenjc2008
  • 浏览: 139800 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

javascript实现ajax请求基本功能

阅读更多
基于考虑jquery太大了,其中ajax部分也占了不少体积的原因,所以还是自己来写个简单的类库,今天花了点时间,加上实现ajax请求模块,实现简单get、post提交、form表单提交功能:

	// ajax--start
	/**
	 * 实例化XmlHttpRequest的方法<br />
	 * 
	 * 返回对象具有如下属性:<br />
	 * responseBody 将回应信息正文以unsigned byte数组形式返回.只读<br />
	 * responseStream 以Ado Stream对象的形式返回响应信息.只读<br />
	 * responseText 将响应信息作为字符串返回.只读<br />
	 * responseXML 将响应信息格式化为Xml Document对象并返回,只读<br />
	 * status 返回当前请求的http状态码.只读<br />
	 * statusText 返回当前请求的响应行状态,只读<br />
	 * 
	 * 返回对象具有如下方法:<br />
	 * abort 取消当前请求<br />
	 * getAllResponseHeaders 获取响应的所有http头<br />
	 * getResponseHeader 从响应信息中获取指定的http头<br />
	 * open 创建一个新的http请求,并指定此请求的方法、URL以及验证信息(用户名/密码)<br />
	 * send 发送请求到http服务器并接收回应<br />
	 * setRequestHeader 单独指定请求的某个http头
	 */
	var initXmlHttpRequest = window.ActiveXObject ?
	/*
	 * Microsoft failed to properly implement the XMLHttpRequest in IE7 (can't
	 * request local files), so we use the ActiveXObject when it is available
	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so we need a
	 * fallback.
	 */
	function() {
		if (window.location.protocol !== "file:") {
			try {
				return new window.XMLHttpRequest();
			} catch (xhrError) {
			}
		}

		try {
			return new window.ActiveXObject("MSXML2.XMLHTTP");// Msxml2.XMLHTTP是高版本,受msxml3.dll+支持
		} catch (activeError_MSXML2_XMLHTTP) {
			try {
				return new window.ActiveXObject("Microsoft.XMLHTTP");// Microsoft.XMLHTTP是低本,一般是msxml2.6以下版本使用
			} catch (activeError_Microsoft_XMLHTTP) {
			}
		}
	} :
	// 其他所有浏览器, 使用标准XMLHttpRequest对象
	function() {
		return new window.XMLHttpRequest();
	};

	var doAjax = function(url, method, callbacks, async) {
		var xhr = false;
		xhr = initXmlHttpRequest();

		if (!xhr)
			return false;

		if (!method || !url || !async)
			return false;
		xhr.open(method, url, async);
		if (method == "POST")
			xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

		xhr.onreadystatechange = function() {
			/**
			 * readyState 返回当前请求的状态,只读。定义如下:<br />
			 * 0 (未初始化) 对象已建立,但是尚未初始化(尚未调用open方法)<br />
			 * 1 (初始化) 对象已建立,尚未调用send方法<br />
			 * 2 (发送数据) send方法已调用,但是当前的状态及http头未知<br />
			 * 3 (数据传送中)已接收部分数据,因为响应及http头不全,
			 * 这时通过responseBody和responseText获取部分数据会出现错误<br />
			 * 4 (完成) 数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据<br />
			 */
			if (xhr.readyState == 1) {// onLoadingInternal
				if (callbacks.onLoading != null)
					callbacks.onLoading();
			}
			if (xhr.readyState == 2) {// onLoadedInternal
				if (callbacks.onLoaded != null)
					callbacks.onLoaded();
			}
			if (xhr.readyState == 3) {// onInteractiveInternal
				if (callbacks.onInteractive != null)
					callbacks.onInteractive();
			}
			if (xhr.readyState == 4) {// onCompleteInternal
				if (callbacks.onComplete != null)
					callbacks.onComplete();
				if (xhr.status == 200) {
					if (callbacks.onSuccess != null)
						callbacks.onSuccess(xhr.responseText);
				}
			}
		}
		if (method == "POST")
			xhr.send(this.content);
		else
			xhr.send(null);

	};

	// 把form表单格式化为url格式
	var serializeForm = function(form) {
		var els = form.elements;
		var len = els.length;
		var queryString = "";
		this.addField = function(name, value) {
			if (queryString.length > 0) {
				queryString += "&";
			}
			queryString += encodeURIComponent(name) + "=" + encodeURIComponent(value);
		};
		for ( var i = 0; i < len; i++) {
			var el = els[i];
			if (!el.disabled) {
				switch (el.type) {
				case 'text':
				case 'password':
				case 'hidden':
				case 'textarea':
					this.addField(el.name, el.value);
					break;
				case 'select-one':
					if (el.selectedIndex >= 0) {
						this.addField(el.name, el.options[el.selectedIndex].value);
					}
					break;
				case 'select-multiple':
					for ( var j = 0; j < el.options.length; j++) {
						if (el.options[j].selected) {
							this.addField(el.name, el.options[j].value);
						}
					}
					break;
				case 'checkbox':
				case 'radio':
					if (el.checked) {
						this.addField(el.name, el.value);
					}
					break;
				}
			}
		}
		return queryString;
	};

	jMeteor.extend( { ajax : function(options) {
		var ajaxSettings = {};
		for (name in options) {
			ajaxSettings[name] = options[name];
		}

		if (options["form"] != null) {
			var theform = options["form"];
			if (ajaxSettings.url == null)// 如果只定义form,没定义url
				ajaxSettings.url = theform.action + "?" + serializeForm(theform);
			else {// 如果form和url同时定义,则已url为准//如果form和url同时定义,则已url为准
				var s = (ajaxSettings.url.indexOf("?") == -1) ? "?" : "&";
				ajaxSettings.url = ajaxSettings.url + s + serializeForm(theform);
			}

			if (ajaxSettings.type == null)// 如果form和type同时定义,则已url为准//如果form和type同时定义,则已type为准
				ajaxSettings.type = theform.method.toUpperCase();
		}

		ajaxSettings.callbacks = {};
		ajaxSettings.callbacks.onLoading = options['onLoading'];
		ajaxSettings.callbacks.onLoaded = options['onLoaded'];
		ajaxSettings.callbacks.onInteractive = options['onInteractive'];
		ajaxSettings.callbacks.onComplete = options['onComplete'];
		ajaxSettings.callbacks.onSuccess = options['onSuccess'];
		doAjax(ajaxSettings.url, ajaxSettings.type, ajaxSettings.callbacks, true);
	},

	get : function(url, callbacks) {
		return doAjax(url, "GET", callbacks, true);
	},

	post : function(url, callbacks) {
		return doAjax(url, "POST", callbacks, true);
	},

	form : function(form, callbacks) {
		var options = {};
		options["form"] = form;
		for (name in callbacks) {
			options[name] = callbacks[name];
		}
		return jMeteor.ajax(options);
	} });
	// ajax--end




调用方法:
function doAjaxGet() {
	$.get('http://localhost/test/testAjax.do', 
		{onSuccess:function(d) { alert("Success:"+d); }});
}
function doAjaxPost() {
	$.post('http://localhost/test/testAjax.do', 
		{onSuccess:function(d) { alert("Success:"+d); }});
}
function doAjaxForm() {
	$.form(document.searchFrm, 
		{onSuccess:function(d) { alert("Success:"+d); }});
}

function doAjaxAjax() {	
	$.ajax({
	  type: "GET",
	  url: "http://localhost/test/testAjax.do",	  
	  onLoading:function() { alert("Loading"); },
      onLoaded:function() { alert("Loaded"); },
      onInteractive:function() { alert("Interactive"); },
      onComplete:function() { alert("Complete"); },
      onSuccess:function(d) { alert("Success:"+d); }
	});	
}

// 如果form和url同时定义,则已url为准//如果form和url同时定义,则已url为准
// 如果form和type同时定义,则已url为准//如果form和type同时定义,则已type为准
function doAjaxAjaxForm() {	
	$.ajax({
	  type: "GET",
	  url: "http://localhost/test/testAjax.do?a=3",	  
	  form : document.searchFrm,	  
	  onLoading:function() { alert("Loading"); },
      onLoaded:function() { alert("Loaded"); },
      onInteractive:function() { alert("Interactive"); },
      onComplete:function() { alert("Complete"); },
    	onSuccess:function(d) { alert("Success:"+d); }
	});	
}



现在只是实现一些简单功能,以后再改进改进。
0
0
分享到:
评论

相关推荐

    原生javascript实现ajax 发送post请求

    原生javascript实现ajax发送pos请求,这样可以脱离jquery框架,

    实例详解Android Webview拦截ajax请求

    这意味着我们不能在 Webview 中干涉 JavaScript 发起的 HTTP 请求,而有时候我们确实需要能够截获 Ajax 请求并实现一些功能,如统一的网络请求管理、 Cookie 同步、证书校验、访问控制等。 那么,我们可以转换思路...

    纯JavaScript实现Ajax

    在Java中,你可以使用Spring MVC、Servlet或其他Web框架来创建RESTful API,接收前端的Ajax请求并返回数据。 例如,Java后端可能会有这样一个方法: ```java @GetMapping("/data") public ResponseEntity&lt;Object&gt; ...

    原生JavaScript实现Ajax异步请求

    所以接下来便用原生JavaScrpit实现一个简单的Ajax请求,并说明ajax请求中的跨域访问问题,以及多个ajax请求的数据同步问题。 JavaScript实现Ajax异步请求 简单的ajax请求实现 Ajax请求的原理是创建一个...

    【AJAX】传统JavaScript实现AJAX的小栗子

    通常,这样的博客会包含如何创建和使用AJAX请求的步骤,以及可能遇到的问题和解决方案。 **标签解析:** "源码"标签暗示我们将看到实际的JavaScript代码,这对于学习和理解AJAX的工作原理至关重要。"工具"可能指的...

    Js拦截全局ajax请求

    Ajax Hook允许我们捕获并修改发送到服务器的Ajax请求以及接收到的响应,从而增强我们的应用功能。 首先,我们需要理解Ajax请求的基本原理。Ajax,即异步JavaScript和XML,是一种创建动态网页的技术。它允许我们在不...

    HTML使用极简的方式通过ajax请求实现前后端交互代码实现

    jQuery是一个强大的JavaScript库,它简化了DOM操作,事件处理,动画效果以及,当然,包括AJAX请求。使用jQuery的$.ajax()函数,我们可以轻松地发起异步请求: ```javascript $.ajax({ url: 'your_server_endpoint'...

    Jquery跨域Ajax请求测试

    本示例"Jquery跨域Ajax请求测试"将详细讲解如何利用jQuery实现这一功能。 首先,了解同源策略是理解跨域问题的关键。同源策略是浏览器为了保障用户安全而设定的一项机制,它规定了只有来自同一协议、同一域名和同一...

    chrome扩展插件获取ajax请求记录

    开发者可以通过过滤功能只显示Ajax请求,从而更方便地查看和分析。 此外,Chrome的"Chrome DevTools Protocol"也允许开发者通过编写自定义的Chrome扩展来获取Ajax请求记录。这个协议提供了一套JSON-over-WebSocket ...

    javascript发送ajax请求,获取返回值res,async 同步/异步

    javascript发送ajax请求,获取返回值res,async 同步/异步 var res = sendRequest({ url : "1.php", //necessary method : "post", params : { param1 : "123", param2 : "234" }, async : false });

    JavaScript语言与Ajax应用第二版_JavaScript语言与Ajax应用_JavaScript应用_javascri

    8. **错误处理与调试**:学习如何有效地处理JavaScript和Ajax请求中的错误,以及使用浏览器的开发者工具进行调试,是提升开发效率和代码质量的重要环节。 9. **jQuery与Ajax**:jQuery是一个流行的JavaScript库,...

    Java通过jQuery实现ajax异步请求

    综上所述,"Java通过jQuery实现ajax异步请求"的示例工程涵盖了客户端与服务器端的交互流程,包括使用jQuery发起AJAX请求、Java后端处理请求并返回数据,以及数据格式的转换和错误处理。了解并掌握这些知识点,对于...

    extjs ajax同步请求所需js

    在提供的压缩包文件中,`ext-basex.js`可能是ExtJS库的一个组成部分,包含了对Ajax请求等基础功能的支持。这个文件可能包含了实现同步请求的必要代码,但具体使用时还需要结合其他组件和配置。 总的来说,虽然同步...

    挑战javascript&ajax应用开发

    最后,实践编写 AJAX 请求,结合服务器端脚本,实现实际的交互功能。 **进阶知识** 1. **jQuery**:一个流行的 JavaScript 库,简化了 DOM 操作和 AJAX 调用,加速开发进程。 2. **Promise 和 async/await**:现代 ...

    javascript实现ajax效果的经典代码

    本示例代码着重于使用纯 JavaScript 实现这一功能,无需依赖任何外部库,如 jQuery 或其他 AJAX 库。 在传统的网页交互中,用户必须等待整个页面加载完成才能看到更新的内容,而 AJAX 提供了一种更加高效和用户友好...

    原生JavaScript实现Ajax的方法

    这些是原生JavaScript实现Ajax请求的基本方法。通过这些方法,开发者可以实现简单的异步数据交互。需要注意的是,随着前端技术的发展,出现了许多现代化的库和框架(如jQuery、Fetch API等),它们提供了更简洁、更...

    AjAX JavaScript中使用表单实现留言功能

    本篇文章将详细讲解如何利用AJAX和JavaScript在网页上实现一个基本的留言功能。 首先,AJAX的核心在于异步数据交换,它允许网页在不刷新整个页面的情况下与服务器进行通信,提升用户体验。AJAX通过创建...

    Javascript发送AJAX请求实例代码

    在JavaScript中,我们可以使用XMLHttpRequest对象或者更现代的fetch API来实现AJAX请求。这里我们将详细讨论`ajax`函数的实现及其工作原理。 首先,我们创建一个名为`ajax`的函数,它接受两个参数:`url`(请求的...

    AJAX实现分页功能

    在"AjaxPager"这个文件中,应该包含了实现上述功能的代码示例,包括JavaScript文件(可能包含AJAX请求的逻辑)、服务器端的处理代码(可能是ASP.NET的代码-behind文件)以及相关的HTML或ASP.NET页面结构。...

Global site tag (gtag.js) - Google Analytics