Wie kann ich mehrere Kontrollkästchen wie GMail mit der Umschalttaste auswählen?
Lesezeit: 5 Minuten
In GMail kann der Benutzer auf ein Kontrollkästchen in der E-Mail-Liste klicken, die Umschalttaste gedrückt halten und ein zweites Kontrollkästchen auswählen. Das JavaScript aktiviert/deaktiviert dann die Kontrollkästchen, die sich zwischen den beiden Kontrollkästchen befinden.
Ich bin gespannt, wie das gemacht wird? Ist das JQuery oder ein einfaches (oder komplexes) JavaScript?
Sie können Slice aufrufen, anstatt die for-Schleife zu verwenden. Das würde so aussehen: “$(‘.chkbox’).slice(min…, max… + 1).attr(‘checked’, lastChecked.checked)”
– Matthew Crumley
18. März 2009 um 23:16 Uhr
Die Antwort ist ohne abstrahiertes Jquery-Plugin lahm. Also los geht’s gist.github.com/3784055
– Andy Ray
25. September 2012 um 19:54 Uhr
Scheint nicht zu funktionieren, wenn Sie mehrmals bei gedrückter Umschalttaste klicken, nachdem Sie einige Kontrollkästchen ohne Umschalttaste deaktiviert haben. jsfiddle.net/5fG5b
– Greg Pettit
18. Februar 2014 um 15:04 Uhr
Das ist, weil es sein sollte .prop('checked'nicht .attr('checked'. jsFiddle: jsfiddle.net/dn4jv9a5
– caitlin
7. Januar 2015 um 19:04 Uhr
@schnauss danke, du hast recht und ich habe die Antwort aktualisiert. Zu meiner Verteidigung wurde die ursprüngliche Antwort geschrieben, bevor prop() verfügbar war
– BC.
8. Januar 2015 um 20:16 Uhr
Ben S
Dies geschieht durch ziemlich einfaches Javascript.
Sie verfolgen die ID des zuletzt aktivierten Kontrollkästchens und wenn ein anderes Kontrollkästchen aktiviert ist, verwenden sie die shiftKey-Ereignisattribut um zu sehen, ob beim Klicken auf das Kontrollkästchen die Umschalttaste gehalten wurde. Wenn ja, setzen sie die geprüftes Eigentum jedes Kontrollkästchens zwischen den beiden auf wahr.
Um festzustellen, wann ein Kontrollkästchen aktiviert ist, verwenden sie wahrscheinlich ein anklicken Ereignis auf die Kontrollkästchen
Es scheint, als ob jede Antwort, die ich online finden kann, dafür vollständig von jQuery abhängig ist. JQuery fügt sehr wenig Funktionalität hinzu. Hier ist eine schnelle Version, die keine Frameworks erfordert:
function allow_group_select_checkboxes(checkbox_wrapper_id){
var lastChecked = null;
var checkboxes = document.querySelectorAll('#'+checkbox_wrapper_id+' input[type="checkbox"]');
//I'm attaching an index attribute because it's easy, but you could do this other ways...
for (var i=0;i<checkboxes.length;i++){
checkboxes[i].setAttribute('data-index',i);
}
for (var i=0;i<checkboxes.length;i++){
checkboxes[i].addEventListener("click",function(e){
if(lastChecked && e.shiftKey) {
var i = parseInt(lastChecked.getAttribute('data-index'));
var j = parseInt(this.getAttribute('data-index'));
var check_or_uncheck = this.checked;
var low = i; var high=j;
if (i>j){
var low = j; var high=i;
}
for(var c=0;c<checkboxes.length;c++){
if (low <= c && c <=high){
checkboxes[c].checked = check_or_uncheck;
}
}
}
lastChecked = this;
});
}
}
Und dann initialisieren Sie es, wann immer Sie es brauchen:
allow_group_select_checkboxes('[id of a wrapper that contains the checkboxes]')
Nun, der Beitrag ist ziemlich alt, aber hier ist eine Lösung, auf die ich gerade gestoßen bin: jQuery-Feld-Plug-in
var NUM_BOXES = 10;
// last checkbox the user clicked
var last = -1;
function check(event) {
// in IE, the event object is a property of the window object
// in Mozilla, event object is passed to event handlers as a parameter
if (!event) { event = window.event }
var num = parseInt(/box\[(\d+)\]/.exec(this.name)[1]);
if (event.shiftKey && last != -1) {
var di = num > last ? 1 : -1;
for (var i = last; i != num; i += di) {
document.forms.boxes['box[' + i + ']'].checked = true;
}
}
last = num;
}
function init() {
for (var i = 0; i < NUM_BOXES; i++) {
document.forms.boxes['box[' + i + ']'].onclick = check;
}
}
Ich habe die jQuery-Version von @BC genommen. und es in eine ES6-Version umgewandelt, da der Code das Problem eigentlich ziemlich elegant löst, falls jemand noch darüber stolpert …
Leicht zu findender Kern für die Antwort von @BC gist.github.com/3784055
– Andy Ray
25. September 2012 um 19:55 Uhr