#javascript #reactjs #typescript #iframe #react-ref
#javascript #reactjs #typescript #iframe #react-ref
Вопрос:
У меня есть iframe в моем коде React, который я пытаюсь вызвать из родительского. Я создал Ref-Ref для iframe, который подключен к iframe, но я не уверен, как реагировать на функции внутри iframe из компонента React. Вот упрощенный пример:
// App.tsx
import * as React from "react";
import "./styles.css";
interface Props {}
interface State {
iframeRef: React.RefObject<HTMLIFrameElement>;
}
export default class App extends React.Component<Props, State> {
/**
* @inheritdoc
*/
public constructor(props: Props) {
super(props);
this.state = {
...this.state,
iframeRef: React.createRef()
};
}
/**
* @inheritdoc
*/
public render() {
return (
<div className="App">
<h1>In component</h1>
<iframe
ref={this.state.iframeRef}
title={"iframe"}
src={"public/iframe.html"}
/>
<button
onClick={() => this.state.iframeRef.current!.contentWindow!.document!.body!.sayHi()}
>click me</button>
</div>
);
}
}
и вот HTML-код, который вызывается в iframe:
// public/iframe.html
<!DOCTYPE html>
<html>
<body>
in iframe
<script>
function sayHi() {
alert("hello");
}
</script>
</body>
</html>
У меня две проблемы. Я не могу увидеть HTML, определенный в файле src, это просто пустое поле с границей. Другая проблема заключается в том, что когда я нажимаю кнопку, я получаю сообщение об ошибке _this2.state.iframeRef.current.contentWindow.document.body.sayHi is not a function
, которое имеет смысл, потому что я не уверен, как ссылаться на функцию, определенную в файле iframe src.
Как я могу заставить iframe отображать содержимое файла src? И как я могу получить доступ к функциям, определенным в iframe, на которые я ссылаюсь?
У меня есть эта песочница, с которой я играл
Ответ №1:
Я понял это самостоятельно. Проблема была немного не связана с тем, что я ожидал, но я опубликую на случай, если кто-нибудь еще столкнется с этой проблемой. Ввод public/iframe.html
приводил к тому, что он не находил файл, и мне нужно было установить src={iframe.html}
, и я не понял public
, что это местоположение по умолчанию для поиска этих файлов. Кроме того, вызов функции, которая находится внутри html, должен быть onClick={() => this.state.iframeRef.current!.contentWindow!.sayHi()}
.