Javascript / jQuery: Ustaw wartości (wybór) w wielokrotnym wyborze

100

Mam wybór wielokrotny:

<select name='strings' id="strings" multiple style="width:100px;">
    <option value="Test">Test</option>
    <option value="Prof">Prof</option>
    <option value="Live">Live</option>
    <option value="Off">Off</option>
    <option value="On">On</option>
</select>

Ładuję dane z mojej bazy danych. Następnie mam taki ciąg:

var values="Test,Prof,Off";

Jak mogę ustawić te wartości w opcji wielokrotnego wyboru? Próbowałem już zmienić ciąg w tablicy i umieścić go jako wartość w wielokrotności, ale nie działa ...! Czy ktoś może mi w tym pomóc? DZIĘKI!!!

Zwen2012
źródło

Odpowiedzi:

133

Wykonaj iterację pętli, używając wartości w selektorze dynamicznym, który używa selektora atrybutu.

var values="Test,Prof,Off";
$.each(values.split(","), function(i,e){
    $("#strings option[value='" + e + "']").prop("selected", true);
});

Przykład roboczy http://jsfiddle.net/McddQ/1/

Kevin Bowersox
źródło
1
To fajne, ale jak powiesz, że wybrane vlaues powinny być wybierane w „wielokrotnym wyborze” z id = string?
Zwen2012
@ user1824136 Świetnie, cieszę się, że mogłem komuś pomóc dziś rano!
Kevin Bowersox
1
Jeśli i tak będziemy polegać na jQuery, zdecydowanie wolimy ŁukaszW.pl $('#strings').val(values.split(',')). Bez jQuery Plain Old Javascript ŁukaszW.pl document.getElementById('strings').value = ["Test", "Prof", "Off"]również działa w jednej linii
KyleMit
109

w jQuery:

$("#strings").val(["Test", "Prof", "Off"]);

lub w czystym JavaScript:

var element = document.getElementById('strings');
var values = ["Test", "Prof", "Off"];
for (var i = 0; i < element.options.length; i++) {
    element.options[i].selected = values.indexOf(element.options[i].value) >= 0;
}

jQuery robi tutaj znaczącą abstrakcję.

ŁukaszW.pl
źródło
1
To zadziałało idealnie dla mnie i moich `` wybranych '' wyborów ... muszę dodać wszystkie wartości naraz (tak jak powiedziałeś powyżej)
Todd Vance
4
Hmm, czysty javascript nie działa dla mnie na Chrome / Mac lub FF / Mac. Nie ma to wpływu na to, co faktycznie zostało wybrane, a przynajmniej na to, co pojawia się wizualnie jako wybrane w przeglądarce.
Bill Keese
3
Działa, gdy przekazuję ciąg, ale nie, gdy przekazuję tablicę.
Ravi G,
Mając ten sam problem; działa to tylko z wartościami ciągów, a nie z tablicami (używając zwykłego JS, a nie jQuery).
jayp
1
Jeśli masz z tym problemy, upewnij się, że wyzwalasz zdarzenie „zmiana” po ustawieniu wartości w JavaScript. Używając jQuery będzie to $ ("# stringi"). Val (["Test", "Prof", "Off"]). Trigger ('change');
Jon Wyatt
20

Po prostu podaj funkcję jQuery val tablicą wartości:

var values = "Test,Prof,Off";
$('#strings').val(values.split(','));

Aby uzyskać wybrane wartości w tym samym formacie:

values = $('#strings').val();
PostureOfLearning
źródło
8

Czyste rozwiązanie JavaScript ES6

  • Złap każdą opcję za pomocą querySelectorAllfunkcji i podziel valuesciąg.
  • Służy Array#forEachdo iteracji po każdym elemencie valuestablicy.
  • Użyj, Array#findaby znaleźć opcję pasującą do podanej wartości.
  • Ustaw jego selectedatrybut na true.

Uwaga : Array#fromprzekształca obiekt podobny do tablicy w tablicę, a następnie możesz używać Array.prototypena niej funkcji, takich jak wyszukiwanie lub mapowanie .

var values = "Test,Prof,Off",
    options = Array.from(document.querySelectorAll('#strings option'));

values.split(',').forEach(function(v) {
  options.find(c => c.value == v).selected = true;
});
<select name='strings' id="strings" multiple style="width:100px;">
    <option value="Test">Test</option>
    <option value="Prof">Prof</option>
    <option value="Live">Live</option>
    <option value="Off">Off</option>
    <option value="On">On</option>
</select>

miły użytkownik
źródło
2

Zasadniczo wykonaj a, values.split(',')a następnie przejrzyj wynikową tablicę i ustaw Select.

kashipai
źródło
1

Czyste rozwiązanie JavaScript ES5

Z jakiegoś powodu nie używasz jQuery ani ES6? To może ci pomóc:

var values = "Test,Prof,Off";
var splitValues = values.split(',');
var multi = document.getElementById('strings');

multi.value = null; // Reset pre-selected options (just in case)
var multiLen = multi.options.length;
for (var i = 0; i < multiLen; i++) {
  if (splitValues.indexOf(multi.options[i].value) >= 0) {
    multi.options[i].selected = true;
  }
}
<select name='strings' id="strings" multiple style="width:100px;">
    <option value="Test">Test</option>
    <option value="Prof">Prof</option>
    <option value="Live">Live</option>
    <option value="Off">Off</option>
    <option value="On" selected>On</option>
</select>

Mariano Desanze
źródło
0
var groups = ["Test", "Prof","Off"];

    $('#fruits option').filter(function() {
      return groups.indexOf($(this).text()) > -1; //Options text exists in array
    }).prop('selected', true); //Set selected
Członek con
źródło
0

to jest błąd w niektórych odpowiedziach do zamiany |

var mystring = "this|is|a|test";
mystring = mystring.replace(/|/g, "");
alert(mystring);

ta poprawka jest poprawna, ale | Ostatecznie powinno to wyglądać tak \ |

var mystring = "this|is|a|test";
mystring = mystring.replace(/\|/g, "");
alert(mystring);
Xavier Moreno
źródło