- ベストアンサー
<object data="">の挙動について
お世話になります 何故表示がされなくなるのか理由が分からないのでお分りになられる方いらっしゃいましたら教えていただきたいのですが・・・ 用意したファイルは ┣ test.html ┏ a.html ┗ hoge(フォルダ)╋ b.html ┣ c.html ┣ d.html ┗ e.html ソースはこちら <script type="text/javascript"><!-- window.onload=function() { var SPANS = new Array(); SPANS = document.getElementsByTagName("span"); for(var i=0;i<SPANS.length;i++) { SPANS[i].onmouseover = function() { this.style.backgroundColor = "lightcyan"; } SPANS[i].onmouseout = function() { this.style.backgroundColor = ""; } SPANS[i].onclick = function() { Object(this.innerHTML); } } } function Object(str) { h = document.getElementById("Object"); h.innerHTML = "<object data='./hoge/"+str+".html' type='text/html'><\/object>"; } //--></script> <style type="text/css"><!-- object { width:800px; height:400px; margin:0px; } span { display:block; float:left; width:79px; height:30px; text-align:center; margin:0px; cursor:pointer; } --></style> </head> <body> <div> <div id="scriptcontents"> <span>a</span> <span>b</span> <span>c</span> <span>d</span> <span>e</span> <div style="clear:both;"></div> </div> <div id="Object"></div> <span>をクリックしたら<object>を使用して別のhtmlファイルを表示させてるのですが普通にしていたら表示はされているのですが以下の手順を踏むとOperaで表示されなくなるのですが理由が分かりません(--;) 1).test.htmlを表示(これは5つとも自由に閲覧できます) 2).hogeフォルダ内の5つのファイルを名前を変えたりしてファイルの存在を削除 3).test.html試用(対象ファイルが無いので当然<object>内はNot Foundページになります) IE,Firefoxは何度押してもNot Foundページが出るのですがOperaは2回目以降反応無しになる(何も表示されない)) 4).hogeフォルダ内の5つのファイルを復元 5).test.html試用(IE,Firefoxは元通りになるのですがOperaは何も反応しないまま) なぜOperaは一度Not Foundページが表示されたら次から無反応になってしまうのでしょうか? その表示されなくなった名前のファイルはもう2度と使用することはできないのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>SAYKAさん ここが原因 >Although the STYLE and SCRIPT elements use CDATA for their data model, for these elements, CDATA must be handled differently by user agents. Markup and entities must be treated as raw text and passed to the application as is.【 The first occurrence of the character sequence "</" (end-tag open delimiter) is treated as terminating the end of the element's content.】 In valid documents, this would be the end tag for the element. 要素が終わってしまうことを防ぐため、です #Q3422890ではtr要素の終了タグをエスケープし忘れた。 #そもそも外部ファイルに書けばこんな心配は要らないし,DOMを使えばもっと安心。 >leap_dayさん 再現しました。Operaはキャッシュしてしまうのでしょうね。 暫定的に http://oshiete1.goo.ne.jp/qa3379904.html #4氏の手段を取ることによって回避できることが確認できましたが, 念のためサーバにCache-Controlヘッダを吐かせるとどうなるか, 検証してないので検証してもらえるとうれしいです。 #ところで関係ない話ですがQ3413770について, 少し補足があるのでプロフィール欄に記述しました
その他の回答 (1)
- SAYKA
- ベストアンサー率34% (944/2776)
ぱっと見てここ >h.innerHTML = "<object data='./hoge/"+str+".html' type='text/html'><\/object>"; 一旦別の変数に入れてalert出して中身を確認してみるのが良いと思うよ 正しい文字列になっているのかどうかという話。 ところでどうしてobjectの閉じタグの/が\でエスケープされてるの?
お礼
回答ありがとうございます function Object(str) { i = "<object data='./hoge/"+str+".html' type='text/html'><\/object>"; alert(i); } としてみたところアラートの中身は『<object data='./hoge/a.html' type='text/html'></object>』のようになっていてちゃんとなっているみたいです(><) >ところでどうしてobjectの閉じタグの/が\でエスケープされてるの? W3Cのチェックにかけると</object>でエラー判定されて<\/object>のようにするとFAQに書かれてあったものですから・・・ 間違った解釈しています?(--;) http://www.htmlhelp.com/tools/validator/problems.html#script
お礼
回答ありがとうございます リンク先の手法のように別ファイルとして開くようにしたら表示できるようになりました(^^) <meta http-equiv="Cache-Control" content="no-cache">とかのことですかね~?こちらは一応書きこんではいるのですがまだ完全に理解できていないのでよく分からないです(><) 〉プロフィール補足 ありがとうございます 英語なのですぐには読めないですけどじっくり読んでみます