Ajax和Jsonp实践

之前一直使用jQuery的ajax方法,导致自己对浏览器原生的XMLHttpRequest对象不是很熟悉,于是决定自己写下,以下是个人写的deom,发表一下,聊表纪念。

Ajax 和 jsonp
的javascript 实现:


/*!
* ajax.js
* ? auth zernmal
* @ description XMLHttpRequest and Jsonp practice
*/

function ajax(url,options ){

var options = options || {} ,
method = options.method || "GET",
async = (typeof options.async !== "undefined") ? options.async : true ,
user = (typeof options.user !== "undefined") ? options.user : "" ,
pswd = (typeof options.pswd !== "undefined") ? options.pswd : "" ,
reciveType = options.reciveType || "string" ,
data = options.data || null ,
header = options.header || [],
callback = options.callback || function(){},
xhr = XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

if(method==‘GET‘ && data){

var dataStr = [];

url = (url.indexOf("?")==-1) ? url + "?" : url + "&" ;

for(var i in data){
dataStr.push( i + "=" + data[i]) ;
}
url += dataStr.join("&");
data = null;
}else if(data){
var form = new FormData();
for(var i in data){
form.append( i , data[i]);
}
data = form;
}

xhr.onreadystatechange = function() {

if (xhr.readyState == 4) {// 4 = "loaded"
if (xhr.status == 200) {// 200 = OK

var responseData = null ;

if(reciveType==="string"){
responseData = xhr.responseText;
}else if(reciveType === "json"){
responseData = xhr.responseText;

if( false && JSON && JSON.parse) {
responseData = JSON.parse(responseData);
}else{
responseData = eval(‘(‘+responseData+‘)‘);
}
}

options.callback && options.callback(responseData);
} else {
alert("Problem retrieving XML data");
}
}
};

xhr.open(method , url , async , user ,pswd);

for(var i = header.length -1 ; i > 0 ; i--){
xhr.setRequestHeader(header[i].type, header[i].content);
}

xhr.send(data);
}

function jsonp(url , options){
var options = options || {} ,
script = document.createElement(‘script‘) ,
callback = options.callback || function(result){} ,
callbackName = ‘myjsonpcall‘+ (new Date()).getTime(),
data = options.data || {} ,
dataStr = [];

for(var i in data){
dataStr.push( i + "=" + data[i]) ;
}

if(url.indexOf("?")==-1){
url += "?"+ dataStr.join("&") +"&callback="+callbackName;
}else{
url += "&"+ dataStr.join("&") +"&callback="+callbackName;
}

script.setAttribute(‘src‘, url);
window[callbackName] = callback ;

// 把script标签加入head,此时调用开始
document.getElementsByTagName(‘head‘)[0].appendChild(script);
}

PHP服务端响应请求:


<?php

$func = $_GET[‘func‘];

if(function_exists($func)){
$func();
}else{
funcNotExist();
}

function funcNotExist(){
echo "function is not exist ! ";
}

function returnJson(){
$lastName = $_GET[‘lastName‘];
$firstName = $_GET[‘firstName‘];

echo json_encode(array(‘firstName‘=>$firstName,‘lastName‘=>$lastName));
}

function returnString(){
$lastName = $_GET[‘lastName‘];
$firstName = $_GET[‘firstName‘];
echo "the string you send is ".$lastName." ".$firstName;
}

function postReturn(){
$lastName = $_POST[‘lastName‘];
$firstName = $_POST[‘firstName‘];
echo "the string you post is ".$lastName." ".$firstName;
}

function jsonP(){

header(‘content-type: application/json; charset=utf-8‘);
$lastName = $_GET[‘lastName‘];
$firstName = $_GET[‘firstName‘];
$callbackFunc = isset($_GET[‘callback‘])? htmlspecialchars($_GET[‘callback‘]):"callback";
$json = json_encode(array(‘firstName‘=>$firstName,‘lastName‘=>$lastName));

echo "$callbackFunc($json)";
}

页面内调用方法:


<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ajax与Jsonp实践</title>
<script type="text/javascript" src="js/ajax.js"></script>
</head>
<body>
<script>
jsonp("/ajax.php?func=jsonP",{
callback : function(result){
console.log(result);
},
data : {
lastName : "zernmal" ,
firstName : "chen"
}
});

ajax("/ajax.php?func=returnJson",{
method : "GET",
callback : function(result){
console.log(result);
},
data : {
lastName : "zernmal" ,
firstName : "chen"
} ,
reciveType : "json"
});
</script>
</body>
</html>

以上只是简单实验,如有问题欢迎提出。

时间: 2024-10-12 12:15:31

Ajax和Jsonp实践的相关文章

Ajax和Jsonp的工作原理,以及区别。

Ajax工作原理是 相当于在用户和服务器之间加了-个中间层(AJAX引擎),使用户操作与服务器响应异步化. 对于用户请求ajax引擎会做一些数据验证和数据处理,不是所有请求都提交给服务器,当需要从服务器读取新数据时由Ajax引擎代为向服务器提交请求.AJAX最大优点就是不刷新整个页面的前提下与服务器通信维护数据. 过程的话 第一步:创建一个ajax引擎对象,ie6的是new ActiveXObject其他浏览器是new一个xmlHttpRequest对象 第二步 调用open方法启动一个请求以备

json和jsonp的区别,ajax和jsonp的区别

json和jsonp虽然只有一个字母的区别,但是它们之间扯不上关系. json是一种轻量级的数据交换格式. jsonp是一种跨域数据交互协议. json的优点:(1)基于纯文本传递极其简单,(2)轻量级数据格式适合互联网传递,(3)容易编写和解析. ajax和jsonp的区别: 相同点:都是请求一个url 不同点:ajax的核心是通过xmlHttpRequest获取内容 jsonp的核心则是动态添加<script>标签来调用服务器 提供的js脚本. --- <来源于网络>

jQuery源码分析系列(34) : Ajax - 预处理jsonp

上一章大概讲了前置过滤器和请求分发器的作用,这一章主要是具体分析每种对应的处理方式 $.ajax()调用不同类型的响应,被传递到成功处理函数之前,会经过不同种类的预处理(prefilters). 预处理的类型取决于由更加接近默认的Content-Type响应,但可以明确使用dataType选项进行设置.如果提供了dataType选项, 响应的Content-Type头信息将被忽略. 有效的数据类型是text, html, xml, json,jsonp,和 script. dataType:预期

ajax 和jsonp 不是一码事

由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯和本地数据库功能,又或者通过HTML5的WebSocket也可以实现与服务器的通讯和服务端推功能,但这两种方式都有其局限性,前者需要PhoneGap支持,后者要求用户设备必须支持WebSocket,因此都不能算是ST2的原生解决方案,原生的只有AJAX. 说到AJAX就会不可避免的面临两个问题,第一

关于jQuery.ajax()的jsonp碰上post详解

前言 以前一直以为当$.ajax()的 dataType设置为jsonp时,其method(请求方法)无论怎么设置,都会变成get,直到前两天遇到了一个坑. 下面来一起看看详细的介绍: 关于跨域请求与jsonp 跨域:由于受到同源策略(协议.域名.端口三者必须全部相同)的影响,ajax请求会受到限制,要突破这种限制,跨域便产生了.跨域的解决方案有多种,这里不展开阐述,只是针对GET请求中的jsonp跨域解决方案做一下说明. jsonp,本质上jsonp不是xhr异步请求,就是请求了一个js文件,

笔记-Ajax[4]-JSONP跨域获取数据。

JS的跨域:跨域名获取数据,a域名获取b域名中的数据. 解决跨域获取数据的方法也叫JSONP(JSON and Padding) JSONP方法: 1:服务器代理:XMLHttpRequest代理文件 2:script标签:jsonp(常用);//利用script标签的src引入外部文件的功能,src能够引入任何的文件的类型 3:location.hash方式:iframe 4:window.name方式 5:flash方式 6:html5的postMessage方式 例子:百度输入数据下拉框提

ajax和jsonp的封装

一直在用jQuery的ajax,跨域也是一直用的jQuery的jsonp,jQuery确实很方便,$.ajax({...})就可以搞定. 为了更好的理解ajax和jsonp,又重新看了下书,看了一些博客,参照他们的代码封装了一个简单的库. 代码地址:http://files.cnblogs.com/zjzhome/ajax.js 使用方法和jQuery类似. 不跨域的话: Z.ajax('test.php', { data: { name: 'zjz', age: 10 }, dataType:

vue.js的ajax和jsonp请求

首先要声明使用ajax 在 router下边的 Index.js中 import VueResource from 'vue-resource'; Vue.use(VueResource); ajax 和 jsonp 使用方法: //在Vue实例类使用 this.$http.get(url, [options]).then(successCallback, errorCallback); var test = new Vue({ el:'#v', data:{ jsonUrl:'xxxx', j

ajax 和jsonp 不是一码事 细读详解

由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯和本地数据库功能,又或者通过HTML5的WebSocket也可以实现与服务器的通讯和服务端推功能,但这两种方式都有其局限性,前者需要PhoneGap支持,后者要求用户设备必须支持WebSocket,因此都不能算是ST2的原生解决方案,原生的只有AJAX. 说到AJAX就会不可避免的面临两个问题,第一