一小子攻城狮
想与博主以及众群友“发生关系”的请点击加【群243143941】;
  • 攻城狮
  • 身处网络
  • 随笔
7月302015

js结合iframe解决跨域问题

作者:老温   发布:2015-7-30 11:16 Thursday   分类:攻城狮   阅读:132次   评论:0条  

iFrame跨域解决办法,当然前提是两个域都在你的控制下
按情境分
    1、不跨域时
    2、主域相同、子域不同时
    3、主域不同

1、不跨域时
    访问iframe: contentWindow
    访问父级:parent
    访问顶级:top
    
   
    a.html
	
	<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
	    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	    <title>A</title>
	</head>
	<body>
	    <textarea id="message">这是高层的密码!</textarea><br/>
	    <button id="test">看看员工在说什么</button><br/><br/><br/>
	    员工们:<br/>
	    <iframe src="b.htm" width="500" height="300" id="iframe"></iframe>
	    <script> document.getElementByI d("test").onclick = function(){ alert(document.getElementByI d("iframe").contentWindow.document.getElementByI d("message").value); }     </script>
	</body>
	</html>
	
    b.html
	<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
	    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>JSONP方式</title> <script type="text/javascript" src="/js/jquery-1.5.1.min.js"></script> </head>
	<body>
	    <textarea id="message">这是员工的密码!</textarea><br/>
	    <button id="test">看看领导在说什么</button><br/>
	    <script> document.getElementByI d("test").onclick = function(){ alert(parent.document.getElementByI d("message").value); } </script>
	</body>
	</html>


2、跨域时
    1、主域相同、子域不同
        使用document.domain=主域名
        
       
    a.html (http://a.xxx.com/js/crossdomain/demo/a.htm)
		<html xmlns="http://www.w3.org/1999/xhtml">
		<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>A</title>
		</head>
		<body>
		<textarea id="message">这是高层的密码!</textarea><br/>
		<button id="test">看看员工在说什么</button><br/><br/><br/>员工们:<br/>
		<iframe src="http://b.xxx.com/js/crossdomain/demo/b.htm" width="500" height="300" id="iframe"></iframe>
		<script>
		
		   document.domain = "jiaju.com";
		
		   document.getElementByI d("test").onclick = function(){
		        alert(document.getElementByI d("iframe").contentWindow.document.getElementByI d("message").value);
		    }
		</script>
		</body>
		</html>
		
    b.html ((http://b.xxx.com/com/js/crossdomain/demo/b.htm ))
		<html xmlns="http://www.w3.org/1999/xhtml">
		<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>JSONP方式</title>
		<script type="text/javascript" src="/js/jquery-1.5.1.min.js"></script>
		</head>
		<body>
		<textarea id="message">这是员工的密码!</textarea><br/>
		<button id="test">看看领导在说什么</button><br/>
		<script>
		    document.domain = "jiaju.com";
		    document.getElementByI d("test").onclick = function(){
		        alert(parent.document.getElementByI d("message").value);
		    }
		</script>
		</body>
		</html>
		两个域都设置:document.domain=‘jiaju.com’

        两个域都设置:document.domain=‘jiaju.com’

    2、主域不同
        解决办法:
        1、location.hash
        2、window.name
        location.hash
        location.hash 是什么:
        hash 属性是一个可读可写的字符串,该字符串是 URL 的锚部分(从 # 号开始的部分)
        
        例子
        location.hash(A操作B)
        A通过location.hash方式传递参数给B,B通过定时器检测hash变化,执行对应操作。
    a.html(http://www.aaa.com/demo/cross/iframe03/a.htm)
		<html xmlns="http://www.w3.org/1999/xhtml">
		<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>A</title>
		</head>
		<body>
		<textarea id="message">这是高层的密码!</textarea><br/>
		<button id="test">看看员工在说什么</button><br/><br/><br/>员工们:<br/>
		<iframe src="http://www.bbb.com/demo/cross/iframe03/b.htm#message=111" width="500" height="300" id="iframe"></iframe>
		<script>
		    var iframe = document.getElementByI d("iframe")
		    document.getElementByI d("test").onclick = function(){
		        var url = iframe.src,
		        time = (new Date()).getTime();
		        if(url.indexOf("message") != -1){
		           iframe.src = url.replace(/message=\w+/,"message="+time);
		        }else {
		            iframe.src = url+"/#message="+time;
		        }
		    }
		</script>
		</body>
		</html>
    b.html
		<html xmlns="http://www.w3.org/1999/xhtml">
		<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>JSONP方式</title>
		<script src="/js/crossdomain/crossdomain.js"></script>
		</head>
		<body>
		<textarea id="message">这是员工的密码!</textarea><br/>
		<button id="test">看看领导在说什么</button><br/>
		<script>
		var data = {};
		var hash_url;
		function dealHash(){
		    hash_url = window.location.hash;
		     var  datas = hash_url.split("#")[1].split("&");
		    for(var i = 0;i<datas.length;i++){
		        var t = datas[i].split("=");
		        data[t[0]] = decodeURIComponent(t[1]);
		    }
		}
		function change(){
		    if(hash_url!=window.location.hash){
		        dealHash();
		        document.getElementByI d("message").value = data["message"];
		    }
		}
		setInterval(change,100);
		</script>
		</body>
		</html>

        
        location.hash(B操作A)
        A创建和上层同域的iframe通过location.hash方式传递参数给B ,B通过top.window获取顶层window对象A
       
    a.html(http://www.aaa.com/demo/cross/iframe03/a.htm)
		<html xmlns="http://www.w3.org/1999/xhtml">
		<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>A</title>
		<script>
		    document.domain = "jiaju.com";
		    function test(obj){
		       alert(obj['message']);
		    }
		</script>
		</head>
		<body>
		这里是A(第一层)<br/>
		<iframe id="google" src="http://www.bbb.com/demo/crossiframe/b.html" width="1000" height="300" border=1></iframe>
		</body>
		</html>
		
    b.html(http://www.bbb.com/demo/crossiframe/b.html)
		<html xmlns="http://www.w3.org/1999/xhtml">
		<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<title>B</title>
		</head>
		<body style="background-color:#e5e5e5">
		<script src="/js/crossdomain/crossdomain.js"></script>
		这里是B(第二层)iframe<br/>
		<div id="div" style="height:200px;background-color:blue;color:#fff;">这里高度可以变化</div>
		<button id="btn">点击改变高度</button><button id="btn2">点击调用顶层callback</button>
		<script>
		document.getElementByI d("btn").onclick = function(){
		    var div = document.getElementByI d("div");
		    div.style.height = (parseInt(div.style.height)+100)+"px";
		    JJcrossiframe.setHeight("google");
		}
		
		document.getElementByI d("btn2").onclick = function(){
		    JJcrossiframe.callback("test",{
		        message:"来自跨域的iframe的问候!"
		    });
		}
		</script>
		</body>
		</html>

        
        location.hash原理:
            1、动态改变location.hash,iframe不会重载
            2、无论跨域与否,iframe内可以获取自己的location.hash
            3、只要域名相同就能通信,即使ABC三层嵌套
            location.hash通用解决办法:
            被嵌入的跨域的iframe中引入
            <script src="/js/crossdomain/crossdomain.js"></script>
        
        提供以下方法:
            JJcrossiframe.setHeight(‘youiframeID’) //自动设定跨域iframe高度
            JJcrossiframe.setWidth(‘youiframeID’)  //自动设定跨域iframe宽度
            JJcrossiframe.callback(‘fn’,paramobj)  //调用顶层iframe中fn函数
            JJcrossiframe.init(paramobj , type)             //自定义向顶层传参数
            //  (type目前有:height,width,callback),
            //  新增type需在代理页面内自定义开发
            
        location.hash缺点
            1、传递数据量有限
            2、不太安全
        
        
        
        window.name
        window.name 是什么:
            name 在浏览器环境中是一个全局window对象的属性
            当在 iframe 中加载新页面时,name 的属性值依旧保持不变
            name 属性仅对相同域名的 iframe 可访问
            
        window.name 的优势:
            数据量更大(2M)
            更安全
            可传递多种数据格式
            window.name 的劣势:
            只适用于隐藏iframe的情形
        
        国内起源:
        怿飞博客:
        http://www.plan
        abc.net/2008/09/01/window_name_transport/
        原理(1) :
        A创建iFrame B,把要传递的数据放入window.name


本文固定链接: http://php.oneboys.cn/post-55.html

blogger
该日志由 老温 于2015-7-30 11:16 Thursday发表在 攻城狮 分类下。
版权所有:《一小子攻城狮》 → 《js结合iframe解决跨域问题》;
除特别标注,本博客所有文章均为原创. 互联分享,尊重版权,转载请以链接形式标明本文地址;
本文标签: JS iframe跨域 js+iframe跨域传递参数
上一篇::mysql长连接
下一篇:js获取时间戳的方法

热门文章

相关文章

  • JS 倒计时
  • 正则表达式替换网页中部分标签
  • php文件处理相关 批量替换等等
  • php设置断点续传下载文件
  • PHP的弱类型
取消回复

发表评论

亲,头像对么?

提交中,请稍候……



    最新文章热门文章随机文章

    • php邀请背景图合成二维码
    • 列表点击编辑
    • css 宽度不固定 正方形盒子
    • 终端生成证书 公私钥
    • apache环境接收自定义header
    • PHP curl 模块获取header和body完整信息
    • php导出excel,不用php Excel类
    • Mysql 导入错误1064 USING BTREE错误
    • PHP PDO属性列表以及PDO方法分类
    • mysql1153错误,max_allowed_packet
    • 原生js判断DOM是否加载完毕而不等待图片加载完毕
    • 微信公众号吸粉100种快速加人方法攻略
    • 删除所有.svn目录,去除版本控制
    • html5上传加上传进度无插件
    • 队列可以缓解高并发,但不能解决超载问题
  • 标签

      PDO方法 PDO属性 MYSQL MYSQL重装 linux学习 linux命令screen php命令行 phpExcel max_allowed_packet Jquery php命名空间 MYSQL错误 php获取header信息 getallheaders php弱类型 php运算符优先级 自媒体运营 svn svn命令 解除svn控制 PHP 客户端IP sql随机取出数据 SQL语句limit qq群排名 QQ群排名技术 刷QQ群活跃度 .htaccess rar安装 301重定向 mysql_ping api错误码设计 PDO PDO连接状态 营销中的驱动媒介 curl获取header信息 CURL HTML+CSS checkbox的change事件 DOM加载 图片加载 微信公众账号 微信公众账号加粉 解除svn版本控制 html5 html5上传 html5进度条上传 高并发 队列 高并发超载 html5预览 MEMCACHE 一致性哈希算法 WDCP zendStudio php内置函数不能自动提示 insertinto selectinto 经典SQL语句大全 sql学习 Javascript 日期函数 获取月份天数 linux find命令 锚点 HTML 正则表达式 CSS自动折行 CSS自动换行 SQL CDN测试 哈夫曼 SQL删除重复并保留一条 curl下载 修改mysql root密码 php删除文件夹 php遍历文件夹 JS js时间戳 iframe跨域 js+iframe跨域传递参数 长连接 mysql长连接apache mysql长连接fastcgi base64编码加密 SSDB ssdb遍历集合 ssdb集合 emlog nginx伪静态 Fireworks 文字水印 前端 echarts echarts全国地图 html+css隐藏滚动条 魔方图片 魔方相册 html+css魔方相册 php错误日志 PhpSpreadsheet PhpSpreadsheet导入 PhpSpreadsheet导出 PhpSpreadsheet设置单元格属性 js函数抖动 中文分词 中文切词 php公众号 网易云音乐播放器 网易云音乐歌单播放器 解析header 解析cookie CSS
  • 存档

    • 2021年2月(2)
    • 2021年1月(3)
    • 2020年11月(11)
    • 2020年10月(3)
    • 2020年8月(1)
    • 2020年2月(9)
    • 2020年1月(2)
    • 2019年12月(3)
    • 2016年11月(1)
    • 2016年5月(1)
    • 2016年2月(1)
    • 2015年10月(2)
    • 2015年9月(2)
    • 2015年7月(9)
    • 2015年6月(5)
    • 2015年5月(1)
    • 2015年4月(4)
    • 2015年3月(13)
    • 2015年2月(3)
    • 2015年1月(8)
    • 2014年12月(10)
© 2010 - 2014 老温PHP 版权所有