プロが教える店舗&オフィスのセキュリティ対策術

~JavaScript~
var sub = window.open(~);

if (sub.document.getElementById("Id") != null) {
 // IE
} else {
 // ChromeまたはFirefox
 sub.onload = function() {
  // A処理
 }
}

「window.open」で開いた子画面から上記の処理を実行しています。
IE、Chromeでは正常に処理が実行されますがFirefoxだと処理が実行されず「A処理」が実行されません。
分岐の中には入りますが「sub.onload」の中に入りません。
無限ループの中で「readyState=="complete"」の場合にループを抜ける処理も試しましたが
ループから抜けませんでした。
どうすれば処理が実行されるのでしょうか。

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

  • 文字数制限のため追加で書きます。
    省略部分は以下の内容です。2か所共です。

    if (id == 'a') {
    sub.document.getElementById('ccc-a').style.display = '';
    sub.document.getElementById('ccc-b').style.display = 'none';
    } else {
    sub.document.getElementById('ccc-a').style.display = 'none';
    sub.document.getElementById('ccc-b').style.display = '';
    }

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

A 回答 (3件)

いろいろ試してみましたが、結構めんどうな案件ですね



結論からいえば、ccc.htmlが自らonloadで制御しないと無理そうです。
ただしccc.htmlが自分自身の属性を知るためにはbbb.htmlから
パラメータを渡さなくてはいけないので、hrefのsearchかhashで処理してください

参考までに
//aaa.html
<script src="test.js"></script>
<a href="#" onclick="return bbbOpen();">bbb</a>

//bbb.html
<script src="test.js"></script>
<a href="#" onclick="return cccOpen('a');">ccc-a</a>
<a href="#" onclick="return cccOpen('b');">ccc-b</a>

//ccc.html
<script src="test.js"></script>
<script>
window.onload=function(){cccLoad();}
</script>
<div id="ccc-a">あああ</div>
<div id="ccc-b">いいい</div>

//test.js
function bbbOpen() {
window.open('bbb.htm','bbb','width=300,height=200');
return false;
}
function cccOpen(v) {
window.open('ccc.php?flg='+v,'ccc','width=300,height=200');
return false;
}
function cccLoad() {
var s=location.search;
if(s.indexOf("?")==0){
if(s.match(/a$/)){
document.getElementById("ccc-a").style.display="";
document.getElementById("ccc-b").style.display="none";
}else if(s.match(/b$/)){
document.getElementById("ccc-a").style.display="none";
document.getElementById("ccc-b").style.display="";
}
}
}
※チェックが超てきとーなので、しっかりやるためにはsearchからflagの内容を
抜き出して、整合性のチェックをする必要があります
    • good
    • 0
この回答へのお礼

できました。ありがとうございます。
ただ色々と面倒な感じはします。
サーバーの処理で出来るのならそちらに変えたほうが楽ですかね。

お礼日時:2015/10/28 21:36

>サーバーの処理で出来るのならそちらに変えたほうが楽ですかね。



私もそう思います
サーバー側の処理ならgetでもセッションでもクッキーでも好きな方法でいけるでしょう

ただbbbからcccを呼び出すとき再読み込みをさせないようにすれば
2回目以降の呼び出し時にはダイレクトに子ウィンドウを操作できるはずです

今回の問題はbbbからcccをwindow.openで開いているため
bbbでcccを操作した後にcccが再読み込みされて打ち消していることだと推測されます。
これはcccの再読み込みのタイミングによって動作が必ずしも一定ではないという
不安定さを含んでいます
    • good
    • 0
この回答へのお礼

他の似たような画面でもおかしい挙動になったりなのでサーバー処理で安定させてみます。

お礼日時:2015/10/29 21:50

前回提示したやつでいけません?


(ちょっと仕様がわからないのでなんといえませんが・・・)

//hoge.htm(仮に自分自身を追加で開いていく)

<script>
function myfunc(){
var sub = window.open("hoge.htm");
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()">
<input type="text" value="" id="Id">
この回答への補足あり
    • good
    • 0
この回答へのお礼

先ほど確認したらIE、firefoxが動きました。chromeは動きません。
3つのブラウザで動かしたいのですが上手くいきません。
ソースは以下です。
※古いまま。制限のため一部省略。

~~~~~aaa.html~~~~~
<html>
<script type="text/javascript" src="./test.js"></script>
<body>
<a href="javascript:void(0)" onclick="bbbOpen()">bbb</a>
</body>
</html>

~~~~~bbb.html~~~~~
<html>
<script type="text/javascript" src="./test.js"></script>
<body>
<a href="javascript:void(0)" onclick="cccOpen('a')">ccc-a</a>
<a href="javascript:void(0)" onclick="cccOpen('b')">ccc-b</a>
</body>
</html>

~~~~~ccc.html~~~~~
<html>
<body>
<div id="ccc-a">あああ</div>
<div id="ccc-b">いいい</div>
</body>
</html>

~~~~~test.js~~~~~
// bbb呼ぶ
function bbbOpen() {
window.open('./bbb.html', 'bbb', 'width=300,height=200');
}

// ccc呼ぶ
function cccOpen(id) {
var sub = window.open('./ccc.html', 'ccc', 'width=300,height=200');

if (sub.document.getElementById('ccc-a') != null) {
// IE
if (id == 'a') {
} else {
}
} else {
// IE以外
sub.onload = function () {
if (id == 'a') {
} else {
}
}
}
}

お礼日時:2015/10/24 00:51

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