Здесь есть несколько хороших решений, но большинство из них предполагает, что вы всегда хотите выбрать первый элемент, как он появляется в DOM в случае множественного выбора.
Чтобы исправить это, я сохраняю переменную (lastSelection
), которая содержит последний элемент, который был успешно запрошен (а не первый в DOM), к которому можно вернуться в случае нежелательного выбора.
var lastSelection;// this will record our last successful selection
$('#selectable').selectable({
filter: '.element',
selecting: function () {
if ($('.ui-selecting').length > 1) {
// if selecting multiple (lasso) we will ignore the selection and fallback
$('.ui-selecting').removeClass('ui-selecting');
$(lastSelection).addClass('ui-selecting');// if no value, nothing will be selected
}
},
stop: function () {
if ($('.ui-selected').length > 1) {
// looks like we have an invalid selection, fallback to lastSelection
// this handles the ctrl (windows), cmd (OSX) multi-select cases
$('.ui-selected').removeClass('ui-selected');
$(lastSelection).addClass('ui-selected');// if no value, nothing will be selected
} else {
if ($('.ui-selected').first().is('.element')) {
// if we successfully found a selection, set it as our new lastSelection value
lastSelection = $('.ui-selected')[0];
}
}
}
});
Примечание. Если вы хотите отменить выделение без нажатия Ctrl / CMD +, вам нужно будет обойти этот метод.
Я также хотел бы отметить, что tolerance: 'fit'
просто требует, чтобы лассо полностью окружало целевой элемент, чтобы выделить его, он не отключит выбор лассо, если ваши элементы не могут быть окружены в доступной области лассо. http://api.jqueryui.com/selectable/#option-tolerance