Default
Google

Acquiring from ProHosting Banner Exchange

"window.open()"対策

DreamPassportでウェブサイトを閲覧していると、時々、リンクをクリックしてもジャンプ出来ない事があります。

その時ステータスバーに表示されるリンク先URLが、"#" だったり、"javascript:xxx()" だったりする場合、window.open() によってリンク先を表示する仕組みになっている事が多い様です。

残念な事にDPでは window.open() が使えません。
『ジャンプ』で javascript:alert(open) を実行すると "[native code]" と表示されるので、一見 openメソッドが存在する様に見えますが、実際には中身は無いのでしょう。

しかし、対応策はあります。使えないなら書き替えてしまえば良いのです。

javascript:open=new Function('u','location=u;return self')
これを『ジャンプ』で実行すると、window.open(URL, ...) が実行された時に URLへジャンプする様になります。return self は、
win=window.open('',winName,features);
win.location=URL;
に対応する為です。実はDPでは、new Function() で作成された関数に return文が無いと、勝手に window(=self) が返るのですが、バグっぽいので return self を付けて置きます。

open関数の書き替えは出来ましたが、これだけでは
<a href="#" onClick="xxx()">
の様に書かれている場合 "#" へジャンプしてしまいます。

そこで、"#" の後に何も書かれていないリンクは onClick="..." がメインであると予想できるので、その様なリンクを探して href の値を(なにも起こらない) "javascript:" に書き替えます。

javascript:open=new Function('u','location=u;return self');new Function('var i,l=document.links;for(i in l)if(l[i].hash.length==1)l[i].href="javascript:"')()
変数名が、元々そのページで使用されている物と重複すると具合が悪いので、new Function('...')() を使用して、変数をローカルにして、なおかつ、関数自体にも名前を付けずに実行します。(変数名を珍しい物("_0_"とか)にすれば済みそうですが、念のため。)

DP2.1以後はこのコードで良いのですが、DP2.0の場合
<a href="javascript:void()" onClick="location=URL">
の様なリンクをクリックしても URLへジャンプしない(return false が必要)ので、setTimeout() を使う事で対応します。(一旦、空のウィンドウを開くタイプには対応出来ません。)

javascript:open=new Function('u','return (u!="")?setTimeout("location=\'"+u+"\'",100):self');new Function('var i,l=document.links;for(i in l)if(l[i].hash.length==1)l[i].href="javascript:"')()

リンクが反応しない理由が window.open() 以外にある事もありますが、結構使えると思います。


『Lトリガー』の『ジャンプ』で "http://" を消して "javascript:..." を入力して下さい。
DP2.1/3.0用


DP2.0用


フレーム外し
戻る


Acquiring image from ProHosting Banner Exchange