- PR -

【JavaScript】onloadイベントの取得について

1
投稿者投稿内容
MM
会議室デビュー日: 2007/07/31
投稿数: 12
投稿日時: 2008-05-19 13:13
JavaScriptに関して以下の質問があります。

● 環境

IE7とFirefox2にて確認を行っています。
しかし、以下のような問題があります。


● 事象

あるウィンドウAから別ウィンドウBをopen関数で開きます。
open関数が返すWindowオブジェクトは変数に保管しておきます。

その際、ウィンドウBのonloadのイベントハンドラを登録しておきます。
つまり、ウィンドウAのスクリプトでウィンドウBのonloadイベントを捕捉したいのです。


var w = window.open(url, "testWindow");
w.onload = testFunc;

testFunc = function() {
・・・
}


しかしながら、ウィンドウB側で再描画した際、このイベントハンドラはコールされませんでした。

これは何かの制約があるのでしょうか?
それとも手順に問題があるのでしょうか?

お気づきの点がありましたら、ご指摘ください。
よろしくお願いいたします。



burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2008-05-19 13:55
window.openを呼んで、ウィンドウBのonLoadイベントが終わってから
イベントハンドラを登録しているからです。
MM
会議室デビュー日: 2007/07/31
投稿数: 12
投稿日時: 2008-05-19 14:12
burton999さん、ご指摘ありがとうございます。

私の理解が間違っているかもしれませんが、ウィンドウBが表示された後、明示的にウィンドウBで再描画(ブラウザでF5押下など)した場合にも、やはりonloadイベントは捕捉できないでしょうか?
(初期表示時のonloadは捕捉できなくても構いません)

よろしくお願い致します。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2008-05-19 14:21
ウィンドウBのonLoadイベントで

opener.ChildLoad(); //ChildLoad()メソッドはウィンドウAに定義

でウィンドウBのイベントを通知することはできそうですね。
他にもスマートな方法があるかもしれませんが、私は知りません。。。
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-05-19 15:11
burton999様の案でも良いと思います。
ただ、ページBは呼出元を考慮しなければならなくなります。

完全にページAだけで完結したいのであれば・・・
コード:
function open_PageB()
{
    w = window.open(); // ブランクページを開く
    w.location = "pageB.html";  // ページBのアドレスを指定
    setTimeout(readStateCheck, 100);  // タイマー作動
}

function readStateCheck()
{
    if( w.document.readyState == "complete" )
    {
        onLoad_PageB();
    }
    else
    {
        setTimeout(readStateCheck, 100);  // 再度タイマー作動
    }
}

function onLoad_PageB()
{
    alert("ページBが読み込まれました。");
}



ブランクページを開いてからURI指定を行っているのは
読み込むタイミングを遅らせる為です。

これは「イベントの捕捉」ではなく「ページ状態の監視」による手法です。

他にもっと良い方法があるかもしれません。
MM
会議室デビュー日: 2007/07/31
投稿数: 12
投稿日時: 2008-05-19 15:24
burton999さん、再度ご指摘ありがとうございます。
くまっちさん、サンプルのご提示ありがとうございます。
大変参考になります。

もう少し私のやろうとしていることを説明いたします。

目指しているのは、自動テストツールの作成です。
自動テストツールは、基本的にJavaScriptで構成するつもりです。
このツールからテストしたい画面を開き、シナリオデータ(これもJavaScriptで記述します)に従って画面項目を設定し、例えばSUBMITを行います。
その結果、表示される画面のDUMPをとり、さらに次のシナリオデータの実行を実施します。これの繰り返しです。
(JMeterでも似たようなことができると思いますが)

この「次のシナリオ実行」のトリガーをテスト対象画面のonloadとして取得したいということになります。
テスト対象画面をiframe上に表示すれば、onloadを捕捉できたのですが、できればテスト対象画面を別ウィンドウにしたいと考えて改造しようとして、以下のような問題に遭遇しました。

もう少しいろいろ試して、無理なようならiframe版ですすめたいと思います。

ありがとうございます。





1

スキルアップ/キャリアアップ(JOB@IT)