プロが教えるわが家の防犯対策術!

楽天ショップでJavaScriptを利用した開閉式のメニューを実装しています。
左サイドの「メンズ」「レディース」の箇所です。
http://www.rakuten.co.jp/magicmarket/

楽天の通常ページでは<Script>タグの記述ができない為、別サーバで作ったメニューをiframeで表示しています。
http://www.rakuten.ne.jp/gold/magicmarket/left.h …
iframeの使い方に無理があるのは承知ですが、楽天内では苦肉の策としてよく使われています。

メニューにはSlashdot Menuというこちらのスクリプトを使用しています。
http://www.dynamicdrive.com/dynamicindex1/slashd …
開閉状態をブラウザのcookieに保持しているので、デフォルトで開いた状態のものを一度閉じて更新すると閉じた状態で表示されます。
(ページ遷移しても同様です)
http://www.rakuten.ne.jp/gold/magicmarket/left.h …

firefoxなどで動作確認するとiframe内でも正常に動作しています。
http://www.rakuten.co.jp/magicmarket/
IEでも保持できれば完璧なのですが、iframe内のcookieを保持する方法はありませんでしょうか。

アドバイス頂けると助かります。
よろしくお願い致します。

A 回答 (4件)

恐らく、間接的には iframe にした事が原因ですが、根本は、別ドメインのクッキーの読み書きがセキュリティに引っかかったためかと思います。



書き込み :
document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toGMTString() + "; path=/";

document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toUTCString() + "; path=/magicmarket/; " + "domain=www.rakuten.co.jp";

又は、

parent.document.cookie = "sdmenu_" + encodeURIComponent(this.menu.id) + "=" + states.join("") + "; expires=" + d.toUTCString() + "; path=/magicmarket/";

# "path=/" 楽天トップに直に書いて大丈夫なんですか?

読み込み
parent.document.cookie
    • good
    • 0
この回答へのお礼

ありがとうございます。
不具合の原因と実現したいことはまさにご指摘の通りです。
同一ドメイン内でiframeはOKでしたので別ドメインのcookie処理ということですね。
ちなみに解決にはなりませんがインターネットオプションのプライバシーを低レベルに下げれば動作しました。

sdmenu.jsを教えて頂いた通り記述してみましたが保持はできませんでした。
http://www.rakuten.ne.jp/gold/magicmarket/script …
やはり無理があるのでしょうか。

> # "path=/" 楽天トップに直に書いて大丈夫なんですか?

これはダメですね。何も考えずそのままUPしていました。
ご指摘ありがとうございます。

お礼日時:2008/12/17 12:08

少し調べてみたのですが、サーバ側の設定を変更しないと無理みたいですね。



以前書いたコードは忘れてください。ごめんなさい。
    • good
    • 0
この回答へのお礼

わざわざ調べて頂き感謝いたします。
原因が判明しただけでもとても助かりました。
この度はありがとうございました。

お礼日時:2008/12/18 10:54

同じくソースは見てませんが・・・



cookieの保存、読み出し部分でブラウザによる違いはあまりないように思われますが、どのような事象なのでしょうか?

ちなみに、Slashdot Menuのオリジナル版はもちろん作動していますが、IE6では、ご提示のメニューはどちらも作動していないようです。
Opera8ではメニュー部分そのものが、表示されないみたいです。

cookieではなく、このあたりに原因がありそうでは?
勘違いをしていたら失礼。

この回答への補足

オリジナル版をiframeで表示させてみました。
http://www.rakuten.ne.jp/gold/magicmarket/test.h …
メニューを閉じて更新すると開いた状態に戻ると思います。

スクリプト自体に不具合があるわけではないのですが、iframe内でもIEで状態を保持する方法があれば使い勝手が向上するのでとても助かります。
方法がなければきっぱり諦めます。よろしくお願い致します。

補足日時:2008/12/16 21:33
    • good
    • 0

サイトやソースなどは見ていません。


キャッシュから読んでいたり、ブラウザの戻るボタンや進むボタンを使う場合などの場合、
windowの読み込み完了イベントが発生しないブラウザがあります。
Firefoxはバージョン2か3で発生するように変更されました。
Operaはonloadイベントを発生させない代わりに、初期化後の変数の値まで全てを保存していると思います。

それへの簡単な対処法で、
</body>の直前で<script>タグを使って、直接呼び出す方法があります。

<body onload="init();"><!-- これは呼び出されない -->
.....
<script type="text/javascript">
init(); // これは呼び出される
</script>
</body>

ご参考まで。

この回答への補足

ご回答ありがとうございます。
状態の保持はcookieのキャッシュを利用しているのですが、iframeを使用しない場合は正常に動作しますので、ブラウザの読み込み自体は問題ないと考えられます。
よろしくお願い致します。

補足日時:2008/12/16 21:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!