`
zhouyrt
  • 浏览: 1172600 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

跨域请求之JSONP 三

阅读更多

script请求返回JSON实际上是脚本注入。它虽然解决了跨域问题,但它不是万能的。

1,不能接受HTTP状态码

2,不能使用POST提交(默认GET)

3,不能发送和接受HTTP头

4,不能设置同步调用(默认异步)

...

其最严重的就是不能提供错误处理,如果请求的代码正常执行那么会得到正确的结果。如果请求失败,如404,500之类,那么可能什么都不会发生。这篇在上一篇的基础上将着重解决JSONP的错误处理。


说可能是因为有些浏览器还是可以提供一些错误处理的。如IE9/10/Firefox/Safari/Chrome都支持script的 onerror事件,如果请求失败,在onerror上可以进行必要的回调处理。但IE6/7/8/Opera却不支持onerror。这就是令人头疼的 地方,打造一个完美的Sjax不太容易。

只要解决了IE6/7/8/Opera的onerror,整个就ok了。思路是逆向思维:请求成功则成功回调,否则就是失败回调。不拿onerror说事,因为它压根没onerror。因此只能那onload说事。就好比以下推论:

“你是对的” 推断出 “你没错”

因为我没办法知道你是“错的”。但我知道你是“对的”,只能拿是否对去推断你是否错了。


最后的实现细节如下:

1,IE9/Firefox/Safari/Chrome 成功回调使用onload事件,错误回调使用onerror事件

2,Opera 成功回调也使用onload事件(它压根不支持onreadystatechange),由于其不支持onerror,这里使用了延迟处理。即等待与成功 回调success,success后标志位done置为true。failure则不会执行,否则执行。这里延迟的时间取值很有技巧,之前取2秒,在公 司测试没问题。但回家用3G无线网络后发现即使所引用的js文件存在,但由于网速过慢,failure还是先执行了,后执行了success。所以这里取 5秒是比较合理的。虽然这种方式间接实现了failure,但不彻底。

3,IE6/7/8成功回调使用onreadystatechange事件,错误回调几乎是很难实现的。令人恶心的是即使请求的资源文件不存在 (404)。它的readyState也会经历“loaded”状态。这样你就没法区分请求成功或失败。最后使用前后台一起协调的机制解决最后的这个难 题。无论请求成功或失败都让其调用callback(true)。 此时已经将区别成功与失败的逻辑放到了callback中,如果后台没有返回 jsonp则调用failure,否则调用success。


接口:

Sjax.load(url, {
	data		// 请求参数 (键值对字符串或js对象)
	success		// 请求成功回调函数
	failure		// 请求失败回调函数
	scope		// 回调函数执行上下文
	timestamp	// 是否加时间戳
});

 

示例:

<!DOCTYPE HTML>
<html> 
<head> 
	<meta charset="utf-8"> 
	<title>sjax_0.3.js by snandy</title>
	<script src="http://files.cnblogs.com/snandy/sjax_0.3.js"></script>
</head> 
<body>
<input type="button" value="Get Name" onclick="clk()"/>
<script type="text/javascript">
	function clk(){
		Sjax.load('jsonp66.js', {
			success : function(){alert(jsonp.name)},
			failure : function(){alert('error');}
		});
	}
</script>
</body>
</html>

 

以上html,点击“Get Name”按钮,调用clk函数。因为请求的资源jsonp66.js压根不存在。各浏览器下都会弹出“error”,当然Opera中会延迟一些。好了,本系列结束。

 

相关:

http://stackoverflow.com/questions/3483919/script-onload-onerror-with-iefor-lazy-loading-problems

1
8
分享到:
评论
1 楼 iapple 2011-08-17  
好东西留着倍用

相关推荐

    jsonpajax跨域请求

    "jsonp跨域请求"可能是服务器返回的示例数据,模拟了JSONP的跨域请求过程。 总结,JSONP和CORS是解决JavaScript跨域问题的两种主要方法,它们各有优缺点,适用于不同的场景。JSONP简单易用,但安全性较低;CORS则更...

    ajax跨域请求jsonp前后台代码

    基于ajax方式的跨域请求jsonp的前后台代码

    html通过 ajax jsonp跨域请求接收和传送数据

    **AJAX和JSONP跨域请求的实现过程** 1. **AJAX跨域**: 通常,AJAX请求受到同源策略限制。为实现跨域,我们可以使用CORS(Cross-Origin Resource Sharing)机制。服务器需要在响应头中添加`Access-Control-Allow-...

    ajax跨域CORS方案 JSONP跨域请求方案.zip

    JSONP是早期解决跨域问题的手段,适用于只支持GET请求的情况。它的原理是利用HTML的`&lt;script&gt;`标签不受同源策略限制的特性,通过动态创建`&lt;script&gt;`标签来加载服务器返回的JavaScript代码,这个代码通常是一个函数...

    Ajax跨域请求解决方案-JSONP

    然而,Ajax技术在实现动态网页交互时常常需要跨越这个限制,这时就引入了JSONP(JSON with Padding)作为跨域请求的一种解决方案。本文将详细介绍JSONP的工作原理以及如何在ASP.NET网站开发中应用JSONP解决Ajax跨域...

    使用JSONP完成HTTP和HTTPS之间的跨域访问

    这一步对于简单的跨域请求不是必需的。 2. **配置Tomcat以支持HTTPS**: - 在Tomcat的`conf/server.xml`文件中,找到或添加`&lt;Connector&gt;`标签以启用HTTPS连接: ```xml maxThreads="150" scheme=...

    ajax 跨域请求问题 jquery jsonp

    **Ajax跨域请求问题与jQuery JSONP解析** 在Web开发中,Ajax技术被广泛用于实现页面的异步更新,但浏览器的同源策略(Same-Origin Policy)限制了Ajax请求只能向同源(协议、域名、端口均相同)的服务器发送。这在...

    跨域访问解决方法-jsonp

    由于浏览器允许不同源的`&lt;script&gt;`标签加载和执行,开发者可以利用这一点来实现跨域请求。 ### JSONP工作原理 1. **客户端(浏览器)**:在JavaScript中,我们创建一个`&lt;script&gt;`元素,并设置其`src`属性为服务器...

    PHP AJAX JSONP实现跨域请求使用范例_ajax如何解决跨域请求

    JSONP(JSON with Padding)是一种解决跨域请求的方法,即在客户端通过 script 标签请求服务器端的数据,然后服务器端将数据以 JSON 格式返回,并在返回数据中包含一个回调函数,以便客户端可以将数据处理。...

    跨域请求资源-jsonp和cors区别.pdf

    ### 跨域请求资源——JSONP与CORS的区别 #### 一、跨域的基本概念 在Web开发中,“跨域”是指从一个域名发起请求到另一个域名。这主要是因为浏览器出于安全考虑实施了**同源策略**(Same-Origin Policy)。同源...

    跨域解决之JSONP和CORS的详细介绍

    JSONP跨域和CORS跨域 什么是跨域? 跨域:指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器的安全限制! 同源策略 同源策略:域名、协议、端口均相同。 浏览器执行JavaScript脚本时,会...

    JSONP解决跨域问题

    JSONP(JSON with Padding)是一种跨域数据交互协议,它利用了`&lt;script&gt;`标签可以跨域请求资源的特性,为了解决JavaScript在浏览器端由于同源策略限制无法直接访问不同源的HTTP请求的问题。在本场景中,前端使用...

    SignalR 跨域实例(Cross和Jsonp两种方式)

    SignalR 分:PersistentConnection和Hub 2种模式。跨域又分:UseCors和JsonP 2种方法 所以例子写了4种。介绍:http://www.cnblogs.com/shikyoh/p/6272679.html

    AJAX跨域请求之JSONP获取JSON数据

    JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。

    ajax跨域请求WebService.asmx

    【Ajax跨域请求WebService.asmx】是一个常见的Web开发技术应用场景,主要涉及到JavaScript的Ajax技术、C#编程语言以及ASP.NET的WebService组件。Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个页面的...

    利用JQuery jsonp实现Ajax跨域请求json数据

    本篇文章将详细讲解如何利用jQuery的jsonp方法实现Ajax跨域请求,以及如何在服务器端使用.Net的*.handler和WebService来返回JSON数据。 首先,理解JSONP的基本原理。JSONP是一种非官方的协议,通过动态创建`...

    Ajax + Servlet 跨域访问(Jsonp技术)

    在这种背景下,Jsonp(JSON with Padding)应运而生,它是一种允许跨域数据交互的技术,特别适用于Ajax请求。 Jsonp的核心思想是利用HTML `&lt;script&gt;`标签的src属性可以不受同源策略限制的特性。它的工作流程如下: ...

    借助script进行Http跨域请求:JSONP实现原理及代码

    JSONP(JSON with Padding)是一种解决跨域请求的方法,它利用了script标签不受同源策略限制的特性,使得客户端可以请求跨域的JSON数据。同源策略是浏览器的一个安全机制,它阻止了网页的脚本向非同源服务器发送请求...

    学习总结:前端跨域请求的解决办法——JSONP

    综上所述,JSONP是前端跨域请求的一种常见手段,尤其适用于简单的数据获取场景。然而,随着CORS的普及,JSONP在复杂场景下的使用逐渐减少。在实际开发中,根据项目的具体需求选择合适的跨域策略是非常重要的。

Global site tag (gtag.js) - Google Analytics