帆软iframe 嵌套页面,dom操作

本文介绍如何通过JavaScript动态控制帆软报表中查询组件的显示与隐藏,并提供了一个简单的实现示例。此外,还讨论了解决因隐藏查询按钮导致无法直接展示报表的问题。

 // 显示帆软的查询组件的时候,动态控制是否显示
             this.$nextTick(() => {
               const iframe = window.frames.iFrame
               const handleLoad = () => {
                setTimeout(() => {
                   const Do = (iframe.contentWindow || iframe.contentDocument)
                   Do.document.getElementsByClassName('pmeter-container')[0].style.visibility = this.isDefaultSearch ? 'inherit' : 'hidden'
                   // Do.getWidgetByName('search').fireEvent('click')
                 }, 100)
               }
               iframe.addEventListener('load', handleLoad, true)
             })

 注意要同源,iframe 不同源不能操作dom哦!这个是控制红色的框那块的隐藏和显示;

隐藏后有个问题就是没有了查询的按钮,帆软的默认是要点一下查询按钮才能出报表;

然后就找到了个参数 &__pi__=false; 加上这个参数后,直接不显示那个查询红框框;

然后自己写了个查询的组件,也比较好看了些 

在Vue中获取iframe嵌套页面DOM元素,需要考虑iframe是否加载完成以及是否存在跨域问题。以下是一些具体的方法: #### 同域情况下获取iframe内的DOM元素 当iframe的源和当前Vue页面处于同一域名下时,可以在iframe加载完成后,通过 `contentWindow` 或 `contentDocument` 来访问其内部的DOM元素。 ```vue <template> <div> <iframe id="displayPdfIframe" :src="pdfUrl" width="100%" ref="pdfframe"></iframe> </div> </template> <script> export default { data() { return { pdfUrl: 'your-pdf-url.pdf' }; }, mounted() { const vm = this; const iframe = document.getElementById('displayPdfIframe'); iframe.onload = function() { vm.iframeWin = vm.$refs.pdfframe.contentWindow; console.log(vm.iframeWin); // 获取iframe内的DOM元素 const innerElement = vm.iframeWin.document.getElementById('inner-element-id'); console.log(innerElement); }; } }; </script> ``` #### 跨域情况下获取iframe内的DOM元素 如果存在跨域问题,直接访问iframe的 `contentWindow` 或 `contentDocument` 会受到浏览器的同源策略限制。可以通过 `postMessage` 进行跨域通信,在iframe内部页面和外部Vue页面之间传递数据。 - **外部Vue页面**: ```vue <template> <div> <iframe ref="iframe" id="iframe" :src="fromUrl"></iframe> </div> </template> <script> export default { data() { return { fromUrl: 'your-iframe-url' }; }, mounted() { window.addEventListener('message', (e) => { if (e.origin === 'https://your-iframe-origin') { console.log('Received data from iframe:', e.data); // 处理从iframe传来的数据 } }, false); const iframe = this.$refs.iframe; iframe.contentWindow.postMessage('Request DOM data', 'https://your-iframe-origin'); } }; </script> ``` - **iframe内部页面**: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>IFrame Page</title> </head> <body> <div id="inner-element">This is an inner element</div> <script> window.addEventListener('message', (e) => { if (e.origin === 'https://your-vue-origin') { const innerElement = document.getElementById('inner-element'); const elementData = { text: innerElement.textContent }; e.source.postMessage(elementData, e.origin); } }, false); </script> </body> </html> ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值