SlideShare ist ein Scribd-Unternehmen logo
1 von 27
那些年,我们一起跨过域
    Theowang
讨论什么?

我们不神化跨域方法,跨域没有完美
我们不罗列跨域方法,不讲n大跨域方法
我们解决工作遇见的跨域问题,偏实战
其实这是个古老而又猥琐的话题

为什么要跨域呢?          什么情况是跨域?
   我要自适应高度          子域名不同
   我要实现多域名单点登录      主域名不同
   我要和第三方网站通信       协议不同
   我要跨域种cookie      端口不同
   我要……




2012-6-7                      3
我们要说的跨域方法

 document.domain
 location.hash
 window.name
 postMessage
 flash
iframe Tips

    父窗口获取子窗口的window对象方法
      Iframe.contentWindow

    父窗口获取子窗口document对象方法
      iframe.contentWindow.document || iframe.contentDocument;
      document.frames[id].document; //IE6-7

    子窗口获取父窗口window对象
      parent

    iframe父窗口和子窗口通信符合同源策略
      即同域名下才可以进行window和dom操作

   使用JavaScript在IE和Firefox下进行iframe的DOM操作
2012-6-7                                                          5
http://www.qq.com/
       <iframe id=“iframe” src=“iframe.html”>
       var iframe = document.getElementById('iframe');
       var iframeWin = iframe.contentWindow;
       var someFn = function(){};

           http://www.qq.com/iframe.html
             var pSomeFn = parent.someFn;




                         Iframe之间操作window对象
                                 查看在线demo



2012-6-7                                                 6
准备好了吗?
document.domain

原理:

化跨域通信问题为frame之间的跨域操作

两个不同子域名通过设置 document.domain='主
域名' 获取操作对方的跨域权限
http://4.qdemo.sinaapp.com/xdomain/document.domain/
       document.domain = 'sinaapp.com';
       var iframe = document.getElementById('iframe');
       var iframeWin = iframe.contentWindow;
       var iframeXHR = iframeWin.xmlHttp();

           http://dali.sinaapp.com/proxy.htm
             document.domain = 'sinaapp.com';
             xmlHttp = function() { return new XMLHttpRequest();};




                         Document.domain跨域实例
                                  查看在线demo



2012-6-7                                                             9
Document.domain跨域优缺点



   子域名双向跨域            安全!!!
   post/get轻松搞定       不能跨主域名
   跟本域操作无异



 优点                   缺点


2012-6-7                          10
location.hash

原理:

hash指的是url中#之后的部分,跨域时通过
iframe.src设置,子窗口通过location.hash取到
设置url的hash不需要页面跳转,而是当前页面锚
点跳转
http://js8.in/demos/xdomain/location.hash/
       document.getElementById('iframe').src = proxyHost + '#'+val;

           http://dali.sinaapp.com/proxy.htm
           window.onhashchange = hashchange;//不支持用定时器

            http://js8.in/demos/xdomain/location.hash/parentproxy.htm

              var hash = location.hash.substr(1).split('=');
              var height = hash[1];
              parent.parent.setHeigth(height);




                            Location.hash跨域实例
                                  查看在线demo



2012-6-7                                                                12
Location.hash跨域优缺点



   可跨主域名             产生浏览器历史记录
   操作简单              受URL长度限制
   可以双向跨域



 优点                  缺点


2012-6-7                           13
window.name

原理:

window.name属性可以在不同域下访问,当
iframe的url改变也不改变name的值

页面建立setTimeout/setInterval监听
window.name变化
http://js8.in/demos/xdomain/window.name/
       doc.getElementById(„iframeA‟).contentWindow.name = value;
           http://4.qdemo.sinaapp.com/xdomain/window.name/proxy.html

              var hash = window.name;
              setInterval(function(){
                 if (window.name !== hash) {
                     hash = window.name;
                     cb.call(window, hash);
                 }
              }, 50);




                           Window.name跨域实例
                              查看在线demo(IE6-7)



2012-6-7                                                               15
window.name跨域优缺点



   可跨主域名            只有IE6-7等低版本浏
   操作简单             览器支持
   可以双向跨域           通信数据量不大



 优点                 缺点


2012-6-7                             16
postMessage

原理:

    html5新增的postMessage方法,通过
    postMessage来传递信息,对方可以通过监听
    message事件来监听信息




2012-6-7                        17
postMessage浏览器支持情况
http://js8.in/demos/xdomain/postmessage/
       var ifr = doc.getElementById('iframeA').contentWindow;
       ifr.postMessage(data,'*');

           http://4.qdemo.sinaapp.com/xdomain/postmessage/proxy.html
             //监听
             Win.addEventListener("message",function(e){
                 cb.call(win,e.data);
             },false);
             //发送
             var ifr = win.parent;
             ifr.postMessage(data,'*');



                            PostMessage跨域实例
                   查看在线demo(需要支持postMessage浏览器)



2012-6-7                                                               19
postMessage跨域优缺点



   Html5原生支持
   可跨主域名
                     需要浏览器支持html5
   可以双向跨域
   可控制跨域域名


 优点                 缺点


2012-6-7                             20
Flash跨域

原理:

利用flash的URLLoader,也可以轻松实现跨域数据交互
只要站点B的跨域策略文件(crossdomain.xml)中包含了站
点A
Flash提供ExternalInterface接口与JavaScript通信,
ExternalInterface有两个方法,call和addCallback,call的
作用是让Flash调用js里的方法,addCallback是用来注册
flash函数让js调用
http://js8.in/demos/xdomain/flash/
       引入crossxhr.js,创建swf:
       http://js8.in/demos/xdomain/flash/crossxhr.swf

           http://4.qdemo.sinaapp.com/crossdomain.xml

             <?xml version="1.0" encoding="UTF-8"?>
             <cross-domain-policy>
               <allow-access-from domain="js8.in"/>
             </cross-domain-policy>




                                 flash跨域实例
                                 查看在线demo



2012-6-7                                                22
flash跨域优缺点




   可跨主域名
                    需要浏览器flash插件
   可以双向跨域
                    开发成本大
   可控制跨域域名



 优点                缺点


2012-6-7                            23
PK

                      优点           缺点         适合场景

                  子域名间无障碍通    不能跨主域,安全      跨子域,安全性高
document.domain   信           性

                  简单,跨主域,可    url限制(ie4k,   简单需求,例如高
 location.hash    双向          ff40k),历史记录   度自适应

                  简单,跨主域,可    数据量限制,只有      配合其他跨域方式
 window.name      双向          IE6-7支持       命令式跨域

                  跨主域,可双向     html5限制       可与其他跨域方式
 postMessage      ,Html5原生支持,               组合的命令式跨域
                  可控制访问域名
                  跨主域,可双向,    flash限制,开发相   一般通过控制跨域
     flash        可控制跨域域名     对复杂           域名来单向跨域
好吧,我们也凑齐十大跨域方式

 JSONP
 后端代理
 表单+重定向callback(一般用于跨域上传图片)
 跨域资源共享(CORS)
 Flash LocalConnection
跨域开源项目

 CrossXHR:flash
 easyXDM:flash+postMessage+win.name
 AJAXCDR:flash
Q&A
Thanks

Weitere ähnliche Inhalte

Was ist angesagt?

基于Greasemonkey的Firefox浏览器扩展
基于Greasemonkey的Firefox浏览器扩展基于Greasemonkey的Firefox浏览器扩展
基于Greasemonkey的Firefox浏览器扩展agen
 
Exam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsExam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsChieh Lin
 
Clientside attack using HoneyClient Technology
Clientside attack using HoneyClient TechnologyClientside attack using HoneyClient Technology
Clientside attack using HoneyClient TechnologyJulia Yu-Chin Cheng
 
Web dev road map part one
Web dev road map part oneWeb dev road map part one
Web dev road map part one安 闫
 
建立前端开发团队 (Front-end Development Environment)
建立前端开发团队 (Front-end Development Environment)建立前端开发团队 (Front-end Development Environment)
建立前端开发团队 (Front-end Development Environment)Joseph Chiang
 
广告投放代码和创意代码持续优化
广告投放代码和创意代码持续优化广告投放代码和创意代码持续优化
广告投放代码和创意代码持续优化taobao.com
 
使用kslite支持第三方内容开发
使用kslite支持第三方内容开发使用kslite支持第三方内容开发
使用kslite支持第三方内容开发leneli
 
使用Bigpipe提升浏览速度
使用Bigpipe提升浏览速度使用Bigpipe提升浏览速度
使用Bigpipe提升浏览速度kumawu
 
犀牛书第六版
犀牛书第六版犀牛书第六版
犀牛书第六版jay li
 
Javascript stacktrace
Javascript stacktraceJavascript stacktrace
Javascript stacktracecazhfe
 
第九章解答
第九章解答第九章解答
第九章解答jiannrong
 
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Joseph Chiang
 
快速定位开发常见的前端问题
快速定位开发常见的前端问题快速定位开发常见的前端问题
快速定位开发常见的前端问题taobao.com
 

Was ist angesagt? (13)

基于Greasemonkey的Firefox浏览器扩展
基于Greasemonkey的Firefox浏览器扩展基于Greasemonkey的Firefox浏览器扩展
基于Greasemonkey的Firefox浏览器扩展
 
Exam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development FundamentalsExam 98-375 HTML5 Application Development Fundamentals
Exam 98-375 HTML5 Application Development Fundamentals
 
Clientside attack using HoneyClient Technology
Clientside attack using HoneyClient TechnologyClientside attack using HoneyClient Technology
Clientside attack using HoneyClient Technology
 
Web dev road map part one
Web dev road map part oneWeb dev road map part one
Web dev road map part one
 
建立前端开发团队 (Front-end Development Environment)
建立前端开发团队 (Front-end Development Environment)建立前端开发团队 (Front-end Development Environment)
建立前端开发团队 (Front-end Development Environment)
 
广告投放代码和创意代码持续优化
广告投放代码和创意代码持续优化广告投放代码和创意代码持续优化
广告投放代码和创意代码持续优化
 
使用kslite支持第三方内容开发
使用kslite支持第三方内容开发使用kslite支持第三方内容开发
使用kslite支持第三方内容开发
 
使用Bigpipe提升浏览速度
使用Bigpipe提升浏览速度使用Bigpipe提升浏览速度
使用Bigpipe提升浏览速度
 
犀牛书第六版
犀牛书第六版犀牛书第六版
犀牛书第六版
 
Javascript stacktrace
Javascript stacktraceJavascript stacktrace
Javascript stacktrace
 
第九章解答
第九章解答第九章解答
第九章解答
 
Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練Node.js 入門 - 前端工程開發實務訓練
Node.js 入門 - 前端工程開發實務訓練
 
快速定位开发常见的前端问题
快速定位开发常见的前端问题快速定位开发常见的前端问题
快速定位开发常见的前端问题
 

Ähnlich wie 那些年,我们一起跨过域

张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐zhangsuoyong
 
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5 Tony Deng
 
基于Greasemonkey的Firefox浏览器扩展
基于Greasemonkey的Firefox浏览器扩展基于Greasemonkey的Firefox浏览器扩展
基于Greasemonkey的Firefox浏览器扩展agen
 
HTML5概览
HTML5概览HTML5概览
HTML5概览Adam Lu
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型Jackson Tian
 
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践longhao
 
客户端存储与计算
客户端存储与计算客户端存储与计算
客户端存储与计算xiaotao ning
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送yongboy
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送yongboy
 
PHP WEB 应用组织与结构
PHP WEB 应用组织与结构PHP WEB 应用组织与结构
PHP WEB 应用组织与结构HonestQiao
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发leneli
 
赶集团购开发总结4
赶集团购开发总结4赶集团购开发总结4
赶集团购开发总结4yangdj
 
Html5和css3入门
Html5和css3入门Html5和css3入门
Html5和css3入门Xiujun Ma
 
【项目分享】赶集移动Web App开发总结
【项目分享】赶集移动Web App开发总结 【项目分享】赶集移动Web App开发总结
【项目分享】赶集移动Web App开发总结 yangdj
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介GO LL
 
Html5form
Html5formHtml5form
Html5formjay li
 
EventProxy introduction - JacksonTian
EventProxy introduction - JacksonTianEventProxy introduction - JacksonTian
EventProxy introduction - JacksonTianJackson Tian
 
Event proxy introduction
Event proxy introductionEvent proxy introduction
Event proxy introductionmysqlops
 
Inside the browser
Inside the browserInside the browser
Inside the browserotakustay
 
D2-ETao-show
D2-ETao-showD2-ETao-show
D2-ETao-showleneli
 

Ähnlich wie 那些年,我们一起跨过域 (20)

张所勇:前端开发工具推荐
张所勇:前端开发工具推荐张所勇:前端开发工具推荐
张所勇:前端开发工具推荐
 
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5
 
基于Greasemonkey的Firefox浏览器扩展
基于Greasemonkey的Firefox浏览器扩展基于Greasemonkey的Firefox浏览器扩展
基于Greasemonkey的Firefox浏览器扩展
 
HTML5概览
HTML5概览HTML5概览
HTML5概览
 
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
 
高性能网站最佳实践
高性能网站最佳实践高性能网站最佳实践
高性能网站最佳实践
 
客户端存储与计算
客户端存储与计算客户端存储与计算
客户端存储与计算
 
Real time web实时信息流推送
Real time web实时信息流推送Real time web实时信息流推送
Real time web实时信息流推送
 
Real-Time Web实时信息流推送
Real-Time Web实时信息流推送Real-Time Web实时信息流推送
Real-Time Web实时信息流推送
 
PHP WEB 应用组织与结构
PHP WEB 应用组织与结构PHP WEB 应用组织与结构
PHP WEB 应用组织与结构
 
OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发OPOA in Action -- 使用MagixJS简化WebAPP开发
OPOA in Action -- 使用MagixJS简化WebAPP开发
 
赶集团购开发总结4
赶集团购开发总结4赶集团购开发总结4
赶集团购开发总结4
 
Html5和css3入门
Html5和css3入门Html5和css3入门
Html5和css3入门
 
【项目分享】赶集移动Web App开发总结
【项目分享】赶集移动Web App开发总结 【项目分享】赶集移动Web App开发总结
【项目分享】赶集移动Web App开发总结
 
NodeJS基礎教學&簡介
NodeJS基礎教學&簡介NodeJS基礎教學&簡介
NodeJS基礎教學&簡介
 
Html5form
Html5formHtml5form
Html5form
 
EventProxy introduction - JacksonTian
EventProxy introduction - JacksonTianEventProxy introduction - JacksonTian
EventProxy introduction - JacksonTian
 
Event proxy introduction
Event proxy introductionEvent proxy introduction
Event proxy introduction
 
Inside the browser
Inside the browserInside the browser
Inside the browser
 
D2-ETao-show
D2-ETao-showD2-ETao-show
D2-ETao-show
 

那些年,我们一起跨过域