2010-04-11 3 views
2
clone.find('[id]').each(function() { 
     id = $(this).attr('id'); 
     ind = id.search(/\d+$/); 
     $(this).attr('id', id.substr(0,ind)+id_counter); 
    }); 
    clone.find('[for]').each(function() { 
     id = $(this).attr('for'); 
     ind = id.search(/\d+$/); 
     $(this).attr('for', id.substr(0,ind)+id_counter); 
    }); 

Je sais que je peux trouver des éléments qui ont soit l'attribut idou l'attribut for, mais alors comment puis-je savoir qui je dois mettre?jQuery: Comment supprimer cette redondance de code?

+1

Vous voudrez peut-être ajouter 'var' avant d'assigner' id' et 'ind'. Sinon, vous créez des variables globales. – icktoofay

+0

@icktoofay: OHHH !! cela explique pourquoi mon code * autre * ne fonctionnait pas jusqu'à ce que je le fasse. Je n'avais pas réalisé que ça faisait une différence! – mpen

Répondre

3

Si tout ce que vous essayez de faire est de réduire le code, vous pourriez ...

function doTheseThings(element) { 
    clone.find(element).each(function() { 
     var id = $(this).attr('id'); 
     var ind = id.search(/\d+$/); 
     $(this).attr('id', id.substr(0,ind)+id_counter); 
    }); 
} 

doTheseThings('[id]'); 
doTheseThings('[for]'); 

ENCORE MIEUX:

j'ai décidé de fusionner ma première réponse avec quelques-uns de @ shinkirou idées et ajouter un peu plus la syntaxe Jquery-ish:

var items = ['[id]', '[for]']; 
$.each(items, function (index, element) { 
    clone.find(element).each(function() { 
     var id = $(this).attr('id'); 
     var ind = id.search(/\d+$/); 
     $(this).attr('id', id.substr(0,ind)+id_counter); 
    }); 
}); 
+0

Ajout de 'var' sur la recommandation de @ icktoofay. –

+0

Vous ne pouvez pas faire "array.each()" avec jQuery; c'est une chose prototype. Vous pensez à '$ .each (['id', 'for'], function() {...})' – Pointy

+0

Sur la recommandation de Pointy, j'ai corrigé le code. J'ai vu l'erreur de mes manières. :) –

3
var list = ['id', 'for'] 
for (var i in list) { 
    var v = list[i]; 
    clone.find('[' + v + ']').each(function() { 
    id = $(this).attr(v); 
    ind = id.search(/\d+$/); 
    $(this).attr(v, id.substr(0,ind)+id_counter); 
    }); 
} 
delete list; 
+1

Euh ... il n'y a pas de mot-clé 'foreach' dans Javascript. C'est une très mauvaise idée d'écrire des boucles 'for' avec" in "comme ça, parce qu'il pourrait y avoir d'autres choses sur cet objet de tableau que la boucle trébucherait. – Pointy

+0

... eh bien, il y a 'for each' dans le nouveau Javascript mais cela signifie quelque chose de différent et ce n'est vraiment pas pour les tableaux de toute façon. – Pointy

1

Eh bien, le redundency est en ce que le même code s'applique aux différents attributs , De sorte que vous tenez compte ceux sur:

$.each(['id', 'for'], function (ignr, attr) { 
    clone.find('['+attr+']').each(function() { 
     val = $(this).attr(attr); 
     ind = val.search(/\d+$/); 
     $(this).attr(attr, val.substr(0,ind)+id_counter); 
    }); 
}); 

Ensuite, si vous le souhaitez, vous pouvez supprimer une variable locale pour le raccourcir, mais je ne suis pas sûr que ce soit une amélioration:

$.each(['id', 'for'], function (ignr, attr) { 
    clone.find('['+attr+']').each(function() { 
     val = $(this).attr(attr); 
     $(this).attr(attr, val.substr(0,val.search(/\d+$/))+id_counter); 
    }); 
}); 
Questions connexes