如何跨域获取json数据源?我们都知道要有callback,具体callback是如何工作的呢?如果服务器端不接收callback,我们是不是就没有办法处理了呢?读完本文后相信你会有一个大体的了解。

我们先来看一个例子:http://www.darlingbank.com/cutpage/index.php/promote/edit/getfun/json/

如果查看源码,你会发现,根本看不到页面里面的图片和文字。这是你会想应该是ajax异步获取的数据,但是打开FF,查看

你会发现也没有请求,这是怎么回事呢?

再细心的攻城狮们会发现,页面底部多了三个js:

这是在查看源码时没发现的。但是,在页面源码里面,你能看到

<ul class="cf" dataurl="http://www.paipai.com/sinclude/xml/tjw/tjw2014/tjw4/tjw179255804475.js" commlen="4" commsta="1" commtpl='<li><a href="{#recmdReason#}" target="_blank">{#recmdRegName#}</a></li>'>

类似这样的html标签。随便打开其中的一个js文件,你能发现,它其实就是一个规则的、静态的json格式的文件,也不能接收callback,这是如何做到的呢?

【注】如果是能接收calllback的,一般是动态语言,如php,$_get['callback']之类,然后生成的json对象名就为callback之后的参数值。

相信我们理解了jsonp的原理,就很容易做到了:

简单理解jsonp:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。

Jsonp整个执行过程是这样的:

首先在客户端注册一个callback (如:'callback'), 然后把callback的名字(如:tjw179464084474)传给服务器。注意:服务端得到callback的数值后,要用tjw179464084474({......})把将要输出的json内容包括起来,此时,服务器生成 json 数据才能被客户端正确接收。然后以 javascript 语法的方式,生成一个function, function 名字就是传递上来的参数 'callback'的值tjw179464084474。最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时javascript文档数据,作为参数, 传入到了客户端预先定义好的 callback 函数,如该例子的function tjw179464084474(){}。

再回到我们的例子:毋庸置疑,那三个请求的js是通过下面的代码解析出来的:

  var J_data = {
debug : true,
log : function(s){
this.debug && (window.console ? console.log(s) : alert(s));
},
create_script : function(src){
var Scrip=document.createElement('script');
Scrip.charset="gbk";
Scrip.src=src;
document.body.appendChild(Scrip);
},
get : function(){
var thats=this;
$("[dataurl]").each(function () {
var that=this;
dataurl=$(this).attr("dataurl"),
tpl_tmp=$(this).attr("commtpl");
if(typeof tpl_tmp==='undefined' || tpl_tmp===''){
thats.log('请填写模板');
}else{
var c_str=dataurl.slice(dataurl.lastIndexOf('/')+1).split('.')[0]; window[c_str]=function(j){
var d=j.data.adList,html='',
len=parseInt($(that).attr("commlen")) || d.length,
start=parseInt($(that).attr("commsta")) || 0,
tpl=$(that).attr("commtpl");
if(start>0 && len<d.length){
len +=start;
}
for(var i=start;i<len;i++){
html += tpl.replace(/{#recmdReason#}/g,d[i].recmdReason).replace(/{#recmdRegName#}/g,d[i].recmdRegName).replace(/{#image#}/g,d[i].image).replace(/{#adSentence#}/g,d[i].adSentence);
}
$(that).html(html);
}
// $.getScript(dataurl+"?callback="+c_str); //亦可以用jquery方法
thats.create_script(dataurl+"?callback="+c_str);
}
});
}
}
$(function(){
J_data.get();
})

我们看得出来,这里服务器端js文件是没办法接收callback参数的,但是我们发现另外一个特点:每个json对象名都是跟js文件名有关的。如果理解了上述jsonp原理,我们知道之所以要有callback,是为了返回生成对象的对象名是什么,以至于知道返回到客户端的方法名,这是就可以注册全局的方法,所以我们能看到这段代码:

window[c_str]=function(j){

就已经获取到callback的方法名了。接下来的事就顺理成章了,只是解析json对象里面的值,拼成html插入dom,大功告成!

跨域获取json一些理解[腾讯电商数据的拉取方式]的更多相关文章

  1. 跨域获取json数据

    原文地址:http://my.oschina.net/LinBandit/blog/34570   前阵子做了一个前端动态加载json数据的应用,其中使用xmlhttprequest动态加载js,但是 ...

  2. 使用JSONP,jQuery的ajax跨域获取json数据

    网上找了很多资料,写的不错,推荐下: 1.深入浅出JSONP--解决ajax跨域问题 (http://www.cnblogs.com/chopper/archive/2012/03/24/240394 ...

  3. [ 转 ]jquery的ajax和getJson跨域获取json数据

    目前浏览器端跨域访问常用的两种方法有两种: 1.通过jQuery的ajax进行跨域,这其实是采用的jsonp的方式来实现的. jsonp是英文json with padding的缩写.它允许在服务器端 ...

  4. jquery的ajax和getJson跨域获取json数据

    目前浏览器端跨域访问常用的两种方法有两种: 1.通过jQuery的ajax进行跨域,这其实是采用的jsonp的方式来实现的. jsonp是英文json with padding的缩写.它允许在服务器端 ...

  5. ASP.NET 跨域获取JSON天气数据

    前几天做一个门户网站,在首页需要加载气象数据,采用了中央气象局的接口. 刚开始采用JSONP在前台跨域请求数据,没成功~ 后换成在c#后台请求数据返回... 前端代码: $(function () { ...

  6. javascript跨域获取json数据

    项目在开发过程中,用到了天气预报的功能,所以需要调用天气预报的api,一开始以为直接用ajax调用url就可以获取天气数据,结果涉及到了跨域的问题,这里做一个记录. 说到跨域,就得知道同源策略. 同源 ...

  7. jq跨域获取json

    <!DOCTYPE html><html lang="zh"> <head> <meta charset="UTF-8" ...

  8. 关于跨域读取json数据我的理解

    这两天在做关于读取json数据的插件,想用getJSON读取数据: $.getJSON(http://www.xxxx.com/Titles.js, function (data) { console ...

  9. 利用location.hash+iframe跨域获取数据详解

    前言 如果看懂了前文利用window.name+iframe跨域获取数据,那么此文也就很好理解了.一样都是动态插入一个iframe,然后把iframe的src指向服务端地址,而服务端同样都是输出一段j ...

随机推荐

  1. CozyRSS1.0 - 有可用性版本

    bin:还是不提供了,有兴趣的加QQ群373862115讨论 src:https://github.com/zpublic/cozy/tree/a202ae0944936c1ca56c2c3f4b73 ...

  2. 没有了SA密码,无法Windows集成身份登录,DBA怎么办?

    一同事反馈SQL无法正常登录了,以前都是通过windows集成身份验证登录进去的(sa密码早忘记了),今天就改了服务器的机器名,现在无论如何都登录不进去. SQL登录时如果采用windows集成身份验 ...

  3. 前端js调用七牛制作评价页面案例

    一.需求 公司所有的上传页面都用七牛,前端不免要直接调用七牛的代码进行上传,以下是一个实现七牛上传的案例,制作一个常见的商品评价页面,页面需求很常见当上传到第五章图片的时候,上传按钮消失,上传需要显示 ...

  4. SpringMVC(一) SpringMVC概述

    SpringMVC为展现层提供的基于MVC设计理念的优秀的WEB框架,是目前主流的MVC框架之一.Spring 3.0之后,超越Struts2成为最优秀的MVC框架. SpringMVC通过一套MVC ...

  5. vue-loader配合webpack的使用及安装

    vue-loader配合webpack的使用及安装: 工程文件简单的目录结构 index.html main.js   入口文件 App.vue   vue文件,官方推荐命名法 package.jso ...

  6. CSS预处器的对比——Sass、Less和Stylus

    预处器的对比--Sass.LESS和Stylus 转载: 英文原文:http://net.tutsplus.com/tutorials/html-css-techniques/sass-vs-less ...

  7. js数组操作大全

    原文(http://www.cnblogs.com/webhotel/archive/2010/12/21/1912732.html) 用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简 ...

  8. 《UML大战需求分析》阅读随笔(六)

    在我们做的代码设计中分为系统设计和程序设计.程序设计是系统设计中模拟程序的执行逻辑,定义客户机服务器对象合作的框架的那个部分.程序和事务设计中,作者讲述到程序和事务设计将系统设计制品放在一起,并作为系 ...

  9. 【APICloud】利用sublimetext3编写apicloud

    下载sublime text 3 安装插件 使用模糊搜索apicloud有三个插件全部下载下来 安装海马玩模拟器,这是一个安卓的模拟器,进入官网下载后直接安装就可以了. 打开sublime text ...

  10. STL插入删除和查询测试

    博客园的markdown不知道怎么插入C++代码,只好放弃了..本文在我的blog发布:http://jwk000.github.io/2015/09/02/20150902/