当前位置: 首页 > 面试题库 >

在ReactJS中将iframe的高度设置为scrollHeight

倪德业
2023-03-14
问题内容
  • 与传统的静态HTML相反,由于其动态生成的组件结构和事件模型,因此无法在React中使用该问题的典型解决方案:

脚本:

<script>
  function resizeIframe(obj) {
    obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
  }
</script>

的HTML:

<iframe src="..." frameborder="0" scrolling="no" onload="resizeIframe(this)" />
  • 有一个NPM包react-iframe,但看起来没有完成(只接受道具urlwidthheight):

https://www.npmjs.com/package/react-
iframe

  • 解决方案的可能部分是监听的load事件iframe,但以与React兼容的方式进行。

React中有没有一种方法可以将an iframe的高度设置为其可滚动内容的高度?

我的代码:

import React, { Component } from 'react'
import ReactDOM from 'react-dom'
import Iframe from 'react-iframe'

export default class FullheightIframe extends Component {

    componentDidMount() {
        console.log("IFRAME DID MOUNT");
    }

    renderReactFrame() {
        return (
            <Iframe url="http://www.example.com" width="100%" height="100%" onLoad={()=>{console.log("IFRAME ON LOAD")}}></Iframe>
        );
    }

    renderHTMLFrame() {
        return (
            <iframe 
                onLoad={(loadEvent)=>{
                    // NOT WORKING var frameBody = ReactDOM.findDOMNode(this).contentDocument.body; // contentDocument undefined
                    // NOT WORKING obj.nativeEvent.contentWindow.document.body.scrollHeight // contentWindow undefined
                }} 
                ref="iframe" 
                src="http://www.example.com" 
                width="100%" 
                height="100%" 
                scrolling="no" 
                frameBorder="0"
            />
        );
    }

    render() {
        return (
            <div style={{maxWidth:640, width:'100%', height:'100%', overflow:'auto'}}>
                {this.renderHTMLFrame()}
            </div>
        );
    }
}

问题答案:

您要做的是在您的componentDidMount中,运行脚本来设置高度。[如果要加载外部内容,则可能要在IFrame上添加事件侦听器,以等待加载外部内容。

   componentDidMount() {
       const obj = ReactDOM.findDOMNode(this);
       obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
    }

还有另一种更“反应”的方式-将高度存储在状态中。

   componentDidMount() {
       const obj = ReactDOM.findDOMNode(this);
       this.setState({iFrameHeight:  obj.contentWindow.document.body.scrollHeight + 'px'});
    }

然后在您的渲染器中:

render() {
    return (
        <div style={{maxWidth:640, width:'100%', height:this.state.iFrameHeight, overflow:'auto'}}>
            {this.renderHTMLFrame()}
        </div>
    );
}


 类似资料:
  • 问题内容: 我想使一个组件占据Container的maximumAvailableHeight。例如,在下面粘贴的代码中,我将根框架定为800,600。我只想设置该框架的高度/宽度(并且我不想尝试对其子像素进行像素化)。如果运行此命令,则会看到UI对齐不良。 首先,我希望面板(位于根框架内)占据框架的100%的高度(在这种情况下,为800px减去用于绘制框架标题的空间)。 其次,在面板内部,我有一

  • 问题内容: 所有浏览器均支持iframe height = 100%吗? 我使用doctype作为: 在我的iframe代码中,如果我说: 我的意思是说,它实际上会占用其余页面的高度吗(因为顶部还有另一个固定高度为50px的框架),所有主流浏览器(IE / Firefox / Safari)都支持吗? 关于滚动条,即使我说了,我也可以在Firefox中看到禁用的滚动条…如何完全隐藏滚动条并自动设置

  • 问题内容: 呈现HTML SELECT时,IE似乎忽略了CSS中设置的高度。是否有任何解决方法,还是我们必须接受IE不会像其他浏览器那样好? 问题答案: 除了放弃元素之外,没有其他解决方法。

  • 问题内容: 我有三分之二的div。所包含的div之一向左浮动,另一个向右浮动。我希望2个同级div始终处于相同的高度,但是对此存在问题。到目前为止,我只在Firefox中查看该页面,并认为在至少一个浏览器中运行它后,我会担心任何跨浏览器的问题。 这是标记: 这是CSS: 如果中的内容长于,则不会扩展为匹配。在我尝试了一个例子,说的Firefox的计算式的高度是,的计算式的高度是和的计算的风格高度为

  • 我不使用GUI编辑器手动创建布局,我需要将高度设置为“自动”,以便用户可以看到整个表单。我将GridLayout包装到FlowLayout中,这样输入就不会被拉伸。创建这样的布局的最佳实践是什么。是否有人可以修改它,使整个表单可见或使用GridLayout,但可以设置表单中输入的宽度和高度? 未使用包装方法设置首选尺寸 使用包装方法设置首选尺寸 将扩展状态设置为最大化,但更新按钮不完全可见。如何设

  • 问题内容: 我是角度新手:-)我只是想将一个div的尺寸设置为另一个,请给予任何帮助。 在控制器中,我添加了: 返回宽度和高度,但未应用 问题答案: 我已经为您的问题创建了解决方案。首先,我将向您解释我做了什么以及为什么这样做。 Angular中的一项基本准则是,应避免在控制器中处理div等DOM元素,而应在指令中执行与DOM元素有关的大多数操作。 指令允许您将功能绑定到特定的dom元素。在这种情