何という無駄

ちくま文庫で出している、山田風太郎忍法帖短編全集で、見つけられない巻がある。いろいろ古本サイトを漁っていると、中で、各種の新本・古本サイトへボタン一発でリクエストを出す、ま、ちょっと気の利いたリンク集とでも言おうか、そんなサイトを見つけた。

これは便利だが、amazon古本市場、eBookOff……と各種サイトを比較して見たいので、ぜひ検索結果は別ウィンドウ(タブ)に出したい。今の仕様だと、「戻る」ボタンを押して、また押さないとならない。するとさっきの結果画面が消えてしまうし。つまりは、このformのtarget属性が、_blankであればいいわけだ。

そこで早速、Greasemonkeyで小細工するスクリプトを書いた。もちろん、このサイトの場合、静的なHTMLとして保存して書き換えて使ってもいいわけだが、新たなサイトが増えたりしたら、またここをチェックして調べないとならない。何しろ100個以上リンクが集められていて、これは重宝。とても自分ではできないから、毎回このサイトのお世話になりたい訳である。という訳で、Greasemonkeyをいじってみる。すべてのformのtargetを_blankにすり替える、初歩的なスクリプトであり、間違いは無いはずだ。が…インストールして動かしてみると、これがさっぱり効かない。

HTMLソースを見ると、target属性は_selfと指定されている。ここが書き換わっていないということか?

ふと、DOMインスペクタで調べてみると、該当のformの、target属性は_topとなっている。
このHTML、他にもformがあるので、該当のformを取り違えているかもしれない。そこで確認のため、DOMインスペクタ上にブラウザ表示をさせた上で、該当と思われるformのtarget属性を、インスペクタで変更してから、submitさせてみる。

すると、思った通りに別ウィンドウに開くのである。ということは、変更すべきformは確かにここに間違いは無い。が、どうして、指定もしていない_topになってしまうのだろうか?HTMLを検索してみるとどこにも_topなどという文字すらない。つまり、動的に変更されているということだろうか。そこで、HTMLの冒頭で読み込まれているJavaScriptファイルを調べてみると、イベントリスナーをsubmitに紐付けている。そのイベントリスナーでは、イベントもとオブジェクト(この場合はformのはず)の、target属性を、_topに書き換える小細工をしていることがわかった。

さて、これで謎は解けたがよく分からないのは、なぜこんな面倒なことをしているかである。
当初、僕は馬鹿だから、「Greasemonkey対策か?!」と思った。(何の対策だ)
で、よ〜く該当の箇所を見ると、あるinput項目の値によって、targetを_topか_blankのいずれかに変えるために、このような方法で、submitイベント発生時にtarget属性を書き換えているのだと分かった。なるほど、単純に、Greasemonkeyでtarget属性を変えても、その後、submitイベント発生時に上書き更新されるから、いくらGreasemonkeyで単純にいじっても駄目な訳である。

そこで、Greasemonkey側でもイベントリスナーを登録し、target属性を、都度上書きするように仕込んだら、ようやく、思い通りの動きをするようになった。

……さて、これで終われば、僕は幸せに、しかし何も知らずにぐっすり眠ったと思うのだ。
が、待てよ? このHTMLは、あるinput項目、checkboxなんだが、これがチェックされていれば、targetを_blankにする、という仕様である。
一方、小一時間を費やして、僕がやろうとしたのは、どんな時もtargetを_blankにする、ということである。
でも、チェックボックスがチェックされていれば、元々_blankに開く仕様なのだから、おかしいじゃないか?
ハッと気づいてよ〜く画面を見てみると……悪い癖で、画面をろくすっぽ見ないで判ったような気になって、あとはHTMLとJavaScriptばかり追いかけていたのだが……そこには、
『結果を新しいウィンドウに開く』
というチェックボックスが、あったのだ。じゃじゃーん!とBGMが聞こえた気がした。何という無駄なことをしたのか。僕は本当にがっくりした。

山田風太郎の文庫は結局みつからなんだ。BK1では7〜21日で取り寄せ、と書いてあるが、きっと無理だろう。ネットに頼らず、古本屋を歩くとするか……