如果获取的数据文件存放在远程服务器上(域名不同,也就是跨域获取数据),则需要使用jsonp类型。

使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面。

服务器端应当在JSON数据前加上回调函数名,以便完成一个有效的JSONP请求。

如果要指定回调函数的参数名来取代默认的callback,可以通过设置$.ajax()的jsonp参数。

注意,JSONP是JSON格式的扩展。他要求一些服务器端的代码来检测并处理查询字符串参数。

如果指定了script或者jsonp类型,那么当从服务器接收到数据时,实际上是用了<script>标签而不是XMLHttpRequest对象。

这种情况下,$.ajax()不再返回一个XMLHttpRequest对象,并且也不会传递事件处理函数,比如beforeSend。

在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。

JSONP的实现思路

  1. 前端创建script标记,设置src,添加到head中(你可以往body中添加)
  2. 后台返回一个js变量jsonp,这个jsonp就是请求后的JSON数据
  3. 回调完成后删除script标记(还有一些清理工作如避免部分浏览器内存泄露等)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title></title>
<script src="js/jquery.min.js"></script>
<script>
function SaveData() {
var UserName = "星辰雾海";
$.ajax({
type: "post",
url: "http://116.228.89.136:8032/test.aspx",
dataType: "jsonp",
//这两句指定回调函数为:CallBackUser
jsonp: 'callback',
jsonpCallback: 'CallBackUser',
data: { UserName: UserName },
success: function (data) {
//jsonp请求,不会执行此函数,只执行CallBackUser
alert(data.UserName);
}
});
}
function CallBackUser(jsonData) {
alert(jsonData.UserName);
}
</script>
</head>
<body>
<input type="button" id="btnAdd" value="Test" onclick="SaveData()" />
</body>
</html>

请求Url:

http://116.228.89.136:8032/test.aspx?callback=CallBackUser&UserName=%E6%98%9F%E8%BE%B0%E9%9B%BE%E6%B5%B7&_=1457492166376

这个地址是自动拼接而成,注意中间拼接的 jsonp 参数的值,是你本地页面中的函数名称,在data属性中设置。

服务端代码:

protected void Page_Load(object sender, EventArgs e)
{
//http://116.228.89.136:8032/test.aspx?callback=jQuery11130304913979023695_1457491748431&jsonp=CallBackUser&UserName=%E6%98%9F%E8%BE%B0%E9%9B%BE%E6%B5%B7&_=1457491748433
string json = "{UserName:\"My nam is "+Request["UserName"]+"!\"}"; string callback = Request["callback"];
Response.Write(callback + "(" + json + ")");
Response.End();
}

输出脚本,自动执行。

附:跨域请求的方式有很多种,

  1. iframe
  2. document.domain
  3. window.name
  4. script
  5. XDomainRequest (IE8+)
  6. XMLHTTPRequest (Firefox3.5+)
  7. postMessage (HTML5)
  8. 后台代理
  9. ServiceStack
  10. 等等...

参考:http://www.cnblogs.com/know/archive/2011/10/09/2204005.html

使用jsonp跨域发送请求的更多相关文章

  1. php跨域发送请求原理以及同步异步问题

    <script async type="text/javascript" src="http://lisi.com/data.php?flag=1"> ...

  2. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  3. jsonp 跨域请求

    背景: JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源 ...

  4. jsonp 跨域原理详解

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...

  5. JSONP跨域的原理解析

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same- Origin Policy”(同源策略).这一策略对于Jav ...

  6. 【转】JSONP跨域的原理解析

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为“Same-Origin Policy”(同源策略).这一策略对于Java ...

  7. JSONP跨域的原理解析(转)

    JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制,被称为"Same-Origin Policy"(同源策略). ...

  8. JSONP跨域的原理

    一种脚本注入行为 在 2011年10月27日 那天写的     已经有 12671 次阅读了 感谢 参考或原文   服务器君一共花费了23.005 ms进行了2次数据库查询,努力地为您提供了这个页面. ...

  9. JSONP跨域的原理解析及其实现介绍

    JSONP跨域的原理解析及其实现介绍 作者: 字体:[增加 减小] 类型:转载 时间:2014-03-22 JSONP跨域GET请求是一个常用的解决方案,下面我们来看一下JSONP跨域是如何实现的,并 ...

随机推荐

  1. 第1课 学习 C++ 的意义

    1.  回顾历史 (1)UNIX操作系统诞生之初是直接用汇编语言写成的.随着UNIX的发展,汇编语言的开发效率成为一个瓶劲. (2)1971年,Ken Thompson和Denis Ritchie对B ...

  2. 微软&中科大提出新型自动神经架构设计方法NAO

    近期,来自微软和中国科学技术大学的刘铁岩等人发表论文,介绍了一种新型自动神经架构设计方法 NAO,该方法由三个部分组成:编码器.预测器和解码器.实验证明,该方法所发现的架构在 CIFAR-10 上的图 ...

  3. 原生socket请求url获取状态码、消息报头、响应正文

    需求: (1)使用socket及ssl模块写通用的web客户端 (2)向服务器发起请求 (3)接受响应内容并解析出状态码.消息报头.响应正文 (4)最核心的函数: 输入一个url,返回状态码.消息报头 ...

  4. etcd查看key-value

    get/set key-value etcdctl get/set /key-path etcdctl watch --recursive /test/sm/default/apps 查看所有key- ...

  5. thinkphp5隐藏apache下的index.php

    在应用入口文件同级目录添加.htaccess文件,内容如下: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews Re ...

  6. scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class

    转自:https://blog.csdn.net/lzj0470/article/details/17786587 quartz版本号:2.1.7 错误: Caused by: <a href= ...

  7. HTML5拖动

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. 使用MATPLOTLIB 制图(小图)

    import numpy as np import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv('D:\\myfil ...

  9. Delphi XE6打电话

    procedure TPhoneDialerForm.btnMakeCallClick(Sender: TObject); var PhoneDialerService: IFMXPhoneDiale ...

  10. js倒计时发送验证码按钮

    var wait=60; function time(o) { if (wait == 0) { o.removeAttribute("disabled"); o.value=&q ...