JSON和JSONP

如果在同一个域下,$.ajax()方法只要设置dataType属性即可加载JSON文件。而在非同域下,可以使用JSONP,但也是有条件的。

Ajax进阶.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Ajax进阶</title>
<script type="text/javascript" src="jquery-1.12.3.js"></script>
<script type="text/javascript" src="demo.js"></script>
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<body>
<form>
用户名:<input type="text" name="user" />
邮 件:<input type="text" name="email" />
<input type="radio" name="sex" value="男" />男
<input type="radio" name="sex" value="女" />女
<input type="button" value="提交" />
</form>
<span class="loading">正在加载中...</span>
<div id="box"> </div>
</body>
</html>

tomcat服务器端test.json:

[
{
"url" : "www.ycku.com"
}
]

若没有声明dataType(即dataType:"html"):

$("form input[type=button]").click(function() {
$.ajax({
type:"post",
url:"test.json",
success:function(response, status, xhr) {
alert(response); //若没有声明dataType(即dataType:"html"),test.json的整个文件内容都会返回(连带test.json的标签)
alert(response[0].url); //若没有声明dataType(即dataType:"html"),返回undefined
}
});
});

所以,需要声明返回的类型是“json”,$.ajax()加载JSON文件:

$("form input[type=button]").click(function() {
$.ajax({
type:"post",
url:"test.json",
dataType:"json",
success:function(response, status, xhr) {
alert(response); //[object Object]
alert(response[0].url); //www.ycku.com
}
});
});

现在来看跨域处理问题。

一、①本地获取,本地tomcat服务器端有jsonp.php文件:(也不知道嘛意思?)

<?php
//这个文件是远程端:http://www.li.cc/jsonp.php
$_arr = array('a'=>1,'b'=>2,'c'=>3);
$_result = json_encode($_arr);
echo $_result;
?>
//本地获取jsonp.php文件,成功
$("form input[type=button]").click(function() {
$.ajax({
type:"post",
url:"jsonp.php",
dataType:"json",
success:function(response, status, xhr) {
//alert(response);
console.log(response);
alert(response.a); //1 本地获取没问题
}
});
});

②跨域获取,将jsonp.php文件放在远程端http://www.li.cc

//跨域获取jsonp.php文件,失败
$("form input[type=button]").click(function() {
$.ajax({
type:"post",
url:"http://www.ll.cc/jsonp.php",
dataType:"json",
success:function(response, status, xhr) {
//alert(response);
console.log(response);
alert(response.a);
}
});
});

二、①本地获取,本地tomcat服务器端有jsonp2.php文件:

如果想跨域操作文件的话,我们就必须使用JSONP。JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。

<?php
//这个文件是远程端:http://www.li.cc/jsonp2.php
$_arr = array('a'=>1,'b'=>2,'c'=>3);
$_result = json_encode($_arr);
$_callback = $_GET['callback'];
echo $_callback."($_result)";
?>
//本地获取jsonp2.php文件,成功
$("form input[type=button]").click(function() {
$.getJSON("jsonp2.php?callback=?", function() {
alert(response.a); //
console.log(response);
});
});

url中参数callback值的可以是任意数,也可传一个?(会生成一个随机数),如上,会发现传过去的是诸如:

callback=jQuery112305981071515026646_1461671727709&_=1461671727710

②$.getJSON()方法跨域获取JSON

$("form input[type=button]").click(function() {
$.getJSON("http://www.ll.cc/jsonp2.php?callback=?", function() {
alert(response.a); //
console.log(response);
});
});

$.ajax()方法跨域获取JSON:

$("form input[type=button]").click(function() {
$.ajax({
type:"post",
url:"http://www.ll.cc/jsonp2.php?callback=?",
dataType:"json",
success:function(response, status, xhr) {
//alert(response);
console.log(response);
alert(response.a);
}
});
});

因为返回类型不是jsonp,所以无法达到我们预期的效果,所以应修改为:

$("form input[type=button]").click(function() {
$.ajax({
type:"post",
url:"http://www.ll.cc/jsonp2.php?callback=?",
dataType:"jsonp",
success:function(response, status, xhr) {
//alert(response);
console.log(response);
alert(response.a);
}
});
});

jqXHR对象

在之前,我们使用了局部方法:.success()、.complete()和.error()。这三个局部方法并不是XMLHttpRequest对象调用的,而是$.ajax()之类的全局方法返回的对象调用的。 这个对象,就是jqXHR对象,它是原生对象XHR的一个超集。

获取jqXHR对象,查看属性和方法

$("form input[type=button]").click(function() {
//jqXHR就是$.ajax()返回的对象
var jqXHR = $.ajax({
    type:"post",
    url:"user.php",
    data:$("form").serialize()
  });
jqXHR.success(function(response) {
alert(response);
});
});

注意:如果使用jqXHR对象的话,那么建议用.done()、.always()和.fail()代替.success()、.complete()和.error(),因为在未来版本中,很可能将这三种方法废弃取消。

$("form input[type=button]").click(function() {
//jqXHR就是$.ajax()返回的对象
var jqXHR = $.ajax({
    type:"post",
    url:"user.php",
    data:$("form").serialize()
  });
jqXHR.done(function(response) {
alert(response);
});
});

使用jqXHR的连缀方式比$.ajax()的属性方式有三大好处:

1.可连缀操作,可读性大大提高

2.可以多次执行同一个回调函数

3.为多个操作指定回调函数

来看第1、2点:

$("form input[type=button]").click(function() {
//jqXHR就是$.ajax()返回的对象
var jqXHR = $.ajax({
    type:"post",
    url:"user.php",
    data:$("form").serialize()
  });
jqXHR.done(function(response) { //可连缀操作,多次执行同一个回调函数(done())
alert(response + "1");
}).done(function(response) {
alert(response + "2");
}); jqXHR.done(function(response) {
alert(response + "3");
});
});

再来看第3点:

有t1.php文件如下:

<?php
echo "test1.php";
?>

t2.php文件如下:

<?php
echo "test2.php";
?>
$("form input[type=button]").click(function() {
var jqXHR = $.ajax("t1.php");//ajax()也可直接传一个url
var jqXHR2 = $.ajax("t2.php");
//这是我们本能想到的
/*
jqXHR.done(function(response) {
alert(response);
}); jqXHR2.done(function(response) {
alert(response);
});
*/ //多个操作指定回调函数
$.when(jqXHR, jqXHR2).done(function(r1, r2) {
alert(r1[0]); //alert(r1)-->test1.pph,success,[object Object],object为r1的jqXHR对象
alert(r2[0]);
});
});

Ajax的进阶学习(二)的更多相关文章

  1. Ajax的进阶学习(一)

    在Ajax课程中,我们了解了最基本的异步处理方式.本章,我们将了解一下Ajax的一些全局请求事件.跨域处理和其他一些问题. 加载请求 在Ajax异步发送请求时,遇到网速较慢的情况,就会出现请求时间较长 ...

  2. zuul进阶学习(二)

    1. zuul进阶学习(二) 1.1. zuul对接apollo 1.1.1. Netflix Archaius 1.1.2. 定期拉 1.2. zuul生产管理实践 1.2.1. zuul网关参考部 ...

  3. SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  4. React Native 学习笔记--进阶(二)--动画

    React Native 进阶(二)–动画 动画 流畅.有意义的动画对于移动应用用户体验来说是非常必要的.我们可以联合使用两个互补的系统:用于全局的布局动画LayoutAnimation,和用于创建更 ...

  5. Matlab 进阶学习记录

    最近在看 Faster RCNN的Matlab code,发现很多matlab技巧,在此记录: 1. conf_proposal  =  proposal_config('image_means', ...

  6. emberjs学习二(ember-data和localstorage_adapter)

    emberjs学习二(ember-data和localstorage_adapter) 准备工作 首先我们加入ember-data和ember-localstorage-adapter两个依赖项,使用 ...

  7. Wireshark入门与进阶系列(二)

    摘自http://blog.csdn.net/howeverpf/article/details/40743705 Wireshark入门与进阶系列(二) “君子生非异也,善假于物也”---荀子 本文 ...

  8. SpringBoot进阶教程(二十九)整合Redis 发布订阅

    SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subscribers). Ra ...

  9. 状态保持以及AJAX的初步学习

    嘿嘿,今天学习的有点迷茫哦,主要学习把验证码使用在登录页面时间的一些逻辑,学习这个时间并没有那么的迷惑哦,可是自己写程序时间倒是有点反应迟钝,不过还好总是在最后搞清楚啦,另外就是一步一步的学习是接近项 ...

随机推荐

  1. 在.net程序中使用System.Net.Mail来发送邮件

    System.Net.Mail是微软自家提供的工具,在.net程序中可以使用该空间中的SmtpClient实例来实现邮件的发送. 使用System.Net.Mail空间与Web.config配置相配合 ...

  2. 你必须懂的 T4 模板:深入浅出

    示例代码:示例代码__你必须懂的T4模板:浅入深出.rar (一)什么是T4模板? T4,即4个T开头的英文字母组合:Text Template Transformation Toolkit. T4文 ...

  3. [转]基于AngularJS的前端架构(上)

    模块化 怎么分模块 AngularJS自己有模块的概念,但只是为controller.direcitive.service等提供一个集合的概念,并没有文件调度的功能. 官方推荐的模块分类方法是: an ...

  4. [原]项目进阶 之 集群环境搭建(二)MySQL集群

    上次的博文中我们介绍了一下集群的相关概念,今天的博文我们介绍一下MySQL集群的相关内容. 1.MySQL集群简介 MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单 ...

  5. layoutSubviews 浅尝

    layoutSubviews是UIView中的属性方法,即只要继承于UIView,就可以使用这个方法,这个方法也很强大,以下是他的触发时机: 1.init初始化不会触发layoutSubviews 2 ...

  6. 分布式架构--第一篇--项目拆分(maven命令生成多模块项目)

    预览生成的项目结构: ying-yue-parent // 顶级总编译控制模块 ying-yue-lib // jar模块 ying-yue-model // 模型对象模块 ying-yue-dao ...

  7. PHP错误The server encountered an internal error or misconfiguration and was unable to complete your re

    我的笔记本电脑上的环境安装了很多次,但是运行项目时总是会报The server encountered an internal error or misconfiguration and was un ...

  8. using详解(C#)

    using肯定所有人都用过,最简单的就是使用using引入命名空间,然后就是引入别名,简化输入,本文主要介绍第三种用法,即用using强制对象清理资源. 先看下面这段代码: try { using ( ...

  9. Careercup - Google面试题 - 5724823657381888

    2014-05-06 06:37 题目链接 原题: Given an array of (unsorted) integers, arrange them such that a < b > ...

  10. 【HDOJ】【3415】Max Sum of Max-K-sub-sequence

    DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...