2013-03-21 14 views
8

Ho creato questo fiddle, consente all'utente di fare clic su una grafica o video, popolando dinamicamente la seconda casella di riepilogo con l'elenco associato a tali selezioni. Ci sono due pulsanti, uno per aggiungere la selezione alla scatola, l'altro che rimuove la selezione.Jquery aggiunta e rimozione di elementi dalla listbox

Quello che mi piacerebbe fare è impedire all'utente di aggiungere alcuni che sono già stati aggiunti. Il valore delle opzioni sarà tutto Guids. Punti bonus se puoi modificare il violino per usare Guid invece di int.

Ho provato questo:

$.each($("#SelectBox2 option:selected"), function (i, ob) { 
    if (i == $(this).val()) { 

    } else { 
     inHTML += '<option value="' + $(this).val() + '">' + $(this).text() + '</option>'; 
    } 
}); 

vorrei consentire all'utente di rimuovere gli elementi selezionati dalla lista.

Grazie,

UPDATE Basta lasciare che voi ragazzi sa che cosa la soluzione è che mi è venuta, ho ottenuto i punti bonus, perché ho aggiunto GUID ad essa in un modo davvero intelligente :) fiddle, anche io riordinato l'html per renderlo bello e ordinato.

importante aggiornamento Una massiccia grazie a tutti coloro che hanno contribuito a questa domanda, mi hanno assunto tutti quanti bordo commenti e violini e hanno generato questo >>fiddle< <

+1

si fa a non rimuovere semplicemente la voce selezionata dalla matrice quando si fa clic aggiungere . Quando fai clic su "indietro", aggiungilo di nuovo. – DaveHogan

+0

ma in che categoria lo aggiungi? non lo saprai mai a meno che tu non usi un oggetto complesso per il valore invece di un semplice –

+0

@DaveHogan per favore vedi il mio ultimo violino nella domanda, prendi a bordo quello che hai detto sulla rimozione da un array e rimettendolo, infatti sono andato un ulteriore passo avanti, e ho appena detto se visualizzarlo o meno :) –

risposta

11

ti penso vorrebbe fare qualcosa di simile: Check if value is in select list with JQuery.

Modificare il codice per qualcosa come questo dovrebbe funzionare:

$("#SelectBox2 option:selected").each(function() { 
    var optionVal = $(this).val(); 
    var exists = false; 
    $('#SelectedItems option').each(function(){ 
     if (this.value == optionVal) { 
      exists = true; 
     } 
    }); 

    if(!exists) { 
     inHTML += '<option value="' + $(this).val() + '">' + $(this).text() + '</option>'; 
    } 
}); 

Rimozione di elementi selezionati sarebbe simile a questa:

$('#remove').click(function() { 
    $("#SelectedItems option:selected").remove(); 
}); 
+1

Questo funziona perfettamente, una soluzione così elegante –

+0

Si prega di vedere la mia domanda modificata :) Ho fatto un nuovo violino –

1

Ok per risolvere il tuo aggiungere la funzione è sufficiente aggiungere il seguente se la condizione ::

if($("#SelectedItems option:contains("+$(this).text()+")").length<=0)     
    inHTML += '<option value="' + $(this).text() + '">' + $(this).text() + '</option>'; 

per rimuovere gli elementi ::

$('#remove').click(function() { 
    $("#SelectedItems option:selected").each(function() { 
     $(this).remove(); 
    }); 
}); 

Ecco l'esempio dopo ho aggiornato lo jsfiddle

+0

La rimozione funziona, ma l'aggiunta di uno stesso oggetto una volta non ha funzionato per me. –

+0

scusa ho aggiornato il mio codice jsfiddle e il mio codice postato –

+0

dovrebbe essere .text() not .val() –

0

VEDERE LA scrittura LINK

se condizioni come

if($("#SelectedItems option:contains("+$(this).val()+")").length<=0)     
    inHTML += '<option value="' + $(this).val() + '">' + $(this).text() + '</option>'; 

Quindi aggiungere

$('#remove').click(function(){ 

    $('#SelectedItems :selected').each(function(i, selected) { 
    $(this).remove(); 
}); 
}); 
+0

@ No1_Melman controlla questo anwer una volta – PSR

+0

si prega di vedere il mio nuovo violino nella domanda, ha una soluzione davvero buona, potrebbe interessarti :) –

0

provare questo se si desidera impedire all'utente di aggiungere un'opzione che esiste già

$("#SelectBox2 option:selected").each(function() { 
      if( $("#SelectedItems option[value='"+$(this).val()+"']").length <=0) 
      inHTML += '<option value="' + $(this).val() + '">' + $(this).text() + '</option>'; 

     }) 

http://jsfiddle.net/j2ctG/8/

Aggiornato il violino per rimuovere anche.

0

ottenere l'elenco di opzioni esistenti, controllare se quelli si stanno aggiungendo già esistono, se non, aggiungerli:

http://jsfiddle.net/bZXs4/

$('#add').click(function() { 
    var inHTML = ""; 
    var $opts = $('#SelectedItems').find('option'); 

    $("#SelectBox2 option:selected").each(function() { 
     var allowItemToBeAdded = true; 
     var selectedVal = $(this).val(); 
     $opts.each(function(index, element){ 
      if($(this).val() === selectedVal){ 
       allowItemToBeAdded = false; 
      } 
     }); 

     if(allowItemToBeAdded){ 
      inHTML += '<option value="' + selectedVal + '">' + $(this).text() + '</option>'; 
     } 
    }); 

    if(inHTML !== ''){ 
     $("#SelectedItems").append(inHTML); 
    } 
}); 
2

Prova:

$(function() { 
    var artItems = ["Art 1", "Art 2", "Art 3", "Art 4", "Art 5", "Art 6"]; 
    var vidItems = ["Video 1", "Video 2", "Video 3", "Video 4", "Video 5", "Video 6"]; 
    $('#SelectBox').change(function() { 
     var str = "", 
      inHTML = "", 
      items; 
     items = $(this).val() == 'art' ? artItems : vidItems; 
     $.each(items, function (i, ob) { 
      inHTML += '<option value="' + i + '">' + ob + '</option>'; 
     }); 
     $("#SelectBox2").empty().append(inHTML); 
    }); 

    $('#SelectBox2').change(function() { 
     $("#selectedValues").text($(this).val() + ';' + $("#SelectBox").val()); 
     $('#hidden1').val($(this).val()); 
    }); 

    $('#add').click(function() { 
     inHTML = ""; 
     $("#SelectBox2 option:selected").each(function() { 
      if ($("#SelectedItems option[value=" + $(this).val() + "]").length == 0) { 
       inHTML += '<option value="' + $(this).val() + '">' + $(this).text() + '</option>'; 
      } 
     }); 
     $("#SelectedItems").append(inHTML); 
    }); 

    $('#remove').click(function() { 
     $('#SelectedItems option:selected').remove(); 
    }); 
}); 

Fiddle here

+0

Si prega di vedere la mia domanda aggiornata con l'ultimo violino :) –

1

Dai un'occhiata a questa soluzione: - Utilizzando i dati a tributo a tenere traccia del selettore degli elenchi genitori degli elementi e ad evitare un ciclo con l'aiuto di questo selettore e dell'attributo dei dati.

http://jsfiddle.net/pramodsankar007/rMpBv/

$('#add').click(function() { 
     var itemsToAdd = []; 
     $("#SelectBox2 option:selected").each(function() { 
      var optionVal = $(this).val(); 
      var key = $(this).data('key'); 
      if($('#SelectedItems option[value="' + optionVal + '"][data-key="' + key +'"]').length == 0) 
      { 
       itemsToAdd.push($(this).removeAttr('selected').clone(true)); 
      } 
     }); 
     $("#SelectedItems").append(itemsToAdd); 
    }); 
}); 
+0

Questo è bello, tutto ciò che serve ora è quello di implementare il trasferimento dell'elemento selezionato dalla casella di riepilogo 2 alla casella di elenco elemento selezionato, e quindi di nuovo indietro –

+0

sì che sarà più facile possibile poiché hai la chiave dei dati nella tua selezionata elenco di elementi, è possibile rimuoverli prima di aggiungerli all'evento di modifica. E rimuovi il clone mentre aggiungi. – PSL

+0

è un po 'confuso per me, quindi se dimostri che sarebbe ottimo –

2

Se si desidera aggiungere in modo dinamico ed eliminare righe senza soluzione di continuità provare in questo modo

http://jsfiddle.net/WX4Nw/

L'aggiunta di un puntatore alla lista SelectedItems come attrib dati alla chiave elemento principale ti aiuterà a controllare in modo da poter facilmente gestire aggiungere/rimuovere.

Snippet dal violino: -

$('#SelectBox').change(function() { 
     var str = "", 
      inHTML = "", 
      key = $('#SelectBox').val(), 
      items; 
     items = $(this).val() == 'art' ? artItems : vidItems; 
     $.each(items, function (i, ob) { 
      if($('#SelectedItems option[value="' + i + '"][data-key="' + key + '"]').length == 0) 
       inHTML += '<option value="' + i + '" data-key="' + key + '">' + ob + '</option>'; 
     }); 
     $("#SelectBox2").empty().append(inHTML); 
    }); 

$('#add').click(function() { 
     var itemsToAdd = []; 
     $("#SelectBox2 option:selected").each(function() { 
      var optionVal = $(this).val(); 
      var key = $(this).data('key'); 
      if ($('#SelectedItems option[value="' + optionVal + '"][data-key="' + key + '"]').length == 0)      { 
       itemsToAdd.push($(this).removeAttr('selected')); 
      } 
     }); 
     $("#SelectedItems").append(itemsToAdd); 
    }); 
+0

Come funziona la rimozione? Sono super confuso, è fantastico comunque. Roba veramente bella, mostra un vero potere di js! + –

+0

per favore vedi il mio aggiornamento nella domanda, penso che ti piaccia :) –

0

davvero pulito e semplice (grandi opere e solo poche righe):

 $("#icon_move_right").click(function(){ 
      $("#available_groups option:selected").each(function(){ 
       available_group = $(this).val(); 
       $("#assigned_groups").append("<option value='" + available_group + "'>" + available_group + "</option>"); 
      }); 
      $("#available_groups option:selected").remove() 
     }); 

     $("#icon_move_left").click(function(){ 
      $("#assigned_groups option:selected").each(function(){ 
       assigned_group = $(this).val(); 
       $("#available_groups").append("<option value='" + assigned_group + "'>" + assigned_group + "</option>"); 
      }); 
      $("#assigned_groups option:selected").remove() 
     }); 

     $("#icon_move_right_all").click(function(){ 
      $("#available_groups option").each(function(){ 
       available_group = $(this).val(); 
       $("#assigned_groups").append("<option value='" + available_group + "'>" + available_group + "</option>"); 
      }); 
      $("#available_groups option").remove() 
     }); 

     $("#icon_move_left_all").click(function(){ 
      $("#assigned_groups option").each(function(){ 
       assigned_group = $(this).val(); 
       $("#available_groups").append("<option value='" + assigned_group + "'>" + assigned_group + "</option>"); 
      }); 
      $("#assigned_groups option").remove() 
     }); 
Problemi correlati