「JavaScript」親ページを変更する

またまた今回も某Webマスター“Aさん”の「JavaScript」を教えて攻撃である。

今回の一発目のメールの出だしが「ギブアップ」と書かれている所が今までとは違っていて、「自己解決の努力をしてみたけどダメだった」ということをまずは言いたかったのであろう。

なんでもすぐに「教えて」だと私がブチ切れることを覚えてくれたらしい。

ところが「ギブアップ」というのは“諦めた”という宣言ではなく、「私にはムリだから代わりになんとかして」という依頼というか強要である。

このことが今回の課題クリアに時間を要する原因となった…。

Aさんは自分がしたいことに近いサンプルをネットで探し出し、試してみたのだが自分がしたいことと少し違っていた。そこで「改造」に取り掛かったのだが、どうしても自分がしたいようにはならない。そこで「サンプルが動かない!」と私に投げてきたのである。

そのサンプルが置いてあったサイトには「質疑応答の掲示板」が設置されているので、そこで自分で聞けばいいものを私に振ってくる。

Aさんが格闘した内容も「ギブアップ」メールに書かれていたので、Aさんがしたいことをするためには「window.open」の使い方が間違っていることを連絡するが、どうも話が通じない。Aさんが格闘した内容を見る限り「window.open」で開いたページを書き換えようとしているとしか思えないのに、本人はそうしたいわけではないらしい。

「印刷」ボタンをクリックする。「OK」なら印刷、「キャンセル」なら「利用規定」のページを表示させたい。

というのがAさんがしたいことらしいのだが、これなら前回作ってあげたやつに答えが書いてあるゾ。

main2.html

ところが「この前のは別ウインドウではないでしょ!!」なんて強気な返事が返ってくるではないか。困ったもんだ。

Aさん曰く「別ウインドウを開いて、そちらで印刷の処理をさせる。キャンセルなら“元”のページに利用規定を表示させる」が今回したいことらしい。

つまりは、Aさんがネットで見つけ出したサンプルは単に「別ウインドウを開く」ものであり、呼び出し元のページを書き換えるようなものではないのである。そんなことも気が付かずに「サンプルが動かない」などと私に抗議されても仕方ないじゃん。

そもそも動かないといっているサンプルはAさんが無理やり改造して壊しているもので、その壊してしまったところを指摘してあげただけなのに「そんなことは分かっている」と逆ギレされても…

いかん血圧が上がってきた………。

冷静に「“元”のページ」が何なのか確認すると「逆検索のページ」を表示させるページだそうだ。

何それ?

そんな事言われてもページ作った人と実際に使っている人しか分からんゾ。

Aさんのサイトのそれらしいところをチマチマとチェックしてみて、ようやく「逆検索」という言葉が見つかった。

「逆検索ができます」と書いてあるだけで「逆検索」をしてくれるページではない。

一覧表に、a項目を基準にb項目が書かれているのか、b項目を基準にa項目が書かれているのかという違いで「逆検索」という言葉をAさんは使っているらしい。

「探すのに苦労した」とメールすると「知っていると思った」とあっさり返ってくる。そんなもの使わないから知らんゾ!

さて「“元”のページ」というのはだいたい分かったけど、二重のフレームで構成されているページのどこが“元”なのか特定する必要がある。

通常は“元”といえば、別ウインドウを開くためのボタンが設置されているページを“元”というだろう。

ところがAさんは「そうじゃない」と「○○のページに利用規定を表示させたいの」と言ってくる。

だから「○○のページ」じゃなくて、ボタンが置いてあるページなのか、二重フレームの内側のフレーム全てなのか、それとも全体なのかを特定して欲しいだってぱ…。

もう面倒になってきたので次のようなものを作ってあげた。

main3f.html

「好きなように使って」とメールしたら暫くして「できた」と返事がきた。やれやれ。

Aさんがしたかった事をまとめると…
二重のフレームで構成されているページの内側のフレームの下側のページにボタンAを設置。
ボタンAをクリックすると別ウインドウが表示され、そこには印刷をするためのボタンBがある。
ボタンBをクリックすると「利用規定を確認しましたか?」のアラートが現れる。
「OK」をクリックすると印刷され別ウインドウが閉じられる。
「キャンセル」をクリックすると印刷がされずに別ウインドウが閉じられ、内側のフレームに「利用規定」のページを表示させる。

であった。最初から「したいこと」を連絡してくれば短時間で終わったのに、「サンプルが動かない」というAさんの格闘に付き合ってしまったためにムダな時間を費やしてしまったのである。

<input type="button" id="txt0"value="トップページを書き換えて、このページを閉じる"><br>
<input type="button" id="txt1"value="親のページ全体を書き換えて、このページを閉じる"><br>
<input type="button" id="txt2"value="親のページ上側を書き換えて、このページを閉じる"><br>
<input type="button" id="txt3"value="親のページ下側を書き換えて、このページを閉じる"><br>
<script type="text/JScript"><!–
function txt0::onclick()
{
    window.opener.top.location.href = "./kitei3.html";
    window.close();
}
function txt1::onclick()
{
    window.opener.parent.location.href = "./kitei3.html";
    window.close();
}
function txt2::onclick()
{
    window.opener.parent.up.location.href = "./kitei3.html";
    window.close();
}
function txt3::onclick()
{
    window.opener.parent.down.location.href = "./kitei3.html";
    window.close();
}
–></script>


追記(2007年8月16日)

子ページから親ページを操作する件で問い合わせを頂きました。
子ページを表示させた後に、親ページを違うページに変えられてしまったら、子ページから操作できなくなるのでは?

さっそくサンプルを修正して試してみました。
main3f.html  (Firefoxで動きません)
フレーム内のページを変えても子ページからの操作に問題はおきません。しかし、ページ全体を変えてしまったら子ページからの操作を受け付けません。(Javascriptがエラーを起こします)
ということで問い合わせいただいた「親ページ全体を書き換えてしまったら子ページから操作できません」が正解だと思います。

もし親ページ全体を書き換えても子ページからの操作を可能にする方法がありましたら、このエントリーにTBください。


追記(2007年8月17日)

フレームセットを使わないサンプルを作ってみた。(簡単なやつ)
main4f.html  (Firefoxでも動きます)

親ページ全体を書き換えても子ページからの操作が可能です。

ということでフレームセットを使うのかどうかが問題だということが明確になりました。



関連エントリー