2 つの質問があります。
まず、シナリオ:
NOSCRIPT のモバイル ブラウザ サポートに関していくつかの奇妙な問題が発生したため、JS を「検出」するための代替ソリューションを考案する必要があります。ソリューション ロジックは、ページに 2 つの DIV を配置することです。1 つは、JS がなく、デフォルトで表示されていることを示すエラーです。JS がある場合は、前の CSS をオーバーライドしてエラーを非表示にし、代わりにコンテンツを表示する新しい STYLE ブロックを HEAD に追加します。
サンプル HTML:
<div id="div1">div 1 (should be shown if JS enabled)</div>
<div id="div2">div 2 (should be hidden if JS enabled)</div>
これは私が始めたJSです:
var styleNode = document.createElement('style');
styleNode.setAttribute("type", "text/css");
styleNode.innerHTML = "#div1 {display: block;} #div2 {display: none;}";
headTag.appendChild(styleNode);
しかし、私は問題を抱えていました。DOM に配置する前に、作成された要素に innerHTML を挿入しようとすると、IE で発生する可能性のあるセキュリティ上の問題について、いくつかのグーグル検索が行われました。
http://karma.nucleuscms.org/item/101
そのため、スクリプトを次のように変更しました。
var styleNode = document.createElement('style');
styleNode.setAttribute("type", "text/css");
var headTag = document.getElementsByTagName("head")[0];
headTag.appendChild(styleNode);
var aStyleTags = headTag.getElementsByTagName("style");
var justAddedStyleTag = aStyleTags[aStyleTags.length-1];
justAddedStyleTag.innerHTML = "#div1 {display: block;} #div2 {display: none;}";
質問 1 : IE の問題に対する有効な回避策ですか? より効率的な解決策はありますか?
質問 2 : 調整を行ってもスクリプトが IE で動作しません。Firefox では正常に動作しますが、IE 7 では「不明なランタイム エラー」が発生します。
このコードのサンプルが JSBIN にあります。
IEで何が起こっているか知っている人はいますか?
アップデート:
私はグーグル経由でこのリンクに出くわしました。最後のコメントに注意してください。
http://msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx
とはいえ、XHTML に厳密に準拠するには、すべてのスタイル ルールを HEAD に配置する必要があります。innerHTML を使用して HEAD 要素または STYLE 要素に直接挿入することはできないため、これを行うのも少し難しい場合があります。(これらのタグは両方とも読み取り専用です。)
えっ!真実?FireFox は寛容すぎるだけですか? それとも、これは非常に奇妙な IE の癖ですか?
更新 2:
ここで解決しようとしていることについて、もう少し背景を説明します。私たちはモバイル デバイスを扱っていますが、一部の時代遅れのデバイスは、a) NOSCRIPT をサポートしておらず、b) 遅い JS エンジンを使用しています。
それらは NOSCRIPT をサポートしていないため、デフォルトでエラーを表示し、JS がある場合はエラーを非表示にし、適切なコンテンツを表示します。これらの JS エンジンが遅いため、DIV の表示/非表示の「ちらつき」が見られます。これは、DIV がレンダリングされる前に CSS をロードするため、これを処理するために提案されたソリューションでした。
無効に見えるため、解決策は、これらの古いデバイスでこのメソッドを使用することです (IE でなくても機能するように見えるため)。その後、他のすべての適切なブラウザーは提案どおりに動作します...各 DIV が DOM にロードされた後、インライン JS を介して DISPLAY CSS プロパティを更新するだけです。
とはいえ、この問題が IE のバグなのか、それとも STYLE を読み取り専用要素にすることで IE が実際に適切な標準に準拠しているのかについて、私はまだ興味があります。