質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

iframe

HTMLのタグ<iframe>です。<iframe>は、ドキュメント内に""inline frame""を作るHTML要素で、同じページでセパレートしているドキュメントが表示されるようにします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

2回答

8583閲覧

reactでiframeの要素を取得したい

otaaa

総合スコア19

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

iframe

HTMLのタグ<iframe>です。<iframe>は、ドキュメント内に""inline frame""を作るHTML要素で、同じページでセパレートしているドキュメントが表示されるようにします。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/10/20 16:16

前提・実現したいこと

next js (typescript)でiframeの要素を取得して、scrollHeightを設定できる様にしたいです

発生している問題・エラーメッセージ

reactだとcontentDocumentが使えないため、どの様にIframeの要素を取得すればいいかわからないです

該当のソースコード

js

1 2export const Test: NextPage<Props> = () => { 3 4const iframe = document.getElementById("iframe"); 5const scrollHeight = iframe.contentDocument.documentElement.scrollHeight; 6return ( 7 <iframe 8 width='100%' 9 id='iframe' 10 src='test' 11 ></iframe> 12); 13};

試したこと

このサイトを参考にして、

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

この様にしましたが、取得できませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

以下の様にHTMLIframeElementにキャストしたらできました

export const Test: NextPage<Props> = () => { useEffect(() => { const iframe = document.getElementById("iframe") as HTMLIframeElement; const scrollHeight = iframe.contentDocument.documentElement.scrollHeight; }, []) return ( <iframe width='100%' id='iframe' src='test' ></iframe> ); };

投稿2020/10/25 14:45

otaaa

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Reactでは、コンポーネント内の変数はレンダリング前に定義されるため、質問者さんが試したように要素を取得することはできません。

関数コンポーネント利用時のマウント後の操作を定義する場合は useEffect を使います。
質問者さんの例に習うと、以下のソースコードで取得できるかと思います。

TypeScript

1export const Test: NextPage<Props> = () => { 2 useEffect(() => { 3 const iframe = document.getElementById("iframe"); 4 const scrollHeight = iframe.contentDocument.documentElement.scrollHeight; 5 }, []) 6 7 return ( 8 <iframe 9 width='100%' 10 id='iframe' 11 src='test' 12 ></iframe> 13 ); 14};

ただし、useEffect 内で定義された変数 scrollHeight は useEffect 外で使うことはできません。
この後やりたい処理がどのようなものなのか分かりませんが、useEffect 内で完結できるような処理であればこちらで問題ないと思います。

投稿2020/10/21 00:31

nerianighthawk

総合スコア544

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otaaa

2020/10/21 02:41

ご回答していただきありがとうございました。 useEffectを使ってみましたが、contentDocumentが使えず、 「プロパティ 'contentDocumentが' は型 'HTMLElement' に存在しません」 となります。 他の解決方法がありましたら、教えて頂けないでしょうか?
maisumakun

2020/10/21 02:43

> 「プロパティ 'contentDocumentが' は型 'HTMLElement' に存在しません」 HTMLIframeElementにキャストしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問