2010-12-01 2 views
2

J'ai un site qui répertorie un ensemble de fichiers qui peuvent être téléchargés. L'attribut personnalisé docType est défini en fonction de l'extension de fichier. S'il n'y a pas d'extension, le docType est défini sur "unknownDoc". Le fichier CSS ressemble à ceci:Lors de l'utilisation de jQuery.attr() pour définir un attribut, le navigateur ne met pas à jour le style à partir du 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; 
} 

Il est tout à fait possible qu'un utilisateur télécharge un document que nous n'avons pas de style css mis en place pour encore. Dans ce cas, l'élément aura un docType mais pas d'image de fond. Dans ces cas, je veux que le style unknownDoc soit appliqué. Donc, j'utilise ce qui suit:

$('.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\"]"); 
    } 
}); 

Cela fonctionne très bien. Ce que je ne comprends pas, c'est pourquoi dois-je utiliser l'instruction addClass? L'attr ou addClass par eux-mêmes ne fonctionne pas. C'est comme si l'ajout de l'attribut ne permettait pas au navigateur de re-styler l'élément en fonction du nouvel attribut comme le fait addClass. Est-ce une chose jQuery ou une chose de navigateur?

Y a-t-il une meilleure façon de procéder?

J'ai essayé d'utiliser uniquement des classes plutôt que l'attribut personnalisé docType, mais cela devient trop compliqué, en particulier lorsque des classes supplémentaires peuvent être ajoutées à l'élément dans le futur.

+0

Merci pour les bonnes réponses. Je vais garder le code tel qu'il est (mais je pourrais être persuadé de faire différemment si quelqu'un propose une suggestion que j'aime mieux). Ma raison pour cela est que j'aime vraiment la propreté de l'utilisation de l'attribut docType. De plus, il semble que la seule ligne .addClass est vraiment un correctif pour IE, comme FF et Chrome gérer correctement. Donc, un correctif IE ligne unique n'est pas un gros problème et, de nos jours, est tout à fait standard. –

Répondre

1

Semble être juste avec IE comme Chrome et FF fonctionnent bien sans l'addClass. Une version plus facile de la vôtre ci-dessus est:

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

semble être l'incapacité de IE (ou jQuery de) pour comprendre les changements dynamiques aux sélecteurs.

Vous pouvez vérifier dans ce violon que FF et Chrome sont très bien: http://jsfiddle.net/fUSVF//

+0

Ah, merci. Tu as raison. 80% de nos utilisateurs utilisent encore IE, c'est mon premier navigateur avec lequel je teste. Après une longue journée de codage, je pense que j'étais juste dans une ornière et je ne pensais pas voir si cela fonctionnait dans FF et Chrome. –

+0

Y a-t-il une raison pour laquelle je dois utiliser removeClass? AddClass double-t-il les classes dans le DOM, et si oui, est-ce un problème? –

+0

addClass n'affecterait pas l'élément puisqu'il a déjà la classe.removeClass suivi par addClass réinitialise essentiellement les définitions liées à la classe sur l'élément et entraînerait le recalcul de toute dépendance (comme les sélecteurs d'attribut) – methodin

0

Ne serait-il pas plus simple de changer votre css:

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

Et .addClass("unregisteredExtension") après la détection de ce cas?

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

Ah, c'est une idée simple, et je l'aime bien. Cependant, j'aime vraiment la netteté de l'attribut docType et (appelez-moi têtu) Je ne veux pas mélanger les attributs et les classes pour le même effet. Si je travaille d'abord avec des attributs, je peux m'en tenir à cela. Je suis définitivement ouvert à la persuasion. :) –

0

Vous n'êtes pas vraiment censé ajouter des attributs personnalisés. Les navigateurs n'ont pas à se soucier d'eux - en fait, les ignorer complètement est la meilleure chose qu'ils peuvent faire, alors assurez-vous que si vous stockez de la merde dedans, cela ne gâchera rien.

Si vous souhaitez modifier l'apparence via JavaScript + CSS, utilisez des classes. Le plus simple est avec un élément qui n'a tout simplement pas d'autres classes, alors vous pouvez simplement faire $(elem).removeClass().addClass('yourNewClass');

+0

Je n'ai vu aucune documentation que les attributs personnalisés sont une mauvaise chose pour les navigateurs modernes (FF, Chrome, IE 7+). En fait, d'après ce que j'ai vu, c'est une partie intentionnelle de XHTML. Malheureusement, il y a de bonnes chances que des classes supplémentaires soient ajoutées à l'avenir pour un design non lié au docType. Test pour voir si une classe docType a été ajouté par opposition à plusieurs autres classes n'est pas aussi trivial qu'une ligne de code. De plus, avoir l'attribut docType semble beaucoup plus propre. –

Questions connexes