2010-07-26 6 views
1

i ont une balise select multiple, regardez le script s'il vous plaîtSupprimer l'attribut sélectionné du premier élément sélectionné dans l'étiquette de sélection?

<select multiple="multiple" size="5" id="cities_select"> 
    <option value="1">city1</option> 
    <option value="2">city2</option> 
    <option value="3">city3</option> 
    <option value="4">city4</option> 
    <option value="5">city5</option> 
    <option value="6">city6</option> 
    ................................ 
</select> 

et un script jquery:

$("#supply_cities_select").change(function() 
{ 
    var i = 1; 
    $('#supply_cities_select :selected').each(function(u) 
    { 
     src += '&c'+i+'='+$(this).val();//generates the string like &c1=1&c2=2&c3=7... 
     i++; 
    }); 
}) 

i besoin de ma chaîne de ne pas avoir des éléments plus alors 5

exemple:

si j'ai déjà 5 éléments sélectionnés, ma chaîne ressemble à

&c1=2&c2=3&c3=5&c4=6&c5=7 

maintenant si une autre option est sélectionnée, je dois obtenir la chaîne

&c1=3&c2=5&c3=6&c4=7&c5=8 

si être court, je dois supprimer l'attribut sélectionné de premier élément sélectionné.

(mais je ne peux pas utiliser .first ici, car il peut être élément N8 le premier sélectionné)

comment puis-je le faire?

Merci beaucoup.

MISE À JOUR

var a = $("#supply_cities_select :selected").length; 
if(a > 5) 
{ 
    $("#supply_cities_select :selected:lt(1)").attr("selected",false); 
} 

il suffit de retirer les sapins option sélectionnée, non?


Répondre

2

Vous pouvez le faire un peu plus simple usign .map() et :lt() comme ceci:

var src; 
$("#supply_cities_select").change(function() { 
    src = $("#supply_cities_select :selected:lt(5)").map(function(i) { 
     return '&c'+(i+1)+'='+this.value; //i starts at 0, so add 1 
    }).get().join(''); 
})​; 

You can try a demo here. Le sélecteur :lt() obtient le premier 5 (moins de 5, 0, donc (0-4), puis nous utilisons .map() pour obtenir les valeurs dans un tableau, puis appelez .join() pour obtenir une chaîne de ce tableau ajouté ensemble .


pour la mise à jour: pour obtenir les derniers 5 éléments, il est préférable d'utiliser .slice(), comme ceci:.

var src; 
$("#supply_cities_select").change(function() { 
    src = $("#supply_cities_select :selected").slice(-5).map(function(i) { 
     return '&c'+(i+1)+'='+this.value; //i starts at 0, so add 1 
    }).get().join(''); 
})​; 

You can give it a try here

+0

Merci beaucoup, je n » Je ne connais pas la méthode ': lt()', et qu'en est-il d'une autre solution, regardez la mise à jour s'il vous plaît – Simon

+0

Mais est-ce que cela répond à cette question? "Si c'est court, j'ai besoin de supprimer l'attribut sélectionné du premier élément sélectionné." Je suppose que la seule façon de le faire efficacement est d'implémenter une file d'attente et de la maintenir avec l'élément select. Ceci n'est probablement pas la meilleure solution en termes d'UX - il n'y a pas de retour d'information évident pour indiquer que le premier élément sélectionné n'est plus sélectionné, ce qui est aggravé lorsque le premier élément sélectionné est hors écran. –

+0

@Syom - J'ai ajouté comment obtenir la chaîne comme si l'article n'était pas sélectionné, mais je suis d'accord avec le commentaire de Simon d'une perspective UI/UX ce n'est peut-être pas la meilleure idée, car il est seulement 5 grands. –

Questions connexes