2010-11-17 11 views

Répondre

10

Pas directement, mais il y a quelques bonnes suggestions visant à minimiser l'impact des remboursements ici:

http://dev.opera.com/articles/view/efficient-javascript/?page=3

En bref, essayer quelque chose comme ceci:

La deuxième approche consiste à définir une nouvel attribut de style pour l'élément, au lieu d'affecter les styles un par un. Le plus souvent cela est adapté aux changements dynamiques tels que les animations, où les nouveaux styles ne peuvent pas être connus à l'avance. Ceci est fait en utilisant soit la propriété cssText de l'objet style , soit en utilisant setAttribute. Internet Explorer n'autorise pas la deuxième version et nécessite le premier. Certains navigateurs plus anciens, y compris Opera 8, ont besoin de la deuxième approche, et ne comprennent pas le premier. Donc, le moyen facile est de vérifier si la première version est pris en charge et l'utiliser, puis tomber retour à la seconde sinon.

var posElem = document.getElementById('animation'); 
var newStyle = 'background: ' + newBack + ';' + 
    'color: ' + newColor + ';' + 
    'border: ' + newBorder + ';'; 
if(typeof(posElem.style.cssText) != 'undefined') { 
    posElem.style.cssText = newStyle; // Use += to preserve existing styles 
} else { 
    posElem.setAttribute('style',newStyle); 
} 
+0

bonne approche. Méfiez-vous simplement que la première partie du 'if' va remplacer tous les styles inline déjà présents. Définir 'posElem.style.cssText + = newStyle' fera l'affaire de toute façon. Voir [violon] (http://jsfiddle.net/gleezer/Ae4XR/1/) – Nobita

+1

@Nobita bonne prise, merci. Fixe – Basic

+0

En fait, il se peut que l'instruction if soit abandonnée en ne laissant que le 'posElem.style.cssText + = newStyle' (encore une fois, voir mise à jour [fiddle] (http://jsfiddle.net/gleezer/Ae4XR/2/)) car il semble fonctionner de la même manière, même si les styles ne sont pas déjà là. Pas sûr des bizarreries du navigateur ici. – Nobita

0

Si vous utilisez jQuery, il a une fonction de Css qui vous permet d'ajouter du style plusieurs à la fois:

('element').css({'color':'red', 'border':'#555 solid thin'}); $

+0

Belle réflexion - Je vais devoir regarder ce que cela fait réellement dans les coulisses – Basic

+2

Cela provoque toujours une refusion. – Tower

5

Vous pouvez mettre tous les styles dans un CSS classe

.foo { background:#000; color:#fff; ... } 

puis l'affecter à la propriété className

// javascript 
var your_node = document.getElementById('node_id'); 
your_node.className = 'foo' 

qui devrait déclencher une seule repeindre/refusion

+1

+1 Certainement l'approche à suivre, à mon avis. – lonesomeday

+2

-1 Ne répond pas vraiment à la question, si les propriétés étaient connues, évidemment la classe CSS serait le chemin à parcourir, cependant, si vous utilisez js pour calculer. les valeurs, alors cela ne fonctionnerait pas. – Kayote

0

Vous pouvez définir la visibilité de l'élément « caché », puis appliquer les styles et le rendre visible à nouveau.

+1

Cela provoque toujours une refusion. – Tower

4

utilisation:

document.getElementById('elemnt_ID').setAttribute('style','color:white; margin:5px;');