2010-11-12 1 views
3

Remarque: J'ai trouvé le causant de mon problème. Voir ci-dessous pour plus d'informations..hide() et .show() ne mettent pas correctement en cache la propriété d'affichage CSS

Je serai concis. Voici mon scénario:

Le fichier HTML:

<form id="login"> 
<label for="editable">i'm a label for editable</label> 
<input id="editable" type="text" /> 
</form> 

Le fichier CSS:

#login label { display: block } 

Le fichier JS:

$(document).ready(function() { 
    $('#login label').hide().show(); 
}); 

Le comportement souhaité est de montrer à nouveau l'élément avec les mêmes propriétés CSS (display: block), mais dans le DOM il semble que le label élément obtient un autre (peut-être le défaut?) Ones (dans ce cas, display: inline). Note: J'ai vérifié les fichiers HTML et CSS. Tout est correct. Le problème est dans le fichier javascript.

Vu sur les docs API de jQuery, en ce qui concerne la méthode .hide():

sans paramètre, la méthode .hide() est la plus simple façon de cacher un élément:

$ ('cible').cacher();

Les éléments correspondants seront masqués immédiatement, sans animation. Cela équivaut à peu près à appeler .css ('display', 'none'), sauf que la valeur de la propriété d'affichage est enregistrée dans le cache de données de jQuery afin que l'affichage puisse être restauré à sa valeur initiale. Si un élément a une valeur d'affichage en ligne, puis est masqué et affiché, il sera de nouveau affiché en ligne.

Vu sur les docs API de jQuery, en ce qui concerne la méthode .show():

sans paramètre, la méthode .Show() est le plus simple moyen d'afficher un élément:

$ (» cible. ').montrer();

Les éléments correspondants seront révélés immédiatement, sans animation. Cela équivaut à peu près à appeler .css ('display', 'block'), sauf que la propriété d'affichage est restaurée à ce qu'elle était initialement. Si un élément a une valeur d'affichage en ligne, puis est masqué et affiché, il sera de nouveau affiché en ligne.

Ai-je raté quelque chose? J'ai tort? Ou est juste un comportement non désiré?

Merci d'avance.

Solution

Inclure le CSS d'abord, puis la JS plus tard.

+0

Il se comporte correctement pour moi dans Safari et Chrome. L'affichage est restauré pour bloquer. Quel navigateur vous pose des problèmes? Et quelle version de jQuery utilisez-vous? – user113716

+1

Votre CSS est-il chargé avant l'exécution de jQuery? J'utilise la même version de Chrome que vous, et ça va. – user113716

+0

J'utilise la dernière version minifiée (1.4.3). Chrome 7 (dernière version stable) pour OSX. Le CSS est lié est dans la tête (c'est aussi '@ import 'le fichier' html5reset.css', mais il n'altère pas l'étiquette dans ce cas ...), et le script se trouve avant la fermeture '' marque. – frarees

Répondre

1

Incluez d'abord le CSS, puis le JS plus tard.

1

hide() et show() ne modifiez pas les propriétés de la classe CSS d'un élément.

Mettez display:none comme en ligne en style de tout ce que vous voulez cacher par défaut. Ne le mettez pas dans la classe CSS et tout ira bien.

+0

Il n'est pas possible de récupérer les valeurs de CSS? Dois-je les intégrer au format HTML? (Je veux vraiment prendre le CSS et le HTML aussi splitté que possible) – frarees

+0

Comment cela ferait-il afficher 'block' au lieu de son naturel' inline' lors de la présentation? – user113716

+0

Vous l'avez mis dans sa classe CSS. –

0

Cela fonctionne très bien dans FF3.6, IE8, Safari5, Chrome et Opera10

Voici une demohttp://www.jsfiddle.net/kjwxu/

Essayez cette

$(document).ready(function() { 
    $('#login label').hide().show("fast", function() {$(this).attr("display", "block")}); 
}); 

A noter également si vous ne aimez pas le scintillement alors vous pouvez supprimer "rapide" et remplacer par 1 (ce qui signifie 1 milliseconde)

Voici un demohttp://www.jsfiddle.net/kjwxu/3/

+0

Même. J'ai essayé sur Chrome et le simuler sur [jsbin] (http://jsbin.com/usetu3). Tout fonctionne correctement. – subosito

+0

J'utilise Chrome 7 pour OSX (dernière version stable) sur un serveur local, et pour moi, cela ne fonctionne pas. – frarees

+0

@frarees .. J'ai fourni une possibilité et un travail potentiel. Je ne cours pas MacOSX et ne peux pas tester, mais cela devrait fonctionner. –

0

Vous ne savez pas pourquoi vous rencontrez ce problème, mais une solution de contournement consiste à ajouter une classe afin de la styler.

CSS

#login label { display: block } 
#login label.hidden { display: none } 

JS

$('#login label').addClass('hidden').removeClass('hidden'); 

EDIT: Semble de notre discussion dans les commentaires, que commentant les importations de CSS supplémentaires résolu le problème.

+0

oui oui. Au fait, merci pour votre réponse! – frarees

+0

@frarees - De rien. : o) – user113716

+0

@frarees - Commentant ici depuis votre nouvelle question car ils sont liés. Que se passe-t-il si vous donnez un peu de retard à votre code? Comme 'setTimeout (function() {$ ('# étiquette de connexion'). Hide(). Show();}, 200);' Est-ce que cela le fait fonctionner correctement? – user113716

Questions connexes