Ajax在前台的开发中使用越来越多,为前台用户体验带来了很大的提升。但是由于XMLHttpRequest的安全限制,普通的Ajax请求不能实现跨域访问,这主要是由于浏览器的浏览器的同源策略限制导致的。可是在有些场景下,我们非常希望通过Ajax的方式获取远程的数据,这样就不需要再通过后台进行数据的获取,会极大的减小开发量。
实现前台跨域访问,我们可以通过frame或者script标签的src来实现,这种方式可以进行远程数据的获取,但是这两种方式需要我们自己去监听不同的事件,处理起来比较复杂,程序员的好习惯就是lazy了,我们会寻找更加简单的解决方案。一种解决方案就是本文将要介绍的JSONP。
JSONP和JSON
JSONP维基百科的解释:
JSONP(JSON with Padding)是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料。另一个解决这个问题的新方法是跨来源资源共享。
由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com 的服务器沟通,而HTML 的 <script>
元素是一个例外。利用 <script>
元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的 JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
JSONP是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问。在知道JSONP是什么之后,我们要来看下怎么用JSONP。其实很多优秀的js库都已经实现了JSONP,而且很好的屏蔽了其技术细节,使用是就和普通的Ajax调用没有区别。我们来看下JQuery的实现方式和使用方式。
简单原理:
客户端:
<script type="text/javascript">
function test(data) {
alert(data);
}
</script>
<script type="text/javascript" src="http://******.aspx?callback=test"></script>
服务端:
var fun = Request["callback"];
Response.Write(fun+"(\"你好世界\")");
JQuery的JSONP使用
先看一个简单的例子
<script>
$(
function(){
$.getJSON(
"http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?",
function(data){
$.each(data.items,function(i,item){
$("<span></span>").text(i + ' '+ item.title).appendTo("#images");
$("#images").append("<br>");
});
}
);
}
);
</script>
上面这段代码和使用普通的Ajax调用没有太多的区别,唯一的区别就是请求的url是一个远程地址,而且在url里添加了一个jsoncallback=?这样一个参数,这个就是JSONP的关键所在了。JQuery会自动根据一个正则表达式去判断有没有XXX=?的这样一个参数,然后会在请求发出前自动把?替换成一个随机生成的函数名称(如果没有在ajaxSetting里设置的话),例如我们现在随机生成的函数名称为jQuery1010_100的函数名称,这是我们看下后台返回的格式:
jQuery1010_100l({
"title": "Recent Uploads tagged cat",
"link": "http://www.flickr.com/photos/tags/cat/",
"description": "",
"modified": "2012-10-15T15:20:44Z",
"generator": "http://www.flickr.com/",
"items": [
{
"title": "_MG_5430",
"link": "http://www.flickr.com/photos/25642376@N07/8090499253/",
"media": {"m":"http://farm9.staticflickr.com/8046/8090499253_e12dc0c2b1_m.jpg"},
"date_taken": "2012-10-12T19:59:37-08:00",
"description": " <p><a href=\"http://www.flickr.com/people/25642376@N07/\">dmzkrsk<\/a> posted a photo:<\/p> <p><a href=\"http://www.flickr.com/photos/25642376@N07/8090499253/\" title=\"_MG_5430\"><img src=\"http://farm9.staticflickr.com/8046/8090499253_e12dc0c2b1_m.jpg\" width=\"240\" height=\"160\" alt=\"_MG_5430\" /><\/a><\/p> ",
"published": "2012-10-15T15:20:44Z",
"author": "nobody@flickr.com (dmzkrsk)",
"author_id": "25642376@N07",
"tags": "cat jupiter9 кузя"
},
{
"title": "_MG_5432",
"link": "http://www.flickr.com/photos/25642376@N07/8090507680/",
"media": {"m":"http://farm9.staticflickr.com/8468/8090507680_162cc352f6_m.jpg"},
"date_taken": "2012-10-12T20:00:59-08:00",
"description": " <p><a href=\"http://www.flickr.com/people/25642376@N07/\">dmzkrsk<\/a> posted a photo:<\/p> <p><a href=\"http://www.flickr.com/photos/25642376@N07/8090507680/\" title=\"_MG_5432\"><img src=\"http://farm9.staticflickr.com/8468/8090507680_162cc352f6_m.jpg\" width=\"240\" height=\"160\" alt=\"_MG_5432\" /><\/a><\/p> ",
"published": "2012-10-15T15:21:56Z",
"author": "nobody@flickr.com (dmzkrsk)",
"author_id": "25642376@N07",
"tags": "dog cat catdog jupiter9 кузя чаппа"
}]});
从返回值可以看到,后台应该返回一个合法的js函数调用,而函数名称就是JQuery自动生成的那个。那么这个函数时在哪儿生成的呢,和我们在getJSON里定义的callback是什么关系呢,JQuery实现的魔法在哪儿呢?
在jquery的源码里,我们看到这样一段
// Install callback
window[ jsonpCallback ] = function( response ) {
responseContainer = [ response ];
};
// Clean-up function
jqXHR.always(function() {
// Set callback back to previous value
window[ jsonpCallback ] = previous;
// Call if it was a function and we have a response
if ( responseContainer && jQuery.isFunction( previous ) ) {
window[ jsonpCallback ]( responseContainer[ 0 ] );
}
});
最终效果
0 Pink_aRT__UFONET_2012
1 yoga!
2 I love this pic
3 P1020870
4 P1020871
5 Monday morning
6 Sexy_Kızıl_77___UFONET_2012
7 hide and seek
8
9 Dexter
10 Nightlife
11
12 Dior & Daeron
13 Dior & Daeron
14 Dior & Daeron
15 Black cats for Halloween
16 Dior & Daeron
17 Dior & Daeron
18 kitten 2
分享到:
相关推荐
- **JSON**可以直接被JavaScript解析,而**JSONP**实际上是一个JavaScript函数调用。 - **JSON**主要用于同域内的数据交互,而**JSONP**专门用于跨域场景。 - **JSON**的响应是纯数据,而**JSONP**的响应是可执行的...
**AJAX和JSONP跨域请求的实现过程** 1. **AJAX跨域**: 通常,AJAX请求受到同源策略限制。为实现跨域,我们可以使用CORS(Cross-Origin Resource Sharing)机制。服务器需要在响应头中添加`Access-Control-Allow-...
### JSONP实现Ajax跨域访问 #### 一、引言 JSONP(JSON with Padding)是一种用于解决跨域数据访问的技术。由于同源策略(Same-Origin Policy)的存在,JavaScript/Ajax只能请求同源的资源,这给需要跨域访问数据...
本示例"Jquery跨域Ajax请求测试"将详细讲解如何利用jQuery实现这一功能。 首先,了解同源策略是理解跨域问题的关键。同源策略是浏览器为了保障用户安全而设定的一项机制,它规定了只有来自同一协议、同一域名和同一...
"jsonp跨域请求"可能是服务器返回的示例数据,模拟了JSONP的跨域请求过程。 总结,JSONP和CORS是解决JavaScript跨域问题的两种主要方法,它们各有优缺点,适用于不同的场景。JSONP简单易用,但安全性较低;CORS则更...
JsonP 的核心原理是:JavaScript 使用 Ajax 无法跨域调用数据(如 XML、JSON 等),但是可以跨域调用 JavaScript 数据。JsonP 的工作原理是通过动态添加一个 script 标签,src 属性指向请求的 URL,返回的数据是一个...
在JavaScript的世界里,由于同源策略的限制,浏览器禁止了不同源之间进行AJAX通信,但JSONP(JSON with Padding)作为一种巧妙的方式,允许我们绕过这个限制,实现在jQuery中进行跨域请求。本篇文章将深入探讨JSONP...
JSONP(JSON with Padding)是一种跨域数据交互协议,它利用了`<script>`标签可以跨域请求资源的特性来实现数据的交换。在Web开发中,由于浏览器的同源策略限制,JavaScript通常无法直接访问不同源的资源,但JSONP...
总结来说,JSONP是一种解决跨域问题的技术,通过将数据封装在JavaScript函数调用中,使得前端能够跨越同源策略的限制获取到服务端的数据。在C# Web Service中实现JSONP,需要创建支持回调的Web方法并设置适当的响应...
Ajax JSONP跨域处理是Web开发中的重要技术,通过JSONP,开发者可以在不违反同源策略的前提下实现跨域数据交互。虽然JSONP存在一些限制和安全隐患,但在许多场景下,它仍然是一个实用且有效的解决方案。随着技术的...
接下来,我们来看如何编写一个简单的原生JavaScript AJAX库,支持JSONP跨域。以下是一个基本的实现框架: ```javascript function Ajax(options) { var script = document.createElement('script'); var ...
1.3.3 jQuery-JSONP跨域 jQuery提供了JSONP的支持,通过$.ajax方法的dataType参数设置为"jsonp",可以轻松发起JSONP请求。jQuery会自动生成一个唯一的回调函数名,并将其作为参数传递给服务器,服务器返回的数据应以...
jQuery跨域调用主要是通过JSONP(JSON with Padding)和CORS(Cross-Origin Resource Sharing)这两种机制来实现的。JSONP是一种非官方的跨域数据交互协议,而CORS是W3C标准,允许服务器声明哪些来源可以访问其资源...
JSONP(JSON with Padding)是一种跨域数据交互协议,它利用了HTML的`<script>`标签可以跨域请求资源的特点,来实现JavaScript从一个域获取另一个域的数据。在Web开发中,由于同源策略的限制,JavaScript通常不能...
使用jQuery提供的接口,开发者可以很容易地实现JSONP跨域请求,具体方法包括$.ajax()、$.getJSON()和$.getScript()等。在实际使用过程中,需要注意回调函数名的正确传递和处理,以及确保服务器端正确响应JSONP请求。...
标题中的“jsonp解决跨域”指的是JavaScript对象标记协议(JSON with Padding,简称jsonp)这一跨域数据交互协议,它是Web应用程序中广泛使用的一种解决同源策略限制的技术。同源策略是浏览器为了安全而实施的一项...
跨域访问是Web开发中一个常见的挑战,尤其是在进行Ajax异步请求时,浏览器的同源策略(Same-origin policy)会限制JavaScript从一个源获取另一个源的数据。为了解决这个问题,开发者通常采用JSONP(JSON with ...
ajax jsonp跨域传参,里面有源码,不过写在txt中了,很适合调用别人的接口
标题提到的"利用jsonp跨域调用百度js实现搜索框智能提示",即利用JSONP技术调用百度提供的API,实现在搜索框中输入关键字时,显示智能提示的功能,类似于百度搜索引擎的自动补全。 **JSONP原理**: JSONP的工作机制...
它可以支持多种协议,包括HTTP,使服务可以被AJAX调用。在WCF中实现跨域调用,我们需要配置服务以允许来自不同源的请求。 以下是实现AJAX跨域调用WCF服务的具体步骤和相关知识点: 1. **开启WCF服务的跨域支持**:...