2010-06-29 16 views
23

Tengo una gama de elementos que se pueden seleccionar. Me gustaría agregar un botón en algún lugar que active una selección preestablecida entre esos. ¿Hay alguna manera de que pueda hacer eso?¿Cómo seleccionar mediante programación las selecciones con jQuery UI?

Lo que me gustaría es decirle "Seleccione estos tipos" y luego tener todos los eventos y todos disparados como siempre, así que no tengo que llamar a todos los eventos de selección manualmente.

Más información: Los eventos que diciendo son los que se enumeran en their api y en their demo page:

  • seleccionado
  • seleccionar
  • inicio
  • parada
  • no seleccionada
  • deseleccionar

Y también, creo que puede haber datos que también se configuran/borran al seleccionar cosas. Entonces no es solo para agregar esas clases de CSS.

Respuesta

25

Aquí es una variación del código de Alex R trabajar con múltiples elementos

http://jsfiddle.net/XYJEN/1/

function SelectSelectableElements (selectableContainer, elementsToSelect) 
{ 
    // add unselecting class to all elements in the styleboard canvas except the ones to select 
    $(".ui-selected", selectableContainer).not(elementsToSelect).removeClass("ui-selected").addClass("ui-unselecting"); 

    // add ui-selecting class to the elements to select 
    $(elementsToSelect).not(".ui-selected").addClass("ui-selecting"); 

    // trigger the mouse stop event (this will select all .ui-selecting elements, and deselect all .ui-unselecting elements) 
    selectableContainer.data("selectable")._mouseStop(null); 
} 

Actualización:

jQueryUI 1.10, por los comentarios de kmk: http://jsfiddle.net/XYJEN/163/

+0

Cool. Probablemente no esté relacionado, pero ¿por qué Ctrl + Click no puede seleccionar más de un trabajo en esa muestra? ¿Es algo con jsfiddle? – Svish

+1

Sí, lo noté también. Después de la prueba, parece que jQueryUI 1.8.16 es el problema. Después de darle a jsFiddle una referencia a 1.8.17, Ctrl + Click funciona. Actualicé el ejemplo. – Homer

+0

Excelente. ¡Gracias! – Svish

2

Editar: Perdón por el malentendido, estoy editando mi respuesta.

lo tanto, sí es posible la selección del objeto corresponde a la interfaz de usuario-seleccionada clase, así que lo que puede hacer es:

$(#button).click(function(){ 
    $("#element1").addClass("ui-selected"); 

    ....... 

}); 
+2

esto no es 't corregir cualquiera ... hay muchos eventos en el fondo que esto no se disparará, no a mencionar configurar sus datos correctamente. –

+0

Oye, ¿puedes ser más específico sobre los eventos basckground? Además de las animaciones, no estoy seguro de saber sobre ellas. Gracias por su contribución, sé que los míos son incompletos de vez en cuando, pero nos impiden a los "usuarios básicos" decir demasiada basura;) –

+0

Actualicé la pregunta con información sobre esos eventos :) – Svish

0

¿No es posible activar el evento selected manualmente con .trigger('selected')?

+0

Hm, supongo, pero luego me perdería el resto de los eventos, por supuesto. Además, ¿desencadenaría ese evento lo que haga jquery-ui? Quiero decir, pensé que jquery-ui hizo lo que era necesario (marcar con las clases y todo eso, y luego desencadenar ese evento en sí. Quiero decirle que haga todo lo que normalmente hace cuando un usuario selecciona algunos elementos, sin que yo tenga que averiguar exactamente cuáles son todos esos pasos. – Svish

+0

Intenté de esta manera: '$ (" # li seleccionable: primero "). trigger ('selected')' en su página de demostración y no hace nada :( –

0

El uso de código de Ionut, ¿qué tal:

$("#selectable li:first").trigger('start').trigger('selecting').trigger('selected'); 

?

+0

No, no funciona. Intente abrir la consola de Firebug en la página de demostración y pegue allí este código :) –

4

Hay que ir :

,calc: function() { this._mouseStop(); }, 
custom: function(guys) { 
    var self = this; 
    self.selectees.removeClass("ui-selected"); 
    guys.each(function(){ 
    $(this).addClass("ui-selecting"); 
    self._trigger("selecting", {}, { 
     selecting: this 
    }); 
    }); 
    this.calc(); // do the selection + trigger selected 
} 

Añadir esto después de _mouseStop en selectable.js y entonces se puede decir :

$("#selectable").selectable("custom", $("#selectable :first-child")); 

... o lo que quiera.

Tener diversión!:)

14

Suponiendo que la muestra seleccionable en el sitio web jQuery UI (http://jqueryui.com/demos/selectable/):

<style> 
    #feedback { font-size: 1.4em; } 
    #selectable .ui-selecting { background: #FECA40; } 
    #selectable .ui-selected { background: #F39814; color: white; } 
    #selectable { list-style-type: none; margin: 0; padding: 0; width: 60%; } 
    #selectable li { margin: 3px; padding: 0.4em; font-size: 1.4em; height: 18px; } 
    </style> 
    <script> 
    $(function() { 
     $("#selectable").selectable(); 
    }); 
    </script> 



<div class="demo"> 

<ol id="selectable"> 
    <li class="ui-widget-content">Item 1</li> 
    <li class="ui-widget-content">Item 2</li> 
    <li class="ui-widget-content">Item 3</li> 
    <li class="ui-widget-content">Item 4</li> 
    <li class="ui-widget-content">Item 5</li> 
    <li class="ui-widget-content">Item 6</li> 
    <li class="ui-widget-content">Item 7</li> 
</ol> 

</div><!-- End demo --> 

se puede tener una función como:

function selectSelectableElement (selectableContainer, elementToSelect) 
    { 
     // add unselecting class to all elements in the styleboard canvas except current one 
     jQuery("li", selectableContainer).each(function() { 
     if (this != elementToSelect[0]) 
      jQuery(this).removeClass("ui-selected").addClass("ui-unselecting"); 
     }); 

     // add ui-selecting class to the element to select 
     elementToSelect.addClass("ui-selecting"); 

     selectableContainer.selectable('refresh'); 
     // trigger the mouse stop event (this will select all .ui-selecting elements, and deselect all .ui-unselecting elements) 
     selectableContainer.data("selectable")._mouseStop(null); 
    } 

y utilizarlo como:

// select the fourth item 
selectSelectableElement (jQuery("#selectable"), jQuery("#selectable").children(":eq(3)")); 

Esto se puede mejorar para permitir la selección de una colección de elementos, pero es un punto de partida para obtener tu yendo

+7

llamada seleccionableContainer.selectable ('refresh') antes de llamar a _mouseStop (null), o puede cumplir con "selecttee is undefined" o " e no está definido "error. – deerchao

+0

Gracias, funciona como un campeón. –

+0

El error que obtenía sin la corrección de @ deerchao era' Uncaught TypeError: no se puede leer la propiedad '$ element' de undefined'. Sería bueno obtener la respuesta actualizado. – pdenya

Cuestiones relacionadas