之前一直使用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>

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

Ajax和Jsonp实践的更多相关文章

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

    json和jsonp虽然只有一个字母的区别,但是它们之间扯不上关系. json是一种轻量级的数据交换格式. jsonp是一种跨域数据交互协议. json的优点:(1)基于纯文本传递极其简单,(2)轻量 ...

  2. 原生javascript封装ajax和jsonp

    在我们请求数据时,完成页面跨域,利用原生JS封装的ajax和jsonp: <!DOCTYPE html> <html lang="en"> <head ...

  3. ajax和jsonp的封装

    一直在用jQuery的ajax,跨域也是一直用的jQuery的jsonp,jQuery确实很方便,$.ajax({...})就可以搞定. 为了更好的理解ajax和jsonp,又重新看了下书,看了一些博 ...

  4. 针对AJAX与JSONP的异同

    针对AJAX与JSONP的异同       1.ajax和jsonp这两种技术在调用方式上“看起来”很像,目的也一样,都是请求一个url,然后把服务器返回的数据进行处理,因此jquery和ext等框架 ...

  5. ajax和jsonp使用总结

    前言:ajax和jsonp可以与后台通信,获取数据和信息,但是又不用刷新整个页面,实现页面的局部刷新. 一.ajax 定义:一种发送http请求与后台进行异步通讯的技术. 原理:实例化xmlhttp对 ...

  6. ajax 和jsonp 不是一码事

    由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socket通讯 ...

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

    前言 以前一直以为当$.ajax()的 dataType设置为jsonp时,其method(请求方法)无论怎么设置,都会变成get,直到前两天遇到了一个坑. 下面来一起看看详细的介绍: 关于跨域请求与 ...

  8. 原生 JavaScript 实现 AJAX、JSONP

    相信大多数前端开发者在需要与后端进行数据交互时,为了方便快捷,都会选择JQuery中封装的AJAX方法,但是有些时候,我们只需要JQuery的AJAX请求方法,而其他的功能用到的很少,这显然是没必要的 ...

  9. ajax和jsonp

    ajax和jsonp 前言:ajax和jsonp可以与后台通信,获取数据和信息,但是又不用刷新整个页面,实现页面的局部刷新. 一.ajax 定义:一种发送http请求与后台进行异步通讯的技术. 原理: ...

随机推荐

  1. HDU-2389

    Rain on your Parade Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 655350/165535 K (Java/Ot ...

  2. maven新建web项目提示The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    maven新建web项目提示The superclass "javax.servlet.http.HttpServlet" was not found on the Java Bu ...

  3. beatfullsoup

    阅读目录 一 介绍 二 基本使用 三 遍历文档树 四 搜索文档树 五 修改文档树 六 总结 一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通 ...

  4. 如何设置WordPress文章特色图像(Featured Image)

    WordPress的特色图像(Featured Image)是一个很方便的功能,过去为了给每篇文章设置一个缩略图,我们需要用脚本去匹配文章中的第一张或者最后一张图片,或者通过附件方式获取图片,有了特色 ...

  5. CentOS7.5安装notepadqq

    这个notepadqq就是linux版本的notepad了 1.添加yum源 sudo wget -O /etc/yum.repos.d/sea-devel.repo http://sea.fedor ...

  6. 利用tengine的nginx_upstream_check_module来检测后端服务状态

    nginx_upstream_check_module 是专门提供负载均衡器内节点的健康检查的外部模块,由淘宝的姚伟斌大神开发,通过它可以用来检测后端 realserver 的健康状态.如果后端 re ...

  7. 如何开启apache的PHP-FPM实例

    PHP-FPM 作为 FastCGI 进程管理器而广为熟知,它是PHPFastCGI 实现的改进,带有更为有用的功能,用于处理高负载的服务器和网站.下面列出其中一些功能: 新功能 拥有具有优雅(gra ...

  8. RecyclerView 和 ListView 使用对比分析

    原文地址:http://blog.coderclock.com/2016/08/08/android/RecyclerView%20%E5%92%8C%20ListView%20%E4%BD%BF%E ...

  9. AutoHotKey 常用脚本

    ; IMPORTANT INFO ABOUT GETTING STARTED: Lines that start with a ; semicolon, such as this one, are c ...

  10. Flask实战第64天:帖子加精和取消加精功能完成

    帖子加精和取消加精是在cms后台来设置的 后台逻辑 首页个帖子加精设计个模型表,编辑apps.models.py class HighlightPostModel(db.Model): __table ...