DOM

【JavaScript】ブラウザの新規タブを開く方法と読み込み完了を待ってDOM参照する方法

更新日:2023/04/11

JavaScriptでブラウザの新規タブを開いてWebページを読み込む方法と、読み込み完了を待って、開いたWebページからのDOMなどの情報取得する方法を紹介します。

 

新規タブを開く

まずは、ブラウザの新規タブを開いてurlを読み込む方法から紹介します。

window.open()で開く

window.open()を使用します。

新規タブを開いてurlを読み込む

window.open( url , "_blank");

引数は次のようになっています。

  • 第一引数: url
  • 第二引数: target属性

target属性は、aタグのtaget=""に指定する値です。
上記のコードは"_blank"を指定しているので、新規タブを開きます。

新規タブを開くだけの場合

新規タブを開くだけでurlを読み込まない時は、urlに空文字("")を指定します。

新規タブを開くだけ

window.open( "" , "_blank");

タブを再利用する場合

新規で開いたタブを再利用したいときは、2番目の引数に定義済みキーワード("_blank"など)とは異なる文字列を名前として指定します。

初回は、新規タブが表示されurlが読み込まれます。
再度同じ名前で呼び出すと、同じタブにurlが読み込まれます。

新規タブを再利用する

const tabName = "newtab1";
window.open( url , tabName ); // 新規タブが表示されurlが読み込まれる

window.open( url2 , tabName ); // 同じタブにurl2が読み込まれる

 

新規タブの情報を得る

window.open()の戻り値を参照すると、新規タブの情報を取得できます。

const newTab = window.open( url , "_blank");

  // urlの読み込みを待つ

console.log( newTab.document.title ); // タイトル取得

戻り値のdocumentプロパティを使用すると、新規タブのDOM要素にアクセスできます。

ただしcross-originポリシーの制限があるので、情報を参照するには同じドメインに属性している必要があります。
他のドメインのWebページを操作するなどの目的で使用できないようになっています。

これができてしまうと、リンク先を書き換えて詐欺サイトに誘導することなどができてしまうので仕方がないですね。

 

表示されるまで待つ

新規タブに読み込んだWebページの情報を得るには、読み込み完了を待つ必要があります。
そこで次のようなコードを作成しました。

新規タブを開いてurl読み込み完了を待つコード

window.openNewWindow = (()=>{
        // 同一オリジンポリシーのチェック
    const checkNewWindow = newWindow =>{
        try{ // 例外を発生させる
            const a = newWindow.document; 
        }catch(e){
            return e.message; 
        }
        return false;
    };
        // 指定ミリ秒数のスリープ
    const sleep = waitTime => new Promise( resolve => setTimeout(resolve, waitTime) );

        // 新規タブを開いて読み込み完了まで待つ
        // return { window:新規ウィンドウ , error: false またはエラーメッセージ}
    return async (url,target="_blank") =>{

        const newWindow = window.open( url , target);
        const error = checkNewWindow(newWindow);
        if( error !== false ) return {window:newWindow,error:error};

            // 読み込み完了まで待つ
        do{
            if( newWindow.document.readyState === "complete" ) break;
            console.log(newWindow.document.readyState);
            await sleep(500 ); 
        }while( newWindow.document.readyState !== "complete" );

        return {window:newWindow,error:false};
    };

})();

これで、window.openNewWindow()というメソッドが定義されます。
このメソッドは、第一引数に指定したurlを指定します。
すると、新規タブを開いてurlが読み込まれるのを待ちます。

戻り値は次のようなオブジェクトです。

{ window : window.open()戻り値 , error : falseでない時エラーメッセージ }

次のように、async関数内で使用します。

const func = async ()=>{

     ・・・何らかの処理

    const result= awiat window.openNewWindow(url);
    if( result.error !== false ){
        console.error( result.error );return;
    }
    console.log( newTab.document.title ); // タイトル取得

};
func();

更新日:2023/04/11

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。