Jeśli masz wiele opcji lub ten kod musiał być uruchamiany bardzo często, powinieneś rozważyć użycie DocumentFragment zamiast wielokrotnie niepotrzebnie modyfikować DOM. Tylko dla kilku opcji powiedziałbym, że nie warto.
DocumentFragmentjest dobrą opcją dla zwiększenia prędkości, ale nie możemy utworzyć elementu opcji przy użyciu, document.createElement('option')ponieważ IE6 i IE7 go nie obsługują.
Co możemy zrobić, to utworzyć nowy element select, a następnie dołączyć wszystkie opcje. Po zakończeniu pętli dołącz ją do rzeczywistego obiektu DOM.
Parametry metody są nieco mylące, na przykład funkcją (val, text) powinna być funkcja (indeks, opcja). Działa dobrze inaczej.
mbillard
14
@ Crossbrowser: Nie zgadzam się - vali textfaktycznie opisuję zmienne i ich użycie.
nickf
1
tylko dla tego przykładu, jednak jako metoda ogólnego przeznaczenia, te zmienne wprowadzają w błąd (nie dało mi to pojęcia, jak użyć tej metody). Dam jednak, że odpowiedź nie dotyczyła użycia metody $ .each.
mbillard
1
Wcześniej korzystałem mySelect.append(new Option(text, val));, co nie działało w IE8. Musiałem przejść na @ nickf'smySelect.append($('<option></option>').val(val).html(text));
Matthew Clark,
5
@briansol:.attr('selected', true|false)
nickf
167
Bez wtyczek może to być łatwiejsze bez użycia tak dużej ilości jQuery, zamiast nieco więcej starej szkoły:
var myOptions ={
val1 :'text1',
val2 :'text2'};
$.each(myOptions,function(val, text){
$('#mySelect').append(newOption(text,val));});
Jeśli chcesz określić, czy opcja a) jest domyślnie wybraną wartością, a b) powinna być teraz wybrana, możesz przekazać jeszcze dwa parametry:
var defaultSelected =false;var nowSelected =true;
$('#mySelect').append(newOption(text,val,defaultSelected,nowSelected));
Jeśli użyjesz podwójnych cudzysłowów w parametrach opcji, zamkną one funkcję i złamią skrypt. Zmiana .prepend("...") / $("...")na .prepend('...') / $('...')naprawiłaby fragment kodu.
Heraldmonkey
4
Uwaga Pease @ Rozwiązanie Phrogza nie działa w IE 8, podczas gdy @ nickf działa we wszystkich głównych przeglądarkach. Innym podejściem jest:
Musiałem dodać tyle opcji do menu rozwijanych, ile było ich na mojej stronie. Użyłem go w ten sposób:
function myAppender(obj,value, text){
obj.append($('<option></option>').val(value).html(text));}
$(document).ready(function(){var counter =0;var builder =0;// Get the number of dropdowns
$('[id*="ddlPosition_"]').each(function(){
counter++;});// Add the options for each dropdown
$('[id*="ddlPosition_"]').each(function(){var myId =this.id.split('_')[1];// Add each option in a loop for the specific dropdown we are onfor(var i=0; i<counter; i++){
myAppender($('[id*="ddlPosition_'+myId+'"]'), i, i+1);}
$('[id*="ddlPosition_'+myId+'"]').val(builder);
builder++;});});
To dynamicznie konfigurowało listy rozwijane z wartościami od 1 do n i automatycznie wybierało wartość dla kolejności, w jakiej znajdowało się menu rozwijane (tj. Drugie menu zawierało „2” w polu itp.).
To było śmieszne, że nie mogę używać thislub this.Objectlub $.objlub coś podobnego w moim 2nd .each(), choć --- I rzeczywiście było uzyskać identyfikator specyficzny tego obiektu, a następnie pobrać i przekazać, że cały obiekt do mojej funkcji przed byłoby dołączyć. Na szczęście ID mojej listy rozwijanej było oddzielone znakiem „_” i mogłem je zdobyć. Nie sądzę, że powinienem był to zrobić, ale w przeciwnym razie dawało mi to wyjątki jQuery. Coś, co walczyło z tym, czym byłem, może cieszyć się wiedząc.
Dlaczego zwiększasz licznik w każdym z nich? Czy jesteś nowy w jquery? var counter = $ ('[id * = "ddlPosition _"]'). długość jest mniej szczegółowa i bardziej wydajna. Myślę, że potrzebujesz trochę więcej doświadczenia, zanim zaczniesz publikować swój kod. To nie jest kod jakości produkcji, ponieważ jest źle napisany i zbyt skomplikowany do tak trywialnego zadania. Bez obrazy, ale jest powód, dla którego masz 58 odpowiedzi i brak jest głosów.
Ateny Holloway,
Oczywiście źle zrozumiałeś, co tworzyłem. Licznik ma zwiększyć wartość opublikowaną w menu rozwijanym, a ja miałem kilka z tym samym identyfikatorem, tylko z innym „_ ##” na końcu, więc .length () byłby niedokładny. To jest powód „id * =” w selektorze.
vapcguy
Co do moich innych odpowiedzi, generalnie opowiadam się za prostszymi metodami, gdy tylko jest to możliwe, a jeśli ludzie nie byliby tak ezoteryczni w kodowaniu i pisali rzeczy, które byłyby bardziej uproszczone, moje odpowiedzi prawdopodobnie miałyby więcej głosów. Ale ludzie chcą sprawić, by wyglądali elegancko i dlatego nie wybiorą czegoś tak prostego. Nie robi mi to krzywdy, że chcę po prostu branży. Nie lubię też rozwiązywać problemów ani wykorzystywać kodu innych osób, który jest śmiesznie bardziej złożony, niż musi być.
vapcguy
Mógłbym też mieć więcej zaufania do $ (this) .length () w tej pętli, jeśli ktoś mógłby wyjaśnić, dlaczego wysyłanie „$ (this)” zamiast obiektu do myAppender nie działało.
vapcguy
0
Pomyślmy, że twoją odpowiedzią jest „successData”. Zawiera listę, którą należy dodać jako opcje w menu rozwijanym.
success:function(successData){var sizeOfData = successData.length;if(sizeOfData ==0){// NO DATA, throw an alert ...
alert ("No Data Found");}else{
$.each(successData,function(val, text){
mySelect.append(
$('<option></option>').val(val).html(text));});}}
Odpowiedzi:
Bez użycia dodatkowych wtyczek,
Jeśli masz wiele opcji lub ten kod musiał być uruchamiany bardzo często, powinieneś rozważyć użycie DocumentFragment zamiast wielokrotnie niepotrzebnie modyfikować DOM. Tylko dla kilku opcji powiedziałbym, że nie warto.
------------------------------- Dodany ------------------ --------------
DocumentFragment
jest dobrą opcją dla zwiększenia prędkości, ale nie możemy utworzyć elementu opcji przy użyciu,document.createElement('option')
ponieważ IE6 i IE7 go nie obsługują.Co możemy zrobić, to utworzyć nowy element select, a następnie dołączyć wszystkie opcje. Po zakończeniu pętli dołącz ją do rzeczywistego obiektu DOM.
W ten sposób zmodyfikujemy DOM tylko raz!
źródło
val
itext
faktycznie opisuję zmienne i ich użycie.mySelect.append(new Option(text, val));
, co nie działało w IE8. Musiałem przejść na @ nickf'smySelect.append($('<option></option>').val(val).html(text));
.attr('selected', true|false)
Bez wtyczek może to być łatwiejsze bez użycia tak dużej ilości jQuery, zamiast nieco więcej starej szkoły:
Jeśli chcesz określić, czy opcja a) jest domyślnie wybraną wartością, a b) powinna być teraz wybrana, możesz przekazać jeszcze dwa parametry:
źródło
"<option></option>"
metoda; to wydaje się brudne.Dzięki wtyczce: jQuery Selection Box . Możesz to zrobić:
źródło
Możesz najpierw wyczyścić DropDown $ ('# DropDownQuality'). Empty ();
Mój kontroler w MVC zwrócił listę wyboru zawierającą tylko jeden element.
źródło
Na początku dodaj pozycję do listy
Dodaj pozycję do listy na końcu
Typowa operacja rozwijania (Pobierz, Ustaw, Dodaj, Usuń) za pomocą jQuery
źródło
.prepend("...") / $("...")
na.prepend('...') / $('...')
naprawiłaby fragment kodu.Uwaga Pease @ Rozwiązanie Phrogza nie działa w IE 8, podczas gdy @ nickf działa we wszystkich głównych przeglądarkach. Innym podejściem jest:
źródło
Możesz używać bezpośrednio
$"(.ddlClassName").Html("<option selected=\"selected\" value=\"1\">1</option><option value=\"2\">2</option>")
-> Tutaj możesz użyć bezpośredniego ciągu
źródło
A także użyj .prepend (), aby dodać opcję na początku listy opcji. http://api.jquery.com/prepend/
źródło
używając jquery, której możesz użyć
gdzie „ myid ” to identyfikator listy rozwijanej, a nowa wartość to tekst, który chcesz wstawić.
źródło
Musiałem dodać tyle opcji do menu rozwijanych, ile było ich na mojej stronie. Użyłem go w ten sposób:
To dynamicznie konfigurowało listy rozwijane z wartościami od 1 do n i automatycznie wybierało wartość dla kolejności, w jakiej znajdowało się menu rozwijane (tj. Drugie menu zawierało „2” w polu itp.).
To było śmieszne, że nie mogę używać
this
lubthis.Object
lub$.obj
lub coś podobnego w moim 2nd.each()
, choć --- I rzeczywiście było uzyskać identyfikator specyficzny tego obiektu, a następnie pobrać i przekazać, że cały obiekt do mojej funkcji przed byłoby dołączyć. Na szczęście ID mojej listy rozwijanej było oddzielone znakiem „_” i mogłem je zdobyć. Nie sądzę, że powinienem był to zrobić, ale w przeciwnym razie dawało mi to wyjątki jQuery. Coś, co walczyło z tym, czym byłem, może cieszyć się wiedząc.źródło
Pomyślmy, że twoją odpowiedzią jest „successData”. Zawiera listę, którą należy dodać jako opcje w menu rozwijanym.
To by działało dla ciebie ....
źródło
spróbuj tej funkcji:
źródło