轻松搞定jQuery+JSONP跨域请求的解决方案

 更新时间:2018年03月06日 08:52:28   作者:蚂蹄儿  
了解了jsonp之后,大家应该也都明白了,jsonp主要就是用来实现跨域的获取数据,今天我们就来详细探讨下如何在实际中应用jsonp实现跨域

  JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

  上面一段话来自百度百科,概念永远是那么抽象难懂,看例子才是最直观的表现。例子看的多了,领悟到那个点了,自然自己也会学着抽象的描述了。这就是为什么常说“学习知识是从薄到厚,又由厚到薄的过程”。好了扯远了。下面直接来看一个例子。

 

  问题:本地现有一个页面demo.html需要从http://localhost:3561/User/GetAllNames获取数据并展示。

  解答:由于问题中的两方不在同一服务器,故需要使用jsonp来跨域访问。

  ① 客户端编写

  客户端使用jQuery中提供的$.getJson方法来跨域访问。getJson有3个参数:

    I.   url:请求地址;

    II.  data:发送到服务端的参数;

    III. callback:成功时的回调函数。

  getJson的使用方法和普通的$.get方法基本一致,不同的地方在于getJson需要在url后面的参数部分加上callback=?这一固定部分,jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。然后在回调函数中操作从异域返回的json对象,回调函数callback的参数即为该json对象。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <title></title>
</head>
<body>
  <ul id="nameList"></ul>

  <script src="http://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
  <script type="text/javascript">
    $.getJSON("http://localhost:3561/User/GetAllNames?callback=?", function(json) {
      for (var i = 0; i < json.length; i++) {
        $("#nameList").append("<li>" + json[i] + "</li>");
      }
    });
  </script>
</body>
</html>
  ② 服务端编写

  服务端的逻辑主要是将数据序列化为json字符串,然后封装成"callback(json)"的形式,callback为jQuery自动生成并传到服务端的函数名称。下面使用C#实现:

public class UserController : Controller
{
    public string GetAllNames(string callback)
  {
    string[] names = new string[] { "张三丰", "张无忌", "令狐冲", "杨过", "郭靖" };
    JavaScriptSerializer jss = new JavaScriptSerializer();
    string json = jss.Serialize(names);
    return string.Format("{0}({1})", callback, json);
  }
}
  至此,便成功解决了问题。

 思考:如果服务端已经写死了callback(如:return string.Format("moty({0})", json);),那么客户端该怎么写呢?

 参考:

$.ajax("http://localhost:3561/User/GetAllNames", {
  jsonpCallback: "moty",
  dataType: "jsonp",
  success: function(json) {
    for (var i = 0; i < json.length; i++) {
      $("#nameList").append("<li>" + json[i] + "</li>");
    }
  }
});

相关文章

  • jQuery 三击事件实现代码

    jQuery 三击事件实现代码

    jQuery 中自带有双击事件,那么当需要三击某对象执行某个事件时怎么办呢?今天就让我们看看一段 jQuery 三击事件代码
    2013-09-09
  • jQuery轮播图实例详解

    jQuery轮播图实例详解

    这篇文章主要为大家详细介绍了jQuery轮播图的实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • AJAX在JQuery中的应用详解

    AJAX在JQuery中的应用详解

    今天小编就为大家分享一篇关于AJAX在JQuery中的应用详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • jQuery源码分析之sizzle选择器详解

    jQuery源码分析之sizzle选择器详解

    jquery从1.3开始,使用了新的选择器–sizzle。效率超过了以前的jquery版本的其他选择器。下面这篇文章主要介绍了jQuery源中sizzle选择器的相关资料,文中介绍的很详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • jQuery 滑动方法slideDown向下滑动元素

    jQuery 滑动方法slideDown向下滑动元素

    通过 jQuery,您可以在元素上创建滑动效果,jQuery slideDown() 方法用于向下滑动元素,下为大家介绍下其参数含义
    2014-01-01
  • Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文是对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • 基于jquery.Jcrop的头像编辑器

    基于jquery.Jcrop的头像编辑器

    在网上找到了jquery.Jcrop,基本满足了我的需求,但它只是简单的切割而已,还有缩略图没有生成.或许有很多人都需要这类东西吧,于是我把它封装起来了,方便其它朋友直接使用.
    2010-03-03
  • 做好七件事帮你提升jQuery的性能

    做好七件事帮你提升jQuery的性能

    这篇文章主要介绍了做好七件事帮你提升jQuery的性能的相关资料,需要的朋友可以参考下
    2014-02-02
  • jquery validate和jquery form 插件组合实现验证表单后AJAX提交

    jquery validate和jquery form 插件组合实现验证表单后AJAX提交

    在ajax流行的时代,好像很少能看见传统的同步提交表单方式了,是啊我们当然要用更加给力的AJAX来实现异步无刷新提交表单,好了开始今天的jQuery之旅吧,今天我们来利用jquery.validate和jquery.form 插件组合实现验证表单后AJAX提交 ,需要的朋友可以参考下
    2015-08-08
  • 如何用jquery控制表格奇偶行及活动行颜色

    如何用jquery控制表格奇偶行及活动行颜色

    这篇文章主要介绍了如何用jquery控制表格奇偶行及活动行颜色,需要的朋友可以参考下
    2014-04-04

最新评论