2009-11-29 5 views
1

Dans certaines conditions, je souhaite ouvrir des liens dans la même fenêtre, alors que dans d'autres, je souhaite les ouvrir dans une nouvelle fenêtre. J'ai le code jQuery suivant:La méthode jQuery attr ne parvient pas à ajouter un attribut

if (internal) { 
    jQuery(".main a").removeAttr('target'); 
} else { 
    jQuery(".main a").attr('target', '_blank'); 
} 

J'ai deux <a> s contenus dans la div "principale". L'un est directement sous la div tandis que l'autre est enterré sous un couple de sous-divs. Lorsqu'il s'exécute, il ajoute uniquement la cible vide à la première balise <a>. Cependant, lorsque je mets un point d'arrêt à travers Firebug et le franchis, tout fonctionne bien. Y at-il une raison pour que cela ne fonctionne pas à pleine vitesse? Quelle est la solution de contournement?

+1

Trouvez le plus petit exemple HTML où vous pouvez reproduire ceci et l'afficher ici. Le problème semble un peu étrange et ne devrait pas arriver vraiment. Le HTML est-il valide? – jitter

+1

je suis d'accord, il pourrait être mauvais syntaxe HTML – Ayyash

+0

Non, le HTML vérifie comme valide. En outre, il n'est pas facile de simplifier le contrôle en quelque chose de postable. Je vais y réfléchir cependant. –

Répondre

1

est le code exécuté en particulier lors de l'événement onload? En jQuery vous utilisez normalement $(document).ready() pour cela. Par exemple. Dans le cas contraire, il serait exécuté immédiatement alors que l'arborescence DOM HTML n'est pas encore entièrement construite et initialisée.

+0

+1 Pour un excellent raisonnement. Je suis d'accord que cela semble être le problème. –

+0

Excellente théorie, mais non. La fonction est exécutée à la suite d'un clic sur la page. Vous cliquez sur une image miniature, et la zone "principale" affiche une grande image. Cliquer sur l'image vous envoie vers un site externe ou une autre page interne. Cependant, il y a aussi un bouton qui a le même lien. C'est celui qui ne fonctionne pas. –

+0

OK, j'ai compris. Il y avait en fait une animation pour mettre le bouton en place, et à pleine vitesse, cela n'a pas été fait au moment où la fonction attr a fonctionné. Le point d'arrêt a changé le timing pour que tout fonctionne. Cette réponse est assez proche que je vais l'appeler correctement. –

0

Essayez d'utiliser each() pour parcourir les éléments A:

jQuery(".main a").each(function() { 
    $(this).attr('target', '_blank'); 
}); 
+1

Il ne devrait pas avoir à faire ça. La définition des attributs affecte tous les éléments sélectionnés: http://docs.jquery.com/Attributes/attr#keyvalue –

+0

J'étais sûr que ça allait marcher, mais il a le même comportement. Ça ne marche pas dans des conditions normales, mais quand je mets un breakpoint, tout va bien. –

Questions connexes