2010-12-01 4 views
2

サイトの帽子には、ダウンロード可能なファイルのリストがあります。カスタム属性docTypeは、ファイル拡張子に基づいて設定されます。拡張子がない場合、docTypeは "unknownDoc"に設定されます。 CSSファイルには、次のようになります。jQuery.attr()を使用して属性を設定すると、ブラウザはCSSからスタイルを更新しません

.TitleColumn[docType="pdf"] 
{ 
    background: url("/images/common/icons/pdf.png") no-repeat left center; 
} 

.TitleColumn[docType="doc"], TitleColumn[docType="docx"] 
{ 
    background: url("/images/common/icons/word.png") no-repeat left center; 
} 

.TitleColumn[docType="unknownDoc"] 
{ 
    background: url("/images/common/icons/unknownDoc.png") no-repeat left center; 
} 

それは、ユーザが、我々はまだのために設定CSSスタイルを持っていないドキュメントをアップロードすることが十分に可能です。この場合、アイテムにはdocTypeがありますが、背景イメージはありません。このような場合は、unknownDocスタイルを適用する必要があります。だから私は次を使用します:

$('.TitleColumn').each(function (index) { 
    var hasNoDocImage = $(this).css("background-image") == "none"; 
    var docType = $(this).attr("docType"); 

    if (hasNoDocImage && docType) { 
     $(this).attr("docType", "unknownDoc"); 
     $(this).addClass("TitleColumn[docType=\"unknownDoc\"]"); 
    } 
}); 

これはうまくいきます。なぜ私は理解していないのですが、なぜaddClassステートメントを使用する必要がありますか? attrまたはaddClass自体は機能しません。これは、属性を追加しても、ブラウザがaddClassのような新しい属性に基づいてアイテムのスタイルを変更しない場合と同じです。これはjQueryのものかブラウザのものですか?

これを行うより良い方法はありますか?

私はdocTypeカスタム属性ではなくクラスだけを使用しようとしましたが、あまりにも面倒になりました。特に将来、追加のクラスが追加される可能性があります。

+0

すばらしい回答をありがとう。私はコードをそのまま保つつもりです(しかし、誰かが私が好きな提案が出たら、別のやり方で説得することができます)。これを行う理由は、docType属性を使用することのきれいさが本当に好きなのです。さらに、FFやChromeが適切に処理するため、単一の.addClass行が実際にIEの修正版であるようです。だから、1行のIEの修正は大きな問題ではなく、最近では非常に標準的なものです。 –

答えて

1

ChromeとFFのようにIEで動作するように見えますが、addClassを使用しないとうまく動作しません。上記のあなたの容易なバージョンは次のとおりです。

$(this).attr("docType", "unknownDoc").removeClass('TitleColumn').addClass('TitleColumn'); 

は、セレクタの動的な変化を理解するためにIEのできないこと(またはjQueryの)しているようです。

あなたはFFとChromeは大丈夫であることを、このフィドルで確認できます。この場合を検出した後

.TitleColumn[docType="unknownDoc"], .unregisteredExtension 
{ 
    background: url("/images/common/icons/unknownDoc.png") no-repeat left center; 
} 

そして、ちょうど.addClass("unregisteredExtension")http://jsfiddle.net/fUSVF//

+0

ああ、ありがとう。あなたが正しい。ユーザーの80%が引き続きIEを使用しているため、私がテストした最初のブラウザです。コーディングの長い一日の後、私はちょうど轍の中にあったと思うし、これがFFとChromeでうまくいくかどうかは考えられませんでした。 –

+0

removeClassを使用する必要がある理由はありますか? addClassはDOMのクラスを何とか二重にしますか?あれば、これは問題ですか? –

+0

addClassは既にクラスを持っているので、要素には影響しません。removeClassに続けてaddClassを実行すると、要素のクラス関連の定義が本質的にリセットされ、依存関係の再計算が行われます(属性セレクタなど) – methodin

0

はにあなたのCSSを変更することが簡単にできませんか?

if (hasNoDocImage && docType) { 
     $(this).addClass("unregisteredExtension") 
    } 
+0

ああ、これは簡単なアイデアです。しかし、私は本当にdocType属性の清潔さが気に入っています。(頑固な私に電話してください)同じ効果のために属性とクラスを混ぜることは望ましくありません。私が最初に属性を使って作業しているのであれば、私はそれに固執するかもしれません。私は確かに説得するために開いている。 :) –

0

本当にカスタム属性を追加する必要はありません。ブラウザは気にする必要はありません。実際にはそれらを完全に無視するのが最良の方法ですので、何かを保存しておくと、何も邪魔することはありません。

JavaScript + CSSで外観を変更する場合は、クラスを使用します。最も簡単な方法は他のクラスを持たない要素だけです。単純に行うことができます$(elem).removeClass().addClass('yourNewClass');

+0

カスタム属性が最新のブラウザ(FF、Chrome、IE 7+)にとっては悪いことを示すドキュメントは見たことがありません。実際、私が見たことから、それはXHTMLの意図的な部分です。残念ながら、docTypeに無関係なデザインのために、今後追加されるクラスが追加される可能性があります。 docTypeクラスが他の複数のクラスとは対照的に追加されているかどうかを調べるテストは、1行のコードほど簡単ではありません。さらに、docType属性を持つ方がずっときれいです。 –

関連する問題