需求:

在一个页面中通过iframe标签签入一个页面,通过操作iframe标签内的页面来切换iframe的页面.

即通过iframe内子页面来调用父页面的方法实现功能,当 两个页面域名不同,要跨域操作.

解决方案:

跨域的调用,调用属性/函数的页面与被调用属性/函数的页面处于同一个域,这里使用一个中间页面.因为是子页面调用父页面,所以中间页面的域名同父页面.

代码:

父页面:

http://localhost:8080/TomcatTest/Page.html

<iframe src="http://10.110.80.186/jcms/publish/zglh/zxggpc/"   οnlοad="changeFrameHeight()" id="myframe" name="myframe" width="100%"  frameborder="0" scrolling="no"></iframe>

子页面:

http://10.110.80.186/jcms/publish/zglh/zxggpc/

点击一个a标签,得到一个URL,传给中间页面,在传给父页面,调用父页面方法切换iframe标签的src属性

  <a  href="${contentList.CM_PUBLISHPATH}">  ${contentList.CM_TITLE}</a><script>$("#pagelist a").click(function(){       var url = $(this).attr("href");       //得到父页面iframe要切换的URL     stayPage(url);     return false;     //阻止当前a标签的跳转})//跨域  使用第三方页面,操作父页面方法
function  stayPage(toUrl) {var h;var imgSrc;$.ajax({url: toUrl,            //请求得到的URL,得到整个页面html代码,词ajax请求要得到当前页面的heightdata: {},contentType: "html",async:false, success: function (contend) {             $("#bodyHeight").html(contend)       //得到此页面的height,传给父页面以实现 iframe 不同页面高度自适应h = $("#bodyHeight").height()imgSrc= getImgSrc();          //得到此页面的所有图片URL,上面的h变量不包括图片高度,因为图片大小为auto,在此页面通过window.οnlοad=function(){} 获取图片实际高度是要图片资源加载完成才行,但此时父页面iframe标签已经完成跳转,没用了,这里将图片URL传给父页面处理
})
// 中间页面:http://localhost:8080/TomcatTest/execA.html, 通过URL传给中间页面三个参数
if(typeof(exec_obj)=='undefined'){  exec_obj = document.createElement('iframe');  exec_obj.name = 'execframe';  exec_obj.src = 'http://localhost:8080/TomcatTest/execA.html?url='+toUrl+'&height='+h+'&imgSrc='+imgSrc;  exec_obj.style.display = 'none';  document.body.appendChild(exec_obj);  }else{  exec_obj.src='http://localhost:8080/TomcatTest/execA.html?' + Math.random()+"&url="+toUrl+'&height='+h+'&imgSrc='+imgSrc;  }
}//得到页面所有图片的URLfunction getImgSrc(){
var src="";
$("#bodyHeight img").each(function(index,domEle){  if(index ==0)src += $(this).attr("src");
elsesrc += ","+$(this).attr("src");
});
return src;
}</script>

中间页面:在父页面的项目里创建

http://localhost:8080/TomcatTest/execA.html

  <body>  <h3>execA</h3><script type="text/javascript">  var url = location.search;        //获取子页面通过URL传的参数var src = url.substring(url.indexOf("url=")+4,url.indexOf("&height"))var height = url.substring(url.indexOf("height=")+7,url.indexOf("&imgSrc"))var imgSrc = url.substring(url.lastIndexOf("=")+1)parent.parent.change(src,height,imgSrc);    //调用父页面change方法</script>  </body>  

父页面:

传过来三个参数,src 用于替换iframe的src属性值,

height用于设置iframe的高度

imgSrc用于获取每个图片的真实高度

<script>function changeFrameHeight(){var ifm= document.getElementById("myframe"); ifm.height=document.documentElement.clientHeight;}window.οnresize=function(){  changeFrameHeight();  }
function change(src,height,imgSrc){  var h = Number(height)+110;        //定义iframe的父标签高度if(imgSrc != "") {                              //根据图片URL 获取图片高度var imgArr = imgSrc.split(",");imgArr.forEach(function(ele,index){ // 这里做下说明,$("<img/>")这里是创建一个临时的img标签,类似js创建一个new Image()对象!  var img =  $("<img/>").attr("src", ele)h += img[0].height     //img[0].height 即为当前图片高度, 添加到 height 上去,这里不用load方法也可以获取,用下面的load方法也可以获取,但load方法中 如果图片地址无效,报notfound错误,则程序无法执行下去height = h-110
//          img.load(
//                  function() {
//                      /*
//                       * 如果要获取图片的真实的宽度和高度有三点必须注意 1、需要创建一个image对象:如这里的$("<img/>")
//                       * 2、指定图片的src路径 3、一定要在图片加载完成后执行如.load()函数里执行
//                       */
//                       h += this.height
//                       height = h-110if(index == imgArr.length-1){$(".homepage_main").css("height",h);$("#myframe").css("height",height);if(src.indexOf("http")== -1)     / /传的src可能是相对地址$("#myframe").attr("src","http://10.110.80.186/jcms/publish/zglh/zxggpc/"+src);else$("#myframe").attr("src",src);document.getElementById("demo").innerHTML = height;}
//                  }); }); }else{$(".homepage_main").css("height",h);$("#myframe").css("height",height);if(src.indexOf("http")==-1)$("#myframe").attr("src","http://10.110.80.186/jcms/publish/zglh/zxggpc/"+src);else$("#myframe").attr("src",src);}}
</script>

总结:

这个需求有四个问题点,

一:iframe跨域请求并穿参数,

二:iframe子页面自适应高度,

三:图片高度在子页面无法获取,

四:父页面获取图片高度时用load方法当图片地址失效时报错

参考文章:

js和jquery如何获取(图片)真实的宽度和高度

点击打开链接

iframe与主框架跨域相互访问方法

点击打开链接

iframe跨域请求相关推荐

  1. 利用iframe跨域请求

    跨域是系统与系统之间信息交流的一种方式,为了获取另外一个地方的信息,经常会出现跨域,总结一下利用iframe跨域进行请求,网上关于跨域的信息很多,只做一下备忘 <!DOCTYPE html> ...

  2. artdialog ajax,artDialog v6 iframe 跨域请求

    在iframe中,打开dialog加载子页面. 思路: 父页面打开dialog,在子页面中写提交,获取当前dialog进行后续操作. 父页面拿到子页面表单,在父页面提交,直接操作dialog完成后续动 ...

  3. 使用img.src跨域请求

    使用Img.src跨域请求 无刷新的页面请 求,被越来越多的应用.XMLHttp.Request只支持同域名的请求,Iframe支持跨域请求,但是跨域Javascript调用会被制止,使得 Ifram ...

  4. 用iframe设置代理解决ajax跨域请求问题

    用iframe设置代理解决ajax跨域请求问题 参考文章: (1)用iframe设置代理解决ajax跨域请求问题 (2)https://www.cnblogs.com/ranzige/p/370965 ...

  5. 关于ajax跨域请求(cross Domain)

    Cross Domain AJAX主要就是A.com网站的页面发出一个XMLHttpRequest,这个Request的url是B.com,这样的请求是被禁止的,浏览器处于安全考虑不允许进行跨域访问, ...

  6. 浏览器同源策略以及跨域请求时可能遇到的问题

    跨域请求基础知识 浏览器的同源策略 浏览器的源指的是 协议://域名:端口 这样的URL组合.我们首先要明确几点 www.foo.com 和 foo.com 是不同域 www.foo.com 和 ww ...

  7. 循序渐进Python3(十一) --6--  Ajax 实现跨域请求 jsonp 和 cors

    Ajax操作如何实现跨域请求? Ajax (XMLHttpRequest)请求受到同源策略的限制. Ajax通过XMLHttpRequest能够与远程的服务器进行信息交互,另外XMLHttpReque ...

  8. JSONP实现Ajax跨域请求

    前言 由于浏览器存在同源策略的机制,所谓同源策略就是阻止从一个源(域名,包括同一个根域名下的不同二级域名)加载的文档或者脚本获取/或者设置另一个源加载的文档属性. 但比较特别的是:由于同源策略是浏览器 ...

  9. 用P3P header解决IE下iframe跨域访问时候session丢失的问题

    用P3P header解决IE下iframe跨域访问时候session丢失的问题 整合客户的登录时,或者其他一个网站通过iframe时,特别是一个http页面,访问一个https页面时,常常会sess ...

最新文章

  1. gif 图片制作和拆解
  2. Centos 系统更新Python
  3. lede旁路由作用_关于电容的旁路与去偶总结
  4. adaboost算法java代码_04-04 AdaBoost算法代码(鸢尾花分类)
  5. 同时画多个饼图_手帐术 | 这个神奇饼图里,藏着时间管理的小秘诀
  6. leetcode 692. 前K个高频单词
  7. 面向程序员编程——精研排序算法
  8. 面部识别 vs 情绪状态,你还能守住自己的秘密吗?
  9. 关于vs2015无法启动iis服务
  10. 计算机VB中清除按钮,计算机vb程序设计时计算器清除的代码怎么写
  11. 如何隐藏电脑下方工具栏个别图标_小编教你电脑如何隐藏任务栏图标
  12. docker-reviewboard
  13. Telink zigbee射频和功耗测试的方法
  14. 测试udp端口通不通linux,windows Centos ubuntu debian等测试UDP端口协议的连通性
  15. html跑马灯编程,求一个HTML无缝的跑马灯代码。
  16. 如何解决http请求304问题,304的原因很可能是缓存造成的。
  17. Windows/Ubuntu16.04双系统和ros安装方法及可能出现的问题
  18. java自动违例设计,java学习记录(二):java的违例控制机制
  19. VS编程,快速折叠或者展开代码到 #region 级别的设置方法。
  20. Java SE学习之【网络编程JavaSocket】

热门文章

  1. 利用VBA批量新建工作表以及重命名,删除除指定以外的工作表
  2. ML302-OpenCpu开发-资料文档(一)
  3. 拜占庭容错共识(PBFT)
  4. matlab中sum函数的用法
  5. 编程干货|普通大学生如何实现经济独立?你不会还在拿着父母给的千把块钱省吃俭用吧!
  6. 40.qt quick- 高仿微信实现局域网聊天V4版本(支持gif动图表情包、消息聊天、拖动缩放窗口、支持Linux编译)...
  7. 用Pandas Index高效比对百万级别文本
  8. 如何往bilibili里面插入视频
  9. 阿里云 Aliplayer高级功能介绍(九):自动播放体验 1
  10. java过山车手游,过山车工艺手游(Roller Coaster Craft)