如何跨域获取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. 1208PHP基础

    PHP是一种创建动态交互性站点的强有力的服务器端脚本语言(后端.弱类型) 从地址栏直接寻找:localhost/路径/路径PHP语法:PHP脚本以<?php 开始,以?>结束; PHP文件 ...

  2. Linux学习笔记(14)-进程通信|共享内存

    在Linux中,共享内存是允许两个不相关的进程访问同一个逻辑内存的进程间通信方法,是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式. 不同进程之间共享的内存通常安排为同一段物理内存.进程可 ...

  3. CSS中的rem的换算

    rem好像也是一个相对大小的值,它是相对于根元素<html>,比如假设,我们设置html的字体大小的值为 html{font-size: 87.5%;}(也就是14px,这是twentyt ...

  4. Python 基础语法学习笔记

    以下运行结果均通过Python3.5版本实测! 1.列表转换为字典 a = ['a', 'b'] b = [1, 2] c = ['c','d'] print (dict([a,b,c])) 输出结果 ...

  5. 关于在header里增加参数的方式

    在使用一个API的时候,文档里写的返回值类型是json,可是试了下返回的明明是xml,还小小的鄙视了一把. 可是解析xml,好麻烦的.最好是json可以直接decode . 意外看到文档下面有一句 J ...

  6. 关于2016.12.12——T1的反思:凸包的意义与应用

    2016.12.12 T1 给n个圆,保证圆圆相离,求将圆围起来的最小周长.n<=100 就像上图.考场上,我就想用切线的角度来做凸包.以圆心x,y排序,像点凸包一样,不过用两圆之间的下切线角度 ...

  7. 使用spring的@Scheduled注解执行定时任务,启动项目不输出警告

    在applicationContext.xml中添加: xmlns:task="http://www.springframework.org/schema/task" xsi:sc ...

  8. overflow:hidden清除浮动原理

    overflow:hidden的意思是超出部分去掉,如果父元素height为auto,内部元素浮动,势必会将内部元素全部隐藏,故计算出内部浮动高度顺便清除浮动.

  9. Essential controls for web app

    AUTO-COMPLETE/AUTO-SUGGEST Auto-complete using Vaadin Offer auto-suggest or auto-complete to help yo ...

  10. setTimeout 学习闭包

    @(技术笔记)[css] 学习参考网站 css 网站,可供参考 javascript学习网站 var create = function (i){ return function(){ console ...