こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

IEでiframe内のcookieを保持

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

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

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

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

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

投稿日時 - 2008-12-16 13:35:07

QNo.4560033

すぐに回答ほしいです

質問者が選んだベストアンサー

恐らく、間接的には 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

投稿日時 - 2008-12-17 04:02:17

お礼

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

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

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

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

投稿日時 - 2008-12-17 12:08:45

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

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

以前書いたコードは忘れてください。ごめんなさい。

投稿日時 - 2008-12-18 02:04:29

お礼

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

投稿日時 - 2008-12-18 10:54:25

ANo.2

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

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

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

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

投稿日時 - 2008-12-16 20:25:14

補足

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

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

投稿日時 - 2008-12-16 21:33:14

ANo.1

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

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

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

ご参考まで。

投稿日時 - 2008-12-16 15:53:32

補足

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

投稿日時 - 2008-12-16 21:18:12

あなたにオススメの質問