2009-08-31 10 views
8

ここでのコードは1つが期待するものは戻らない:jQuery(..).html()はjQuery 1.3.2でバグですか?

むしろ
jQuery('<div>Look here: [ jQuery0="null" ]</div>').html() 

、あなたが得る:

Look here: [ ] 

問題のjQueryのソースコード:

html: function(value) { 
     return value === undefined ? 
       (this[0] ? 
         this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : 
         null) : 
       this.empty().append(value); 
}, 

モチベーションになりますどのような.replaceの後ろに? jQueryの残りの部分を参照する時間はありませんが、このようなコードでは、本番でjQueryを使用すべきかどうか疑問です。

答えて

4

このコードは1.3.2で新しく、1.3.1ではありませんでした。 jQueryは、名前が "jQuery"で始まり、要素にデータを格納する属性を使用するように見えます。これは、htmlを求めるときにそのことを公開しない方法です。

明らかにバグではありません。作者は文字列を返す前にそのHTMLを削除しようとしました。

これはコードに影響しますか?どのようなライブラリでも、実動コードを展開する前に完全にテストする必要があります。

+1

私のコードにはまだ影響はありませんが、警告音を鳴らす 'x.html(y).html()== y'という不変式が壊れています。これがいつ導入されたかに関する情報をありがとう。あなたは正しいです、それはバグではなく、疑わしいデザインの決定です。 – t0yv0

11

.replaceの背後にある動機は何でしょうか?

jQueryが内部目的で使用している属性を非表示にする。

このようなコードは、私が本番でjQueryを使うべきかどうか疑問に思います。

はい、全く同じ反応がありました。それはちょうど信じられないほど汚いです。 regexpでHTMLを処理しようとするのは、初心者の質問のポスターから期待される単純なハックではなく、フレームワークで見たいと思うような行動ではなく、多くのSOユーザーが崇拝するようです。

jQueryがregexでマークアップを解析しようとすると、それだけではありません。セレクタのもののいくつかも壊れています。これらはあいまいなコーナーケースかもしれませんが、私にとっては間違ったアプローチを示す巨大な赤い旗です。

+4

ちなみに、これは簡単に修正できます。 IEは、その値が 'String'や' Number'のような単純な型である場合にのみ、 'innerHTML'直列化でexpandoプロパティを含みます。 Arrayのような他のオブジェクトは表示されません。したがって、すべてのjQueryは 'node [expando] = uuid;'の代わりに 'node [expando] = [uuid];'を設定し、このナンセンス正規表現の処理はすべて終了します。 – bobince

+0

私はあなたをどれくらい愛していると言いましたか?あなたはあいまいなIEの修正などの神のようです。 –

関連する問題