2009-08-31 7 views
1
$selectMenus = $("#experiences").find('select'); 

$tab.find('input').each(function(i) { 
    var $elem = $(this); 
    var value = $elem.attr('value'); 
    if(!value) 
     value = ' '; 
    $parent = $elem.parent(); 
    $elem.remove(); 
    $parent.html(value); 
}); 

$tab.find('select').each(function(i) { 
    $('option', this)[$selectMenus[i].selectedIndex].selected = true; 
    var $elem = $(this); 
    var value = $elem.attr('value'); 
    if(!value) 
     value = ' '; 
    $parent = $elem.parent(); 
    $elem.remove(); 
    $parent.html(value); 
}); 

Notez que les deux sont presque les mêmes.Comment rendre cet extrait jQuery plus compact?

+0

Vous pouvez obtenir un meilleur taux de réponse si vous acceptez certaines des 76% de vos questions qui restent non acceptées. (J'accepte que certaines de ces questions soient encore sans réponse, cependant.) –

+0

Vous plaisantez, ricebowl? Geeze! –

+0

Édité ma réponse - pas envoyé par texto mais – Greg

Répondre

4

Cela dépend du fait que les éléments d'entrée ne contiennent pas d'éléments d'option, mais je pense que c'est ce que vous recherchez. Dans le cas où il n'y a pas d'éléments d'option, l'attribut n'est simplement pas appliqué. Notez que si vous remplacez le code HTML de l'élément parent, il n'est pas nécessaire de supprimer explicitement les éléments enfants du DOM.

var elems = $tab.find('input, select'); 
elems.each(function() { 
    var $elem = $(this); 
    var i = elems.filter('select').index($elem); 
    $(elem).find('option') 
      .eq($selectMenus[i].selectedIndex) 
      .attr('selected','selected'); 

    var value = $elem.val(); 
    if(!value) value = ' '; 
    $elem.parent().html(value); 
}); 
+0

Vous n'avez pas fait attention à la variable i. Il est presque là, cependant. – omg

+0

Fixé. Nécessite de parcourir à nouveau la liste pour trouver l'index spécifié. – tvanfosson

+0

Presque à droite, sauf que vous devez vérifier que i> = 0 avant d'exécuter: $ (elem) .find ('option') .eq ($ selectMenus [i] .selectedIndex) .attr ('selected', 'selected') – omg

1

Essayez ceci:

var i = 0; 
$tab.find('input, select').each(function() { 
    var $elem = $(this); 

    if (this.tagName == 'select') 
     $elem.val($selectMenus[i++].selectedIndex) 

    var value = $elem.val(); 

    $elem.parent().html(value ? value : ' '); 
}); 
+0

find ('input, select') est ce que j'aime, mais attention à la variable i, c'est là que se situe la difficulté. – omg

+0

Édité pour corriger .. – Greg

1

Eh bien je pouvais voir ce optimzation:

function doSomething(elem) 
{ 
    var value = $(elem).attr('value') ? $(elem).attr('value') : ' '; 
    $(elem).parent().html(value); 
} 

$tab.find('input').each(function(i) { 
    doSomething(this); 
}); 

$tab.find('select').each(function(i) { 
    $('option', this)[$selectMenus[i].selectedIndex].selected = true; 
    doSomething(this); 
}); 

Je pense que si vous remplacez déjà les parents, HTML, vous ne devez pas enlever plus élément, car il a déjà obtenu remplacé (quelqu'un me corrige si je me trompe). La façon de le compacter est juste un moyen de préférence personnelle. Gardez toujours la lisibilité à l'esprit, aussi. Trop d'optimisations comme celle-ci pourraient rendre la tâche difficile. Je pense que pour des raisons de taille, un packer JavaScript pour le code de production pourrait aussi être un bon choix.

+0

Pouvez-vous l'optimiser par: find ('input, select')? La principale difficulté est causée par la variable i. – omg

+0

Vrai ... ça n'a même pas l'air très joli. Je suis d'accord que la solution tvanfosson est la plus belle :) – Daff

Questions connexes