QA@IT

IE9以降で、ポストバック時に別ウィンドウが開いてしまう

10151 PV

javascriptの質問です。
 
1)親ウィンドウから、新ウィンドウで入力フォームを表示
  ↓
2)入力フォームsubmit時、
document.フォーム名.target=opener.window.name;
 で、親ウィンドウにPOST
  ↓
3)入力フォーム閉じる

 という動きで、IE8あたりまでは意図通りに動いていました。

 最近IEのバージョンアップをしてから、2の時、親ウィンドウではなく新しくウィンドウを立ち上げて、そこに対してPOSTするようになってしまいました。

 alertなどでウィンドウ名を表示させても、1)の親ウィンドウ名と2)での「opener.window.name;」も同じです。

 どなたか回避方法をご存じの方、ご教示いただけると助かります。

※セクションに
の記述をつけても解決しませんでした。

  • 回答では直してしまいましたが、window.opener.nameの間違いでよろしいですか? -
  • 回答に保護モードについて追記しました。 -

回答

追記しました。

Internet Explorerの保護モードによる動作だとおもいます。
サーバーがイントラ内ではない場合(またはIPアドレスなどでイントラネット思われていない場合)にはデフォルトで保護モードが有効になります。
これによる影響だと思われます。
私もインターネットのサーバーで試してみたら同じ状態になりました(最初はpythonで自端末で簡易サーバー起動してやってました)。

ちょっといい記事がみつかりませんでしたが、以下のあたりでしょうか。
整合性レベル(セキュリティレベルのようなもの)が低い状態で動作しているため、ほかのオブジェクトへのアクセスが制限される。というようです。

Windows Internet Explorer 8 and later. When Protected Mode is enabled and a webpage contains an anchor link with a named target, Windows Internet Explorer opens the target of the link in a new window when the target has a different integrity level than the webpage containing the link. For more information, see Understanding and Working in Protected Mode Internet Explorer.

http://msdn.microsoft.com/en-us/library/ie/ms534659(v=vs.85).aspx

保護モードの Internet Explorer の理解と機能
http://msdn.microsoft.com/ja-jp/library/bb250462(v=vs.85).aspx

サーバーがイントラネット上であるにもかかわらずインターネットとして認識される場合はイントラネットの設定で
アドレスを追加されると良いでしょう。
インターネットサーバーの場合は セキュリティリスクを理解したうえ で信頼済みサーバーに登録するのかな。

追記ここまで


以下のHTMLで実験しましたが、IE10 (Win8), IE9 (Win7) 共に期待通り動作しました
(= sub.htmlのsubmitで index.htmlのほうが更新される)

index.html

<html>
<body>
<h1>target page</h1>

<form>
<input type="button" value="open input" onclick="window.open('sub.html',
  'Sample','toolbar=no,width=380,height=190,left=500,top=200,  status=no,scrollbars=no,resize=yes');return false;">
</form>
<script>
window.name="parent_window";
</script>
</body>
</html>

sub.html

<html>
<body>
<h1>input page</h1>

<form method="get" onsubmit="document.forms[0].target=window.opener.name;">
  <input type="text" name="value1" value="hoge">
  <input type="submit" value="submit">
</form>

</body>
</html>

何か違い、気になるところはありますか?

私が気になったのはターゲット書き換えのタイミングですが、どこで行っていますか?
あとは alert呼ぶと強制再描画が入って内部の状態が変わる可能性があるので、できるだけwindow.statusなどで確認される事をお勧めします。

編集 履歴 (3)
  • ソースまで有難うございます。
     殆ど同じソースしたので、いただいた分をそのままコピーしてサーバにアップして使ってみたのですが、やはり新しいウィンドウが開いてしまいました。

     win8のIE10と、win7のIE10です。

     関係ないと思いつつ、タブブラウズを無効にしても変わらず・・・
     困りました。

     alertの件知りませんでした。有難うございます!
    -
  • ちなみに javascriptによる書き換えではなく、formのtarget属性に直接指定していてもだめですか? -
  • ありがとうございます。
    サブウィンドウの方を
    <form method="get" target="parent_window">
     としても、同じです。。
    -
  • 保護モードとセキュリティレベルの件でも、現在「信頼済サイト」に登録していて、信頼済サイトの「保護モードを有効にする」のチェックも外した状態になっているのです。

     変わらず新しいウィンドウが開いてしまいます。
    -
  • なぜか普通に動作するようになってしまった(再現しなくなってしまった)ので確認できないのですが、インターネットゾーンのセキュリティレベルのカスタマイズで「異なるドメイン間のウィンドウとフレームの移動」を有効にした場合どうなるでしょう?信頼済みサイトでも無効でイントラネットだと有効なので気になりました。 -
  • ありがとうございます。
     すみません、早めにご返信いただけていたのに追記がないないと思い込んで返信が遅れてしまいました。
     セキュリティレベル画面内、セキュリティ設定の「その他」の部分、異なるドメイン・・・を有効にするあたりも含めて、有効にしているのですが、別ウィンドウが開いてしまうのです
    -
  • いえ、こちらに書くと通知がいかないんですよね(私には来ますが)。あまり自信のある回答でもなかったので…。
    ローカルマシンのwebサーバーで試せるのであれば、それの結果も知りたいです。あとはウィルス対策ソフトの影響もあるかもしれませんね。ウチで再現しなくなった原因がわかれば何かわかるかもしれないのですが…。
    -
  • ええええ!!!こちらでも再現しなくなりました!!
    再起動も何回もしてるし、治ったのは良いけど釈然としません・・・IEもう使わないでおこうかなとも思ったのに・・・

     午後からでも、検証やってみます。また報告します。
     今度は再現しなくなったり・・・
    -
  • 検証をしようとブラウザの設定をリセットして、セキュリティレベルも規定に戻して、別ウィンドウで開く事を確認後、開始。

     なんでもOKのゆるゆるにして、保護モードも無効にして、セキュリティソフト(エッセンシャル)を切って再起動して・・・

     ・・・・・・「再現しない」が再現しなくなってしまいました。
     新しいウィンドウ開きまくりです・・・引き続き触ってみます
    -
  • 多分ブラウザ設定のリセットなのかなぁと思いながら、帰ったら試してみます(キャッシュ消せば戻るかなぁとか思ってたんですけどね) -
  • いろいろ試した結果、一度だけ再現する(新しいウィンドウで開いてしまう)ようになりましたが、何回か試しているうちに(設定は変えてませんが)再現しなくなってしまいました。なんだかSmartFilterとかそのあたりも絡んでそうでいやな挙動ですね。 -
  • SmartFilter→SmartScreenフィルターでした。あとはInprivateブラウズでも再現はしませんでした。海外掲示板でも探してるんですけどこれだっていう原因が見当たらないんですよね…。 -
  • ありがとうございます。
     検証前の、新しいウィンドウが開かなくなる状態(正常動作)でインターネットオプション画面のスクショを取って、その通りに設定直してもダメでした。

     ポストバック出来ないのって結構大きな問題だと思うんですけど、なんで情報がないんだろう?
    -
  • http://forums.phpfreaks.com/topic/138971-formtarget-windowopener/ で I've already found a solution and it's pretty simple とかいってたけど? -
  • targetに対してwindow.openerオブジェクト突っ込んでいる事例が、nameを設定するようにして解決ですので今回のとは違いますが、子ウィンドウから親ウィンドウのnameを再設定してみるというのはアリかもしれませんね。それで直っても依然としてアレですが。 -
  • > スクショを取って、その通りに設定直してもダメでした。 私も設定変えたつもりがないのに再現しなくなったりしたので、それでSmartScreenあたりが怪しいと思っています。問題ないサイトと認識されるまで挙動が異なるとか(まったくの当てずっぽうです)。 -
  • ありがとうございます。
    数台で試していたのですが、絶対に設定を触っていないと言い切れる放置PCでPOSTBACKが上手くいくようになりました。

     SmartScreenについて調べてみます
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。