2010-09-24 12 views
0

Pour continuer le long de ma série de solutions élégantes, j'essaie de comprendre comment faire mieux.Vous cherchez une meilleure/élégante solution à ce code JQuery

Je passe en revue tous les tags a et essaye de modifier le href.

Ce code fonctionne mais semble négligent et aimerait savoir comment le faire plus efficacement.

$('a').each(function(){ 
    x=$(this).attr('href').replace(/mls\_number/i,'interior=yes&mls_number'); 
    $(this).attr('href', x); 
}); 
+1

Le code JavaScript que vous avez posté n'est pas valide sur le plan syntaxique. Pourriez-vous poster un extrait complet? –

Répondre

1
$('a').each(function(i, e) { 
    e.href = e.href.replace(/mls\_number/i,'interior=yes&mls_number'); 
}); 

Ou avec quelques extensions Mozilla JS

Array.forEach(document.getElementsByTagName('a'), function(e) { 
    e.href = e.href.replace(/mls\_number/i,'interior=yes&mls_number'); 
}); 
+0

fonctionne parfaitement et a du sens – 7null

9

Vous pouvez utiliser la surcharge de fonction .attr() qui vous permet de modifier une valeur d'attribut existant:

$('a').attr('href', function(index, attr) { 
    return attr.replace(/mls\_number/i, 'interior=yes&mls_number'); 
}); 
+0

une explication aurait été bonne, plutôt que de donner une réponse à une cuillère. – Spudley

+1

@Spudley: Je ne pense pas que ce soit près d'une réponse mystérieuse. –

+3

@Spudley, c'est la beauté de jQuery. Le code devrait être assez explicite à toute personne ayant une culture générale jQuery. –

1

A POJ mises en cache requête avec un compte à rebours tandis que la boucle sera le moyen le plus rapide de le faire:

var elms = Array.prototype.slice.apply(document.getElementsByTagName("a")), 
i = elms.length, 
e, 
href; 
while (i--) { 
    e = elms[i]; 
    href = e.href.replace(/mls\_number/i,'interior=yes&mls_number'); 
    e.setAttribute("href", href); 
} 
+0

Erm, quel est le point de convertir le NodeList à un tableau? Surtout si vous voulez de la vitesse ... – MooGoo

+0

Parce que vous pouvez utiliser un itérateur plus rapide, comme une boucle inverse (la plus rapide de JavaScript) au lieu d'une boucle for sur un objet DOMCollection. La conversion en tableau n'est pas lente, l'itération est lente. Nous voulons donc optimiser cette partie si possible. – AutoSponge

+0

Pourquoi ne pouvez-vous pas utiliser une boucle while inverse sur un NodeList? C'est un objet semblable à un tableau qui peut être consulté avec la notation de parenthèse et les clés numériques. En outre, je pense que vous surestimez fortement les avantages de performance de la boucle while inverse, à moins que la page ne contienne environ un million de '' tags. Vraiment, une grande majorité du temps sera passé dans 'getElementsByTagName' récursif à travers le DOM entier à la recherche de nœuds correspondants. Toutes les millisecondes ramassées par la suite sont négligeables en comparaison. – MooGoo

Questions connexes