プロが教えるわが家の防犯対策術!

~JavaScript~
var sub = window.open(~);
sub.document.getElementById("Id").value = "test";

~html~
<input type="hidden" name="Id" id="Id" value="">

上記ソースは省略していますが上記のように記載しています。
子画面を開かずに実行すると「sub.document.getElementById("Id")」がnullになってしまいます。
子画面を開いたままだとnullになりません。
FireFoxのみで、IEだとnullになりません。
これは記載の誤りでしょうか?

質問者からの補足コメント

  • 質問が不足していました。
    子画面に値を渡したいのですがfirefoxだと「getElementById("Id")」がnullになるため値を渡せません。
    if(sub)を入れましたがエラーが出なくなるだけで値が渡せないままです。
    どうすれば値が渡せるのでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/10/15 10:11

A 回答 (3件)

ああ・・・なんとなくわかりました。


setIntervalでチェックするとうまくいくかも

<script>
function myfunc(){
var sub = window.open("子ページ");
var timerId=setInterval(function(){
if(sub.document.getElementById("Id")!=null){
sub.document.getElementById("Id").value = "test";
clearInterval(timerId) ;
}
},100);
}
</script>

<input type="button" value="open" onclick="myfunc()">
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
何とか自力で解決することができました。
以下で進めてみようと思いますが、もし何かある場合は参考にさせていただきます。

if (sub.document.getElementById("Id") != null) {
 // 値設定
} else {
 sub.onload = function() {
  // 値設定
 }
}

お礼日時:2015/10/15 20:56

動作をキチンと確認していないので、申し訳ありませんが・・・



window.openで新しいドキュメントを読み込んでいますので、その読み込みに要する時間と、getElementByIdでスクリプトから要素を取得しようとするタイミングとが逆転していると(まだ読込終了していないと)、要素を取得できないことになりそうです。

ANo2様の回答は、少し時間を置いて(=読み込んでから)、処理を行うようにしようという試みかと推測します。
実際の読込時間は環境に依存しますので、読込状況を確認して処理をするのが良いかも知れません。
https://developer.mozilla.org/ja/docs/Web/API/Do …


イメージとしてこんな感じ?
var doc = sub.document;
if(doc && doc.readyState=="complete") Func(); else sub.onload = Func;
//Funcは実際の処理を行う関数

あるいは、readyState=="complete"になるまでwhile等で待つとか・・・
(この場合は、タイムアウトを設定しておいた方が良いですが・・・)
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
No.2に自力で解決した方法を記載しました。
ドキュメント読み込み終了後でなければ取得できないようなので
回答と同じくonloadを使用しました。

お礼日時:2015/10/15 20:59

>子画面を開かずに実行すると



if(sub){
sub.document.getElementById("Id").value = "test";
}
など最低限のチェックをいれてみてはいかがでしょうか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!