当前位置: 首页 > 知识库问答 >
问题:

vue.js - vue3+electron 动态插入 iframe 如何自适应高度?

龙飞文
2024-05-04

我在做一个需求,是需要从 electron 后台获取到 html 路径,之后动态创建 iframe 插入到编辑器
目前代码如下:

ipcRenderer.on("h5-iframe", (event, arg) => {  let iframe = document.createElement('iframe');  iframe.src = arg;  iframe.width = '100%';  iframe.src = arg  console.log(1, iframe.contentDocument) // 1 null  console.log(2, iframe.document) // 2 undefined  iframe.addEventListener('load', (event) => {    console.log(3, iframe.contentDocument)    console.log(4, iframe.document)  })  iframe.onload = function () {    console.log(5, iframe.contentDocument)    console.log(6, iframe.document)  }  let div = document.createElement('div');  div.appendChild(iframe);  let iframeHtml = div.innerHTML;  tinymce    .get(tinymceId.value)    .execCommand(      "mceInsertContent",      false,      iframeHtml    );});

但得到的结果是如下,导致无法获取内容计算高度

console.log(1, iframe.contentDocument)null

console.log(2, iframe.document)undefined

frame.addEventListener('load', (event) => {})iframe.onload = function () {} 均无任何反馈

已知 arg 可以正确返回,
且页面可以正常插入显示,所以应该也不是跨域问题


请问如何解决?万分感谢!

共有2个答案

商茂勋
2024-05-04
ipcRenderer.on("h5-iframe", (event, arg) => {  const iframe = document.createElement('iframe');  iframe.src = arg;  iframe.style.width = '100%';  const editorContent = document.getElementById('editor-content');   editorContent.appendChild(iframe);  iframe.onload = function () {    // 获取高度并调整    const height = iframe.contentWindow.document.body.scrollHeight;    iframe.style.height = `${height}px`;  };});

或者用 MutationObserver 监听 iframe 里面 DOM 变化:

function adjustIframeHeight(iframe) {  const height = iframe.contentWindow.document.body.scrollHeight;  iframe.style.height = `${height}px`;}ipcRenderer.on("h5-iframe", (event, arg) => {  const iframe = document.createElement('iframe');  iframe.src = arg;  iframe.style.width = '100%';    const editorContent = document.getElementById('editor-content'); // 确保这个元素存在  editorContent.appendChild(iframe);  iframe.onload = function () {    adjustIframeHeight(iframe);    const observer = new MutationObserver(() => adjustIframeHeight(iframe));    observer.observe(iframe.contentDocument.body, { childList: true, subtree: true });  };});
段恩
2024-05-04

您好!

在 Electron 中,由于同源策略的限制,iframe 的 contentDocument 和 document 属性可能无法直接访问,尤其是在 iframe 加载的内容与主页面不同源时。

为了解决这个问题,您可以尝试以下方法:

  1. 监听 iframe 的 'load' 事件
* 正如您已经尝试过的,您可以通过监听 iframe 的 'load' 事件来获取其内容。但请注意,由于同源策略的限制,您可能无法直接访问 iframe 的 contentDocument 或 document 属性。* 您可以尝试在 'load' 事件回调中,使用 postMessage API 向 iframe 发送消息,然后在 iframe 内部监听这个消息并作出响应。
  1. 使用 postMessage API
* 在主页面中,当 iframe 加载完成后,向其发送一个消息。* 在 iframe 内部,监听这个消息,并作出相应的响应,例如调整高度。

示例代码:

主页面(Electron 主进程):

ipcRenderer.on("h5-iframe", (event, arg) => {  let iframe = document.createElement('iframe');  iframe.src = arg;  iframe.width = '100%';  iframe.addEventListener('load', (event) => {    // 向 iframe 发送消息    iframe.contentWindow.postMessage({ action: 'adjustHeight' }, '*');  });  let div = document.createElement('div');  div.appendChild(iframe);  let iframeHtml = div.innerHTML;  tinymce    .get(tinymceId.value)    .execCommand(      "mceInsertContent",      false,      iframeHtml    );});

iframe 页面:

window.addEventListener('message', (event) => {  if (event.data.action === 'adjustHeight') {    // 调整 iframe 高度    document.body.style.height = '100vh'; // 或其他您希望的高度  }});

这样,即使由于同源策略的限制,您不能直接访问 iframe 的 contentDocument 或 document 属性,您仍然可以通过 postMessage API 与 iframe 进行通信,从而调整其高度。

请注意,上述代码仅为示例,您可能需要根据您的实际需求和场景进行调整。

希望这可以帮助到您!如果您还有其他问题,请随时提问。

 类似资料:
  • 本文向大家介绍js实现iframe自动自适应高度的方法,包括了js实现iframe自动自适应高度的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js实现iframe自动自适应高度的方法。分享给大家供大家参考。具体如下: 在编写网页的时候,很多时候要用到自动伸缩iframe高度 ,假如ifram中嵌入的是一个列表,那么增加数据后,刷新列表,iframe高度会自动伸长。删除数据后,ifr

  • 本文向大家介绍iframe如何自动调整高度?相关面试题,主要包含被问及iframe如何自动调整高度?时的应答技巧和注意事项,需要的朋友参考一下 未跨域时,在iframe中利用他的父窗口对象将本页面的滚动高度设置给iframe的height 跨域时,在iframe中将自己的的滚动高设置在本页面内的一个隐藏于父页面不跨域的iframe的hash值, 在隐藏的iframe中将值取出,同未跨域一样设置到要

  • 我的项目目录如下: 其余 electron 为应用 main.js 主进程存放目录,dist、dist=electron 分别为 vue 的打包目录和 electron 的打包目录 之前我都是将 dist 上传到服务器,后 electron 中通过访问网络地址进行展示操作 但如今客户要求应用本地化,应该怎么做呢? 是将 electron 中的 mainWindow.loadURL() 指向本地 d

  • 本文向大家介绍教你用jquery实现iframe自适应高度,包括了教你用jquery实现iframe自适应高度的使用技巧和注意事项,需要的朋友参考一下 iframe代码,注意要写ID jquery代码一: jquery代码二:

  • 本文向大家介绍jsp页面iframe高度自适应的js代码,包括了jsp页面iframe高度自适应的js代码的使用技巧和注意事项,需要的朋友参考一下 以下操作写在body里面,form表单外 test.jsp如下:

  • 问题内容: 现在,我有一个从外部页面读取的jQuery UI弹出对话框。此页面通过flowplayer从另一个具有视频的外部读取。 我正在使用iframe将视频嵌入到第一个视频中: 100%的宽度似乎没问题,但100%的高度无效。有没有解决的办法? 我在哪里以及如何嵌入代码以及ID内容。请任何人帮忙? 问题答案: 如果要使用100%而不是像素值,则必须使用某种JavaScript来动态调整ifra