2010-01-18 2 views
2

Je tire mes cheveux !! Grrr ...JQuery: chaîne de sélection avec filtre d'attribut: le résultat ne persiste pas?

Ce semble travailler:

//get all the foo and bar links that point to a named anchor: 
$("a.foo,a.bar").filter("[href^=#]").click 
(
    function() 
    { 
     doSomething($(this).attr("href").substr(1)); 
     return false; 
    } 
); 

Lorsque je me connecte la sortie '$ (this) .attr ("href") substr (1)' à la I console voir l'anchorname sans le hash, pour tous les liens pertinents. Tout bon. Mais à l'intérieur doSomething(), typeof() de dit que j'ai une chaîne - mais c'est vide !! Pourquoi?!!

function doSomething(str) 
{ 
    //log str : it's empty!! 
} 

Habituellement peu après que je pose une question à ici, il est trop bizarre pour quiconque de me aider ou je comprendre ma propre stupidité plus tard. J'espère que quelqu'un peut aider cette fois! :-(

============== SOLVED =====================

* ******** C'était ma propre stupidité **********

intérieur doSomething la première chose que mon code a été:

if(str = "") return; 

(gifles front). Merci à tous de me faire regarder cela d'une manière différente

Répondre

1

I can't reproduce this. Sonne comme un problème avec le code doSomething lui-même - faire une revue de code rapide pour vous assurer vous pointez la fonction droite et que vous n'êtes pas modifier l'argument avant utilisation .

+0

omg ... merci pour le commentaire sur 'modification de l'argument' ... Je me sens tellement stupide. J'avais fait 'if (str = "") retour; pouvez-vous repérer le problème? Yah ... – rekindleMyLoveOf

-2

essayez substr(0) premier caractère est à l'index 0 http://www.w3schools.com/jsref/jsref_substr.asp

+0

Je pense qu'il essaie délibérément d'omettre le #. – Matchu

+0

Eh bien, je pense que vous devriez toujours accepter ce que je pense – antpaw

+0

... Qu'est-ce que cela signifie? La saisie de xD est toujours appréciée, mais apprécier la contribution et dire qu'elle est fausse ne s'excluent pas mutuellement. – Matchu

0

note: Ce n'est pas la bonne réponse! Mais je vais le laisser ici au cas où il serait utile aux autres utilisateurs de Sizzle.


C'est un bug dans Sizzle (la bibliothèque de sélecteurs utilisée par jQuery).

Le problème est lorsque vous accédez link.href en JavaScript, vous ne recevez pas le texte de l'attribut href, vous obtenez l'URL absolue résolue. Naturellement, cela commence par http:// et non #.

Lorsque vous appelez link.attr('href') jQuery détecte le cas particulier et applique une solution de contournement. Lorsque vous utilisez un sélecteur, Sizzle ne le fait pas. Il essaie:

attrHandle: { 
    href: function(elem){ 
     return elem.getAttribute("href"); 
    } 
}, 

mais cette solution de contournement ne fonctionne pas sur IE jusqu'à la version 7, car ils font getAttribute égale à simplement obtenir la propriété JavaScript. [La solution correcte serait d'utiliser getAttributeNode à la place, ou renifler IE et utiliser l'extension du getAttribute('href', 2) propriétaire.]

Ainsi, le moteur de sélection obtient http://... pour l'attribut href et bien sûr cela ne correspond jamais à ^=#.

Si vous le faites vous-même avec une fonction de filtre, il devrait fonctionner:

$('a.foo, a.bar').filter(function() { 
    return $(this).attr('href').substring(0, 1)==='#'; 
})... 
+0

Hmm ... Je n'avais pas entendu parler de ça avant ... merci pour l'info! – rekindleMyLoveOf

+0

Ah ... on dirait que c'est OK dans ce cas. Sizzle a ce bug, mais les versions actuelles de jQuery monkey-patch la fonction incriminée pour le réparer! [Ligne 2196 de jQuery 1.3.2.] – bobince

Questions connexes