JSONP是个啥?

1 篇文章 0 订阅
1 篇文章 0 订阅

JSONP

一、JSONP的诞生

  • 首先,因为ajax无法跨域(浏览器的同源策略), 然后开发者就有所思考
  • 其次,开发者发现,

二、举栗子

栗子一

跨域服务器文件: remote.js

alert('来自远方的我');

本地某文件: index.html

...
<script type="text/javascript" src="跨域服务器/remote.js"></script>
...

结论

这边做的就是直接引入一个js,页面将会弹出一个提示窗体,显示 来自远方的我。

栗子二

跨域服务器文件: remote.js

localHandler({"result":"来自远方的我"});

本地某文件: index.html

...
<script type="text/javascript"> 
    var localHandler = function(data){
        alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result); 
    }; 
</script> 
<script type="text/javascript" src="跨域服务器/remote.js"></script>
...

结论

这边做的是
1、本地定义一个函数
2、引入一个js
3、被引入的js里面,调用这个函数
页面将会弹出一个提示窗体。显示本地函数被跨域的远程js调用成功,并且还接收到了 来自远方的我。

栗子三

跨域服务端提供的js脚本动态生成,这样调用者可以传一个参数过去告诉跨域服务端“我想要一段调用XXX函数的js代码,请你返回给我”,于是跨域服务器就可以按照客户端的需求来生成js脚本并响应了.

跨域服务器文件: flightResult.php

flightHandler({
    "code":"CA1998",
    "price": 1780,
    "tickets": 5
});

本地某文件: index.html

...
<script type="text/javascript"> 
    // 得到航班信息查询结果后的回调函数 
    var flightHandler = function(data){
        alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
    }; 
    // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码) 
    var url = "跨域服务器/flightResult.php?code=CA1998&callback=flightHandler";
    // 创建script标签,设置其属性 
    var script = document.createElement('script'); 
    script.setAttribute('src', url); 
    // 把script标签加入head,此时调用开始 
    document.getElementsByTagName('head')[0].appendChild(script); 
</script>
...

结论

这次我们做的是
1、动态创建脚本
2、url中传递了一个code参数,服务器去做查询CA1998次航班的信息,callback参数告诉服务器,我的本地回调函数叫做flightHandler
3、跨域服务端调用这个函数flightHandler 页面将会弹出一个提示窗体。把票价、余票以及张数给传递回来了。

三、与AJAX的区别是什么?

  • ajax和jsonp本质上是不同的东西。
  • ajax的核心是通过XmlHttpRequest获取非本页内容
  • jsonp的核心则是动态添加

四、jsonp的封装

https://github.com/webmodules/jsonp

CH2.Ajax 框架 支持简单加密(Base64/DES)和跨域(Jsonp) 如何以最快捷的方式直接调用服务器方法? 场景: 比如,服务器已有如下方法: namespace CH2 { class BLL{ User Login(string name,string password){ //balabala... } } } 如何写最少的 js 调用以上方法?也许你只需要写五行 js 代码: CH2.BLL.Login( {name: "caihaihua", password: "123456"} ,function(user){ alert('登录成功!'); } ,function(errormessage){ alert('登录失败!' + errormessage);} ); 步骤: 1.网站引用两个dll:CH2.Ajax.dll 和 Newtonsoft.Json.dll 2.把服务器方法添加属性 AjaxMethod。(例一) 3.添加一个一般处理程序,继承于 AjaxHandler<T> (T 为服务器方法的类名) 。(例二) 4.页面中引用两个js。(例三) 5.准备工作完成了。ajax 调用服务器方法,只需要在 js 中直接写: [namespace].[classname].[methodname](arguments,onsuccess,onfailed) 其中, arguments 为参数集合 onsuccess 为调用成功的回调函数 function(returndata) onfailed 为调用失败的回调函数(可选) function(errormessage) (例四) 例一: namespace CH2 { class BLL{ [AjaxMethod] // ←原有方法中添加这一属性 User Login(string name,string password){ } } } 例二: <%@ WebHandler Language="C#" Class="Handler" %> using CH2; public class Handler : AjaxHandler<BLL> // ←一般处理程序继承于AjaxHandler<BLL> { //此处不需要任何代码 } 例三: <script type="text/javascript" src="Ajax/Ajax.js"></script> // 配套的 js <script type="text/javascript" src="Ajax/Handler.ashx"></script> // 第 3 步中的一般处理程序(注意 url 中不带任何传参) 例四: <script type="text/javascript"> btn.onclick = function(){ // 你这样直接调用服务器方法: // CH2.BLL.Login(arguments,onsuccess,onfailed) CH2.BLL.Login( { //服务器方法需要的参数。key 为参数名,value 为对应的 json 对象 name: "caihaihua" ,password: "123456" } , function(data){ //onsuccess 方法。data 为服务器方法返回的结果(User) } , function(errmsg){ //onfailed 方法。 }); } </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值