Reputation: 157991
I have a range of items that are selectable. I would like to add a button somewhere that activates a preset selection amongst those. Is there a way I can do that?
What I would like is to tell it to "Select these guys" and then have all the events and all fired as normal, so I don't have to call all of those selection events manually.
More info: The events that I talk about are the ones listed in their api and on their demo page:
And also, I think there might be data that is set/cleared as well when selecting things. So it's not just to add those css classes.
Upvotes: 25
Views: 18392
Reputation: 301
Assuming the selectable sample on the jQuery UI website (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 -->
you can have a function like:
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);
}
and use it like:
// select the fourth item
selectSelectableElement (jQuery("#selectable"), jQuery("#selectable").children(":eq(3)"));
This can be improved to allow selecting a collection of elements, but it's a starting point to get you going.
Upvotes: 14
Reputation: 7806
Here is a variation of Alex R's code working with multiple elements
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);
}
Update:
jQueryUI 1.10, per comments from kmk: http://jsfiddle.net/XYJEN/163/
Upvotes: 28
Reputation: 50109
There you go:
,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
}
Add this after _mouseStop
in selectable.js
and then you can say:
$("#selectable").selectable("custom", $("#selectable :first-child"));
... or whatever you like.
Have fun! :)
Upvotes: 4
Reputation: 518
Using Ionut code, how about:
$("#selectable li:first").trigger('start').trigger('selecting').trigger('selected');
?
Upvotes: 0
Reputation: 122609
Is it not possible to trigger the selected
event manually with .trigger('selected')?
Upvotes: 0
Reputation: 4983
Edit : Sorry for the misunderstanding, I'm editing my answer.
So, yes it is possible the selection of the object corresponds to the class ui-selected, so what you can do is :
$(#button).click(function(){
$("#element1").addClass("ui-selected");
.......
});
Upvotes: 3