2010-08-19 4 views
2

Cela semble très curieux mais j'ai des problèmes pour appliquer des styles aux éléments générés par javascript dans IE7 mais si je rends le même élément que la chaîne, cela fonctionne.IE7 - Styling Javascript generated Element

sur mon javascript:

var style = document.createElement('link'); 
    style.setAttribute('type','text/css'); 
    style.setAttribute('rel', 'stylesheet'); 
    style.setAttribute('href', url('assets/default.css')); 

document.getElementsByTagName('head')[0].appendChild(style); 

cela va créer la balise de script que je veux intégrer dans la page, qui contient:

.sample{ 
    background: red; 
} 

puis pour la page J'ajoute une .sample portée au corps:

var sample = document.createElement('span'); 
    sample.setAttribute('class','sample'); 
    sample.innerHTML = 'hello there'; 

document.getElementsByTagName('body')[0].appendChild(sample); 

Lors du rendu sur IE8/FF/Safari/Chr ome, etc il rend assez bien avec le fond rouge, étonnamment sur IE7 il n'affiche pas le fond rouge. Cela fonctionne si je convertis l'élément sample en une chaîne, puis l'ajoute au corps, mais j'ai perdu toutes les références à cet élément, ce qui n'est pas bon. Donc, la question est: Comment puis-je appliquer correctement les styles aux éléments javascript?

merci à l'avance

Répondre

3

Pouvez-vous essayer de le changer:

sample.setAttribute('class','sample'); 

à ceci:

sample.className = 'sample'; 

Comme Andy E mentionné dans les commentaires, dans IE 7 et inférieur setAttribute() les cartes à l'aveuglette l'attribut que vous fournissez à un nom de propriété (par exemple, il mappe sample.setAttribute('class', 'sample') à sample.class = 'sample'), donc il se brise pour des attributs comme class, for, onload, onclick, etc. où le nom de l'attribut HTML est différent du nom de la propriété JavaScript.

+0

Bien que 'setAttribute' semble fonctionner pour vous lors de l'ajout de la feuille de style, ce n'est probablement pas le cas ... –

+0

Paul, étonnamment, ça a marché! il semble qu'il y ait un problème avec le mot-clé 'class' en tant qu'attribut. Merci beaucoup – zanona

+3

+1. * setAttribute() * est mappé de façon incorrecte aux noms de propriété dans IE7 et inférieur, donc il se brise pour des attributs tels que * class *, * pour *, * onload *, * onclick *, etc. –

1

Vous devriez manipuler directement l'élément lors de l'application des classes, par exemple .:

var sample = document.createElement('span'); 
sample.className = 'sample'; 
sample.innerHTML = 'hello there'; 

sample.style.backgroundColor = '#ff25e1'; 

Fait intéressant, vous ne pouvez pas utiliser le mot « classe », car il est un mot réservé à JS.

+1

Mais '' class'' en tant que chaîne n'est pas un mot clé réservé, cela ne devrait donc pas vraiment avoir d'importance. – peirix

+0

Vous avez raison. Vous pouvez utiliser 'setAttribute()' comme vous le souhaitez. De même, vous pouvez aussi écrire 'sample ['class'] = 'sample';', bien qu'il ait le même résultat que 'setAttribute()'. Mais pour l'assignation directe, vous ne pouvez pas écrire 'sample.class = 'sample';'. C'est tout ce que je voulais dire. – Andrew