2010-01-19 7 views
9

Ich habe ein Standard select multiple HTML Eingabefeld, zum Beispiel:Wie kann die Auswahl einer Option in einer Mehrfachauswahl mit jQuery umgeschaltet werden?

<select multiple="multiple" size="5" id="mysel" name="countries"> 
    <option value="2">Afghanistan</option> 
    <option value="4">Aland</option> 
</select> 

Da es sich um einen Multi-Select, mehr als einen Wert, den Sie die CTRL Taste und wählen Sie weitere Elemente zu halten, hat zu wählen. Doch das, was ich erreichen will ist, dass:

  1. eine nicht ausgewählte Option anklicken, wählt es
  2. Durch Klicken auf eine ausgewählte Option Auswahl entfernen.

Die Idee ist, um zu vermeiden, die CTRL-Taste drücken und die Nutzungs Semantik dieses Eingabefeldes ändern. Elemente sollten nur durch Anklicken selektierbar und nicht auswählbar sein (dh Umschalten des Select-Status).

Ich konnte dies noch nicht implementieren. Der Pseudocode sollte ungefähr so ​​aussehen.

  1. Erfassen Sie ein Click-Ereignis.
  2. Überprüfen Sie, ob das Element, auf das geklickt wurde, nicht ausgewählt wurde, und wählen Sie es
  3. Oder wenn das Element, das geklickt wurde, ausgewählt wurde, heben Sie die Auswahl auf.

Wie soll ich das umsetzen?

Antwort

11

Sie können die folgenden Ausschnitt verwenden Sie den gewünschten Effekt

$("select[multiple] option").mousedown(function(){ 
    var $self = $(this); 

    if ($self.prop("selected")) 
      $self.prop("selected", false); 
    else 
     $self.prop("selected", true); 

    return false; 
}); 

In älteren Versionen von jQuery zu erreichen, wo prop() nicht verfügbar war:

$("select[multiple] option").mousedown(function(){ 
    var $self = $(this); 

    if ($self.attr("selected")) 
      $self.attr("selected", ""); 
    else 
     $self.attr("selected", "selected"); 

    return false; 
}); 
+0

Hallo TB, Ohh, danke eine Million mal !!!! Groß! Das wollte ich erreichen! Vielen Dank!! – tim

+3

Es wäre prägnanter, '$ self.prop ('selected',! $ Self.prop ('selected'));'. – nilskp

+2

@nilskp beachten Sie auch '' '$ self.prop ('ausgewählt', function (i, alt) {alt!});' '' ' – MoMolog

4

Sie haben Recht, wenn Sie das Standardverhalten von mehreren Eingabefeldern ändern möchten. Sie neigen dazu, einen negativen Beitrag zur Benutzererfahrung zu leisten, da der Zweck nicht klar vermittelt wird und die Benutzer möglicherweise nicht verstehen, wie sie richtig verwendet werden.

Auch die Neueinstellung einer Mehrfachauswahlbox ist nicht richtig. Wenn Sie erwägen, mehrere auszuwählen, möchten Sie vielleicht Ihr Design umgestalten. Vielleicht können Sie stattdessen Checkboxen verwenden?

Hier ist ein Artikel zum Thema: http://www.ryancramer.com/journal/entries/select_multiple/

+0

Hallo 2020vert. Danke für deine schnelle Antwort. Das ist ziemlich witzig, der Artikel, auf den Sie hingewiesen haben, habe ich bereits (teilweise) gelesen, als ich diesen Artikel bereits auf der Suche nach einer Lösung für mein Problem stolperte. Es wäre großartig, eine Lösung zu finden, wie sie mit dem "Umschalten" des Status gefragt wird. Ich denke, das sollte irgendwie möglich sein, aber leider gibt es keine einfache Möglichkeit, den Status auszuwählen/abzuwählen ... danke – tim

1

Wahrscheinlich einige Fix kommen mit den neuen jQuery-Versionen:

$("select[multiple] option").mousedown(function(){ 
    var $self = $(this); 

    if ($self.attr("selected")){ 
     $self.removeAttr("selected"); 
    } else { 
     $self.attr("selected", "selected"); 
    } 
    return false; 
}); 
2

Eine andere Variante ohne JQuery:

var multiSelect = {}; 

function init() {  
    var s = document.getElementsByTagName('select'); 
    for (var i = 0; i < s.length; i++) { 
    if (s[i].multiple) { 
     var n = s[i].name; 
     multiSelect[n] = []; 
     for (var j = 0; j < s[i].options.length; j++) { 
     multiSelect[n][j] = s[i].options[j].selected; 
     } 
     s[i].onclick = changeMultiSelect; 
    } 
    } 
} 

function changeMultiSelect() { 
    var n = this.name; 
    for (var i=0; i < this.options.length; i++) { 
    if (this.options[i].selected) { 
     multiSelect[n][i] = !multiSelect[n][i]; 
    } 
    this.options[i].selected = multiSelect[n][i]; 
    } 
} 

window.onload = init; 
0

mit jQuery 1.9.1 der Javascript-Code ist:

$("select[multiple] option").mousedown(function() { 
     var $self = $(this); 
     if ($self.prop("selected")) 
      $self.removeAttr("selected"); 
     else 
      $self.attr("selected", "selected"); 
     return false; 
    }); 
4

ich diese Lösung gerade versucht, und die gewählte Antwort für JQuery 1.9 hat nicht funktioniert.1

Die Antwort von Oscar sah viel besser, aber es gemischte Eigenschaften mit Attributen und funktioniert nicht, wenn Sie wählen, Abwahl dann versuchen Sie es erneut zu wählen, wie es die Auswahl in einen unbrauchbaren Zustand versetzt

ich gefunden habe, die richtige Antwort war für mich das folgende

$("select[multiple] option").mousedown(function() { 
     if ($(this).prop("selected")) 
      $(this).prop("selected", false); 
     else 
      $(this).prop("selected", true); 
     return false; }); 

ich hoffe, das hilft anderen;)

+0

Es sieht so aus, als ob die akzeptierte Antwort Ninja-bearbeitet wurde, um deine Antwort zu kopieren, aber ich denke, ich weiß nicht, was es vorher war. – PrinceTyke

+0

Zumindest jemand mochte meine Lösung genug, um zu kopieren, denke ich;) Mitleid über die Geschichte der Frage und alle zukünftigen Benutzer stecken auf vor 1.9.1 jQuery, Thx für die Kenntnis von @PrinceTyke – duindain

1

Javascript (ohne jquery):

var select = document.getElementById('mysel'); 
select.addEventListener('mousedown', function(e){ 
    var opt = e.target; 
    if (opt.selected){ 
     opt.removeAttribute('selected'); 
     opt.selected = false; 
    } else { 
     opt.setAttribute('selected', ''); 
     opt.selected = true; 
    } 
    e.preventDefault(); 
}); 

Ich sehe die meisten der oben genannten Antworten sind das Ereignis mit der Option, anstelle der Auswahl verbindlich. Wenn meine Auswahl 1000 Optionen hat, werden 1000 Ereignisse gebunden. Beeinflusst dies die Leistung?

Aus diesem Grunde ich entscheiden, auch nicht meinen Fall in der Option zu binden.

Verwandte Themen