概要
DisOpenWinS 4.70[text/plain:12kB] は、サイト側の都合によって新しいウィンドウが勝手に開くことを阻止する Opera 用のユーザスクリプトです。
機能
target 属性による新しいウィンドウを無効にする
target 属性によって新しいウィンドウが開くことを阻止します。
frameset でないページの target 属性は全て無効にします。 frameset のページの target 属性は、存在する frame に設定されている場合のみ有効にし、それ以外は target="_top" にします。 target 属性のフレームがアクセスできないフレーム場合は、 top.document.location で強制的に top フレームを変更します。
window.open による新しいウィンドウを無効にする
javascript の window.open メソッドによって、新しいウィンドウが開くことを阻止します。新しいウィンドウで開かれる予定のドキュメントは現在のウィンドウ上で開きます。
window.open に新しい関数を上書きすることで実現しています。この新しい関数は、返り値に自分自身の window オブジェクトを返します。移動後のドキュメントでは window.opener が取得できません。
ページがすべて読み込まれる前に、 window.open が実行された場合は、新しいページが開いてしまう場合があります。
この機能の注意点
この機能はドキュメントを初めてクリックした時に起動します。その後は、 window.open を利用するブックマークレットなど( Opera Developer Tools など)は正常に動作しないことがあります。その場合は以下のコードをブックマークレットの先頭に挿入すると良いかも知れません。
if(window.openCopy){window.open=window.openCopy.valueOf();window.openCopy=undefined;}
Developer Console なら、以下の通りです。
javascript:(function(){if(window.openCopy){window.open=window.openCopy.valueOf();window.openCopy=undefined;}var ele=document.documentElement.appendChild(document.createElementNS('http://www.w3.org/1999/xhtml','script','script'));ele.src='http://devfiles.myopera.com/tools/developer/8679/devConsole.js';ele.parentNode.removeChild(ele);;})()
form.submit による新しいウィンドウを無効にする
javascript の form.submit メソッドによって、新しいウィンドウが開くことを阻止します。新しいウィンドウで開かれる予定ドキュメントは現在のウィンドウ場で開きます。
更新履歴
- 2006-03-27
- window.open の返り値を document から window に変更した。
- 2006-03-28
- DisOpenWinS 4.11[text/plain:5kB] 公開。
- 主に target 属性のチェックをリンクのクリック時に行うようにした。これにより、読み込み完了前のクリックでも新しいウィンドウは開かないようになった。
- 別サイトへのリンクは _top にしていたのを変更。これにより、自分のサイトのフレームに別サイトを表示してしまうのを防げなくなったが、やむを得ず。
- 2006.03.29
- DisOpenWinS 4.20[text/plain:5kB] 公開。
- seekTargetFrameLoop で、下位フレームの検索でアクセス権のないフレームにアクセスして止まっていたのを修正。
- 2006-10-26
- DisOpenWinS 4.50[text/plain:6kB] 公開。
- Opera 9 系のために、 try~catch 構文を導入。
- 2007-04-14
- DisOpenWinS 4.60[text/plain:8kB] 公開。
- window.open を書き換えるタイミングを、 document の load 時から、 document の click 時に変更。
- 2008年10月14日(火)
- DisOpenWinS 4.70[text/plain:12kB] 公開。
- フレームの検索に frames オブジェクトをしよう。 Opera 9.60 への対応。