2009-05-14 13 views

Respuesta

9

No hay una manera definida. Sin embargo, puede pasar una función de devolución de llamada para eventos "Inicio" o "Seleccionado", que cancela la selección si se selecciona más de un elemento.

+0

gracias por su respuesta. Trataré de seguir tu camino – miti737

+0

Hola, ¿Cómo puedo evitar seleccionar un elemento cuando contiene la tecla CTRL? – miti737

2

Una discusión interesante acerca de esto se puede encontrar en this jQuery forum thread.

+0

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la opinión] (/ revisión/mensajes de baja calidad/18032764) – mx0

6

sí, se puede evitar este comportamiento, acaba de establecer la opción toletance de 'ajuste'

+0

Esto resuelve parte del problema - aún necesita una forma de evitar que el usuario mantenga presionada la tecla Ctrl y seleccionar elementos con el botón izquierdo del mouse haga clic en – Adam

+0

todo esto significa que debe enlazar toda la fila en lugar de solo una parte de la fila –

1

Usted puede crear su complemento personalizado como esto:

$.widget("xim.singleSelectable", { 
    options: { 
     select: null 
    }, 
    _create: function() { 
     var self = this; 
     this.element.addClass('ui-selectable'); 
     this.element.delegate('li', 'click', function (e) { 
      self.element.find('>li').removeClass('ui-selected'); 
      $(this).addClass('ui-selected'); 

      if ($.isFunction(self.options.select)) { 
       self.options.select.apply(self.element, [e, this]); 
      } 

     }); 
    }, 
    selected: function() { 
     return this.element.find('li.ui-selected'); 
    }, 
    destroy: function() { 
     $.Widget.prototype.destroy.apply(this, arguments); // default destroy 
    } 
}); 
28

lo que hice, es que permiten que múltiples selección, pero cuando se realiza la selección, i solamente guardar el primer elemento seleccionado

<ul id="select"> 
    <li>Row 1</li> 
    <li>Row 2</li> 
    <li>Row 3</li> 
</ul> 

Esto selecciona todos los elementos seleccionados excepto el primero y borra el estado seleccionado. Entonces, al final, solo se seleccionará un elemento. event.target corresponde a mi elemento ul.

$('#select').selectable({ 
    stop:function(event, ui){ 
     $(event.target).children('.ui-selected').not(':first').removeClass('ui-selected'); 
    } 
}); 

Sé que este tema es un poco viejo, pero todavía topé con él, por lo que puede ser útil a alguien más

+4

Antigua o no, usted me apuntó en la dirección correcta. Gracias, dood. – iLLin

+0

Gracias, buen hack :-) – ljs

+0

Como usted, acabo de encontrar esta pregunta. Escribí una solución en [http://stackoverflow.com/a/13727528/1747491](http://stackoverflow.com/a/13727528/1747491] que considero más limpia. Este método hace que el estilo '.ui-selection' sea muy notable. Además, cuando intentes seleccionar la lista, debes anular la selección del elemento seleccionado actualmente (no así para arriba). – theblang

9

Esto podría ser una solución mejor:

$('#selectable').selectable({ 
    selecting: function (event, ui) { 
     $(event.target).children('.ui-selecting').not(':first').removeClass('ui-selecting'); 
    } 
}); 
6

Aquí hay una solución más general que los publicados anteriormente:

$element.selectable({ 
     selecting: function (e, ui) { 
      // force single selection 
      $(e.target).find('.ui-selectee.ui-selecting').not(ui.selecting).removeClass('ui-selecting'); 
      $(e.target).find('.ui-selectee.ui-selected').not(ui.selecting).removeClass('ui-selected'); 
     } 
    }); 

(Los seleccionados pueden no ser siempre hijos de seleccionable, y aferrándose al "primer" seleccionado causa un comportamiento raro cuando se presiona Ctrl + clic.)

12

Esto funcionó para mí. Evita "enlazar" múltiples filas y ctrl + clic.

$(function() { 
$("#selectable").selectable({ 
     selecting: function(event, ui){ 
      if($(".ui-selected, .ui-selecting").length > 1){ 
        $(ui.selecting).removeClass("ui-selecting"); 
      } 
     } 
}); 
}); 
+0

¡Funcionó como un encanto! Simplemente mejor para cambiar '$ (" .ui-selected, .ui-selecting "). Length' a' this.element.find (".ui-selected, .ui-selecting"). Length'. – deerchao

+1

No estoy seguro de entender los consejos para cambiar. Aquí está el '$ (" .ui-selected, .ui-selecting "). Length' [versión que parece funcionar] (http://jsfiddle.net/ftL8w/). Aquí está el 'this.element.find (" .ui-selected, .ui-selecting "). Length' [versión que parece rota] (http://jsfiddle.net/xTr6F/1/), que arroja lo siguiente error: 'Error: no se puede obtener el valor de la propiedad 'buscar': el objeto es nulo' Soy bastante nuevo en jQuery, y solo estoy tratando de entenderlo. – twip

+0

Lo devolví a mi respuesta original, ya que este es el código de trabajo que estoy usando. Gracias por el twip heads up. – kyle

0

Aquí hay algunas buenas soluciones, pero la mayoría supone que siempre debe seleccionar el primer elemento como aparece en el DOM en un caso de selección múltiple.

Para remediar esto, conservo una variable (lastSelection) que contiene el último elemento que se solicitó con éxito (en lugar del primero en el DOM) al cual recurrir en el caso de una selección no deseada.

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]; 
      }  
     }  
    } 
}); 

Nota: Si desea cancelar la selección sin ctrl/cmd + clic tendrá que implementar una solución alternativa a este método.

También quería señalar que tolerance: 'fit' requiere simplemente que el lazo rodea completamente un elemento de destino con el fin de seleccionarlo, no va a desactivar la selección de lazo a menos que sus elementos no pueden estar rodeados en la zona de lazo disponible. http://api.jqueryui.com/selectable/#option-tolerance

0

Si desea deshabilitar la multiselección no consecutiva pero desea conservar la selección de arrastre, puede hacerlo.

  stop: function(event, ui) { 
       if($(".ui-selected, .ui-selecting").length > 1){ 
        var elems = $('.ui-selected, .ui-selecting'); 

        for(var i = 0; i < elems.length - 1; i++){ 
         if($(elems[i]).closest('td').next('td').text() != $(elems[i+1]).text()){ 
          //Non consecutive selection detected 
         } 
        } 
       } 
      } 

Comprueba esencialmente si todos los elementos están uno al lado del otro.

Cuestiones relacionadas