base targetの落とし穴

メニューやリストに「<base target="_blank">」や「<base target="text">」を指定することがある。
これをJavaScriptと組み合わせる時に想定外のトラブルに遭遇することがある。

これが顕在化したのはWindows 8.1のIE Ver.11からである。それより前にはこのトラブルは出なかったように思う1)
NOTES
1) Windows8 をさわっていたのは4ヶ月間ぐらいしかなかったので記憶は定かではない。

もっとも、タグの厳格解釈という点から見れば当然こうなってもしようがないだろう。緩々だった昔がなつかしい(笑)。


base target="_blank"の問題点

これはtopic3.htmlについて実際に起こったトラブルである。

SAMPLE
<base target="_blank">

この設定があるときに、mscr系のスクリプトで下記の記述をするとトラブルが起こる。

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

こうすると、本来想定していたファイルのほかに、自分のファイルも「_blank」ウインドウに呼び出すことになる。
このトラブルを防ぐために、呼び出し元で「<base target="_blank">」の指定を削除しておく必要がある。

この例からわかることは、「event.returnValue = false;」は、Aリンク本来の「動作」は無効にするが、クリックされたという「事実」までは帳消しにするものではないということである。
  1. Aリンクの動作はしない(ページは表示されない)。
  2. しかし、クリックされたから「<base target="_blank">」によって「#」ページ(すなわち自分のページ)が表示されることになる。
    さらに、「window.open(cmd,"_blank");」によって想定したウインドウがオープンされることになる。
ということは、「<base target="_blank">」がないページ、たとえば「本の落書き」などでも同様の現象が起こっていることになる。その場合は「<base target="_blank">」がないからそういうトラブルは起らなかっただけである。
その場合でも「#」ページが表示されているがボーッと見ているだけでは気がつかない。ページのトップに現在位置が移動して、それが見えた後に、指定のページが表示されているはずである。

ちなみに、この「本の落書き」ページでも「<base target="_blank">」を入れると、topic3.htmlと同様のトラブルが発生する(当然)。

重要
「<base target="_blank">」があるページでは「window.open(cmd,"_blank");」を使うな。
「window.open(cmd,"_blank");」を使う場合は「<base target="_blank">」を使うな。

「window.open(cmd,"_blank");」は「window.open(cmd);」であっても同様の結果になる。「"_blank"」の指定は意味がない。この指定があってもなくても新規にウインドウがオープンされることになる。
なお、これに対して「"_self"」の指定は有効である。呼び出し元ウインドウに表示される(内容が入れ替わる)。


base target="text"の問題点

上と類似・同様の現象はbk4セクションのメニューやリストでも起こる。
これはp1_lis.htmlやp2_listについて実際に起こったトラブルである。同じパターンはn_hta.htmlなどでも起こる。

表示ウインドウを次のようにしている場合。
SAMPLE
<base target="text">

menu2.js内で下記のようにしていると、本来想定していたページのほかに「#」ページ(すなわち自分のページ)が表示されてしまう。
SAMPLE
window.open(cmd,"text");

結果的には、このスクリプトが動作していないような感じになる。

重要
「base target」を指定する場合、JavaScriptの記述とバッティングする危険があることに注意せよ。
JavaScriptに記述がある場合は「base target」の指定ははずせ。


通常のページ

「<base target="_blank">」や「<base target="text">」の指定は通常のページではやっていない。メニューやリストに特有の指定である。

しかし、通常のページではWindows8.1のIE Ver.11になる前は、カーソルのポジションはクリック位置にとどまっていた。このバージョンになってカーソルのポジションは先頭位置に移動するようになった。「#」ページ(すなわち自分のページ)を表示しているわけである。

この点では、やはり改悪退化である。以前の方が作成者側の想定にフィットする動作だった。


検討

しかし、考えてみれば、こんな「細工」をする必要があったのかどうかは検討しておくべき問題である。

これは下記の目的を実現するための方策である。
  1. トピックのリストやメニューを見せ、クリックすれば内容は見える。
    人が現実にクリックすることは問題はない。ワームやロボットがURLを取得するのを防止するためである。
    これはその必要性がある。
    inet系で生ログを引用しているページに多用している。

  2. トピックのリストやメニューは見せるが、内容は見せない。
    要するに、検索エンジンから人を呼び込むだけの「客寄せパンダ」である。「枯れ木も山のにぎわい」にするためである。
    せいぜい何をクリックしたかを知って参考にする程度である。
    公開領域に置いたプログラミング系で多用している。

- 2013/11/18 -




想定外の血迷ったエクセルバカである。
LOG
61.125.133.67 [22/Aug/2018:17:16:45] tpc_0171 BASE target=_self ie VBA
「VBA」などが出てくるところがなんとも不可解でハチャメチャなところである。


ゴミOSWindows 8.*にまつわるトラブル
  1. 中途半端なWindows 8パソコン(No.0115)
  2. target="_blank"の問題点(No.0123)
  3. すぐに壊れるOfficeシリーズ(No.0124)
  4. 改悪退化のバグシステムとバグソフト(No.0147)
  5. 改悪退化を突っ走るWindows8.1(No.0162)
  6. Windows8.1での項目のサイズ(No.0163)
  7. メタボ化と絵本化が同時進行のWindows8.1(No.0164)
  8. Windows8.1の互換性のトラブルシューティング(No.0166)
  9. 改悪退化のWindows8.1補遺(No.0169)
  10. base targetの落とし穴(No.0171)
  11. Windows8.1と*.chmの文字サイズ(No.0174)
  12. WinHelpとWindows8.*(No.0187)
  13. ゴミソフトIEのバグ(No.0202)
  14. 闇の中の自動アップデート(No.0210)
  15. 改悪退化の極め付け/終了ボタンが押せない(No.0223)