document获取iframe_关于iframe生成图片

接到一个需求:在h5 parent上需要iframe嵌入第三方页面child,同时需要操作生成长图,拿着这个需求的时候,想着只要获取到第三方页面的dom元素了,利用html2canvas就能解决了,你以为就是你以为的吗?

想法1: 子页面传高度给父页面
为什么会有上面的的想法呢,是因为html2canvas需要width、height。width通过document.body.offsetWidth获取,但是高度是和页面内容有关系的,如果直接在父页面parent直接获取子页面child,并计算高度,发现会存在跨域的问题

2b07df1edce5b40116f481cc666ede24.png

操作子页面元素跨域

这样,要不我子页面child直接把高度传递给父页面parent,
window.parent.postMessage({

height: document.querySelector('body').scrollHeight,

}, '*')
通过上面方法,父页面在iframe的高度里完全按照子页面的height设置,展示挺好看的,没啥毛病,是不是可以利用html2canvas生成图片了呢,但实验发现:用iframe来生成的图片是空白的;用iframe子元素body来操作存在跨域问题,此时,需要考虑怎么避开跨域操作子元素呢???

9b4de5cd989235e12139c387ba4fbf53.png

空白图

b11325654bdbc68baff9b55bfa37b74f.png

跨域问题

想法2: 子页面传dom节点给父页面
子页面传递dom给父页面,如果是直接Element类型,如document.body是没法传递的,必须是字符串,所以采用的是document.body.innerHTML

cb2af10dfdead948b08729645ad79e35.png

子元素传递body

操作的时候发现,执行没啥问题,但是样式却丢失了,生成的图片和展示的页面不是一回事,开始想是html2canvas样式必须写在dom里还是页面带上了就可以,实验发现html2canvas的样式不一定写在dom里,页面有css文件也可以

9d466319711ef732d4616c6d9850bc24.png

只有body生成图片

想法3: 子页面把head和body传递给父页面

4dce75533487942ab7b023b9e3a3bd0f.png

body+head

在生成图片的时候,利用子页面的body/head代替父页面的body/head,最后能成功生成第三方页面的长图,但其实这里直接传递最外层的html就行,没必要分批传递body/head

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值