2011-07-13 4 views
1

私が取り組んでいるサイトでは、jQuery 1.5.1を使用しています。私は最近、Internet Explorer 8で自分のHTMLに問題があることを発見しました。jQueryは、Internet Explorer 8のHTMLタグにnodeIndexプロパティを挿入します。

問題は 'nodeIndex'プロパティがDOMに挿入されていることです。おそらくjQuery(nodeIndexを参照する別のStackOverflow質問)を参照してください。プロパティはページソースには存在しません - DOMでのみIE8(素晴らしい)開発者ツールでそれを検査します。

IE8でDOM:

<DIV nodeIndex="4"> 
    <B nodeIndex="1">bold</B> 
    <BR nodeIndex="2"> 
    <I nodeIndex="3">italics</I> 
    <BR nodeIndex="4"> 
    <U nodeIndex="5">underline</U> 
    <BR nodeIndex="6"> 
</DIV> 

FF5(とChrome 12)でDOM:

<div> 
    <b>bold</b> 
    <br> 
    <i>italics</i> 
    <br> 
    <u>underline</u> 
    <br> 
</div> 

問題は、DIVはフォーラムの投稿のテキストであるということです。ユーザがフォーラムポストを引用したい場合、ポストのhtmlはBBCodeに変換されます(古いフォーラム投稿ではマークアップにBBCodeタグが使用されるため)。フォーマットマークアップは維持され、ユーザが書いたテキストエリアにコピーされます。新しいフォーラム投稿のテキスト(引用されたテキストを含む)。

JavaScript/jQueryを使用すると、htmlタグを対応するBBCodeタグに置き換えるのは簡単ですが、nodeIndexプロパティを追加すると、nodeIndexプロパティの正規表現を追加する必要があります。これは醜いハックのようです。

nodeIndexプロパティがIE8(およびIE7)に追加されている理由を誰にでも教えてください。また、それらを追加するのはjQueryです - もっと重要なのは、正規表現置換を使用するよりも良い方法です?

私が取り組んでいるサイトでは、さまざまなJavaScript/jQueryスクリプトを使用しているため、スクリプトの組み合わせの結果として予期しない動作が発生する可能性があります。

編集:IEでJavaScriptが無効になっているときにプロパティが表示されません。

nodeIndexに言及その他のStackOverflowの質問: Is nodeIndex a valid DOM element property in IE?

答えて

2

nodeIndexプロパティはIE8(およびIE7)に追加された理由を誰も私を伝えることができ、そしてそれはそれらを追加することjQueryのである -

これらのプロパティはSizzleによって追加されています(jQueryセレクタエンジン、jQueryソースのSizzle.selectorsオブジェクトの定義と比較してください)、おそらく:nth-child CSS疑似clをネイティブにサポートしていないブラウザお尻。

さらに重要:正規表現の置き換えを使用するよりも良い方法で削除できますか?

明確な方法は、HTMLスニペットをDOMに読み込んでそこから属性を削除することです。 jQuery自体を使用して、サーバー側またはクライアント側で実行できます。

var htmlText = '<DIV nodeIndex="4">Some text.<BR nodeIndex="1"></DIV>'; 
var $html = $("<div>" + htmlText + "</div>"); 
$html.find("*[nodeIndex]").removeAttr("nodeIndex"); 
console.log($html.html()); 
// logs "<div>Some text.<br></div>" 
+0

@Tomalakの説明に感謝します。 nodeIndexプロパティがIE7と8に挿入され、IE9とFFに挿入されていないことは理にかなっています。私は、jQueryのremoveAttr()メソッドについて忘れていました.HTML文字列を操作する正規表現よりはるかに脆弱です。 – Hildesheim

+0

@ヒルデスハイム:もちろんです。同じことがサーバー側でも機能しますが、もっとも間違いなくコードの行が増えます。しかし、DOMの手段で入力HTMLをBBcodeに変換するサーバーサイドコードがすでにある場合、クライアント上でこの操作を行うことは意味がありません。 – Tomalak

+0

この場合、ページをリロードせずにテキストをテキストエリアにコピーしたいので、提案したjQuery(removeAttr)を使用してしまいました。場合によっては挿入される 'sizcache'と 'sizset'プロパティも完全に働きました。 – Hildesheim

関連する問題