2010-02-08 4 views
3

J'écris un jquery-plugin, qui modifie une valeur css de certains éléments sur certaines actions utilisateur. Pour les autres actions, la valeur css doit être réinitialisée à sa valeur initiale.

Comme je n'ai trouvé aucun moyen de récupérer les valeurs css initiales, je viens de créer un tableau qui stocke toutes les valeurs initiales au début.

Je l'ai fait avec:

var initialCSSValue = new Array() 

tout à fait au début de mon plugin et plus tard, dans une sorte de boucle de configuration où tous mes éléments me accédé je

initialCSSValue[$(this)] = parseInt($(this).css('<CSS-attribute>')); 

Cela fonctionne très bien dans Firefox. Cependant, je viens de découvrir que IE (même v8) a des problèmes avec l'accès à la certaine valeur à nouveau en utilisant un autre

initialCSSValue[$(this)] 

dans le code. Je pense que cela est dû au fait que j'utilise un objet ($ (this)) comme nom de variable.

Y a-t-il un moyen de contourner ce problème?

Merci

+0

Une chose: Vous êtes instanciation d'un objet 'Array', mais vous ne l'utilisez pas comme' Array'. Vous devriez plutôt utiliser un objet nu. En JavaScript, les tableaux sont indexés par un nombre.Si vous n'indexez pas par un nombre, vous n'utilisez pas de tableau. JavaScript n'est pas un langage prenant en charge les tableaux associatifs. Pour plus d'informations sur ce sujet (la meilleure ressource que j'ai trouvé jusqu'à présent): http://blog.persistent.info/2004/08/javascript-associative-arrays.html –

+0

oui, vous avez raison - moi aussi lire que ce que l'on appelle des tableaux associatifs dans js sont des objets mais pas des tableaux réels. – speendo

Répondre

2

Utilisez $(this).data()

Au début, j'allais dire en utilisant une combinaison de l'ID et le nom d'attribut, mais chaque objet peut ne pas avoir une pièce d'identité. Au lieu de cela, utilisez les fonctions jQuery Data pour attacher l'information directement à l'élément pour un accès facile et unique.

quelque chose comme ça (Où <CSS-attribute> est remplacé par le nom d'attribut css):

$(this).data('initial-<CSS-attribute>', parseInt($(this).css('<CSS-attribute>'))); 

Ensuite, vous pouvez y accéder à nouveau comme ceci:

$(this).data('initial-<CSS-attribute>'); 

manière alternative à l'aide data:

Dans votre plugin, vous pourriez faire une petite fonction d'aide comme ceci, si y ous voulait éviter une trop grande utilisation data:

var saveCSS = function (el, css_attribute) { 
    var data = $(el).data('initial-css'); 
    if(!data) data = {}; 
    data[css_attribute] = $(el).css(css_attribute); 
    $(el).data('initial-css', data); 
} 
var readCSS = function (el, css_attribute) { 
    var data = $(el).data('initial-css'); 
    if(data && data[css_attribute]) 
    return data[css_attribute]; 
    else 
    return ""; 
} 
+1

On dirait une idée brillante! Je ne connaissais pas encore les fonctions de données (je suis assez nouveau pour jquery et javascript) mais je vais commencer à lire à ce sujet maintenant. Merci – speendo

+0

wow, fonctionne comme un charme et frappe mon intention encore mieux que ma première solution (paresseuse). – speendo

+0

@Marcel Génial! Assurez-vous de marquer cette réponse comme acceptée alors. Bonne chance avec votre projet et bienvenue sur Stack Overflow! –

1

L'indexation d'un tableau avec un objet jQuery semble louche. J'utiliserais l'identifiant de l'objet pour entrer le tableau.

initialCSSValue[$(this).attr("id")] = parseInt... 
+0

Cela ne fonctionnerait que si vous supposez que tout a un 'id ', ce qui est une hypothèse assez large. –

+0

Merci! L'utilisation de la carte d'identité ne semble pas très avantageuse dans ce cas, car il pourrait être possible que certains éléments apparaissent deux fois sur une page Web. Par exemple, si j'utilise mon plugin pour styliser une entrée de recherche, il pourrait y avoir une entrée de recherche dans la barre latérale d'une page et dans la partie principale d'une page de recherche générée par le même script de recherche. Dans ce cas, je devrais utiliser le même identifiant deux fois - impossible. – speendo

+0

Les identifiants doivent toujours être uniques. Vous pouvez entrer un autre attribut, mais les ID devraient être les plus faciles. –

0

Oh s'il vous plaît, ne fais pas ça ... :)

Écrivez quelques CSS et utiliser le addClass et removeClass - il laisse les styles intacts après.

+0

Je pensais à cela aussi et en fait j'étais prêt à le faire, si personne n'avait une meilleure idée ici. mais maintenant je suis vraiment content de la "solution -data" de Doug Neiners, qui fait exactement ce que l'on veut faire. Merci quand même! – speendo

Questions connexes