Skip to content

Commit 07bb40e

Browse files
committed
Added index parameter to onBeforeSelect/onSelect callback. Fix #96
1 parent 1899996 commit 07bb40e

File tree

5 files changed

+68
-38
lines changed

5 files changed

+68
-38
lines changed

public/jquery.selectric.js

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -199,18 +199,19 @@
199199
triggerCallback: function(fn, scope) {
200200
var elm = scope.element;
201201
var func = scope.options['on' + fn];
202+
var args = [elm].concat([].slice.call(arguments).slice(1));
202203

203204
if ( $.isFunction(func) ) {
204-
func.call(elm, elm, scope);
205+
func.apply(elm, args);
205206
}
206207

207208
if ( $.fn[pluginName].hooks[fn] ) {
208209
$.each($.fn[pluginName].hooks[fn], function() {
209-
this.call(elm, elm, scope);
210+
this.apply(elm, args);
210211
});
211212
}
212213

213-
$(elm).trigger(pluginName + '-' + this.toDash(fn), scope);
214+
$(elm).trigger(pluginName + '-' + this.toDash(fn), args);
214215
},
215216

216217
/**
@@ -649,10 +650,6 @@
649650
click: function() {
650651
_this.select($(this).data('index'));
651652

652-
if ( !_this.state.multiple || !_this.options.multiple.keepMenuOpen ) {
653-
_this.close();
654-
}
655-
656653
// Chrome doesn't close options box if select is wrapped with a label
657654
// We need to 'return false' to avoid that
658655
return false;
@@ -942,6 +939,8 @@
942939
var _this = this;
943940
var $filteredLi = _this.$li.filter('[data-index]').removeClass('highlighted');
944941

942+
_this.utils.triggerCallback('BeforeHighlight', _this);
943+
945944
// Parameter index is required
946945
if ( index === undefined ) {
947946
return;
@@ -955,6 +954,8 @@
955954

956955
_this.detectItemVisibility(index);
957956
}
957+
958+
_this.utils.triggerCallback('Highlight', _this);
958959
},
959960

960961
/**
@@ -963,20 +964,22 @@
963964
* @param {number} index - Index of the option that will be selected
964965
*/
965966
select: function(index) {
966-
// don't select disabled items
967-
if (index !== -1 && this.lookupItems[index].disabled) {
968-
return false;
969-
}
970-
971967
var _this = this;
972968
var $filteredLi = _this.$li.filter('[data-index]').removeClass('selected');
973969

970+
_this.utils.triggerCallback('BeforeSelect', _this, index);
971+
972+
// Don't select disabled items
973+
if (index !== -1 && _this.lookupItems[index].disabled) {
974+
return false;
975+
}
976+
974977
if ( _this.state.multiple ) {
975978
// Make sure selectedIdx is an array
976979
_this.state.selectedIdx = $.isArray(_this.state.selectedIdx) ? _this.state.selectedIdx : [_this.state.selectedIdx];
977980

978981
var hasSelectedIndex = $.inArray(index, _this.state.selectedIdx);
979-
if (hasSelectedIndex !== -1 ) {
982+
if ( hasSelectedIndex !== -1 ) {
980983
_this.state.selectedIdx.splice(hasSelectedIndex, 1);
981984
} else {
982985
_this.state.selectedIdx.push(index);
@@ -993,7 +996,13 @@
993996
.addClass('selected');
994997
}
995998

999+
if ( !_this.state.multiple || !_this.options.multiple.keepMenuOpen ) {
1000+
_this.close();
1001+
}
1002+
9961003
_this.change();
1004+
1005+
_this.utils.triggerCallback('Select', _this, index);
9971006
},
9981007

9991008
/**

public/jquery.selectric.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/jquery.selectric.js

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -182,18 +182,19 @@
182182
triggerCallback: function(fn, scope) {
183183
var elm = scope.element;
184184
var func = scope.options['on' + fn];
185+
var args = [elm].concat([].slice.call(arguments).slice(1));
185186

186187
if ( $.isFunction(func) ) {
187-
func.call(elm, elm, scope);
188+
func.apply(elm, args);
188189
}
189190

190191
if ( $.fn[pluginName].hooks[fn] ) {
191192
$.each($.fn[pluginName].hooks[fn], function() {
192-
this.call(elm, elm, scope);
193+
this.apply(elm, args);
193194
});
194195
}
195196

196-
$(elm).trigger(pluginName + '-' + this.toDash(fn), scope);
197+
$(elm).trigger(pluginName + '-' + this.toDash(fn), args);
197198
},
198199

199200
/**
@@ -632,10 +633,6 @@
632633
click: function() {
633634
_this.select($(this).data('index'));
634635

635-
if ( !_this.state.multiple || !_this.options.multiple.keepMenuOpen ) {
636-
_this.close();
637-
}
638-
639636
// Chrome doesn't close options box if select is wrapped with a label
640637
// We need to 'return false' to avoid that
641638
return false;
@@ -925,6 +922,8 @@
925922
var _this = this;
926923
var $filteredLi = _this.$li.filter('[data-index]').removeClass('highlighted');
927924

925+
_this.utils.triggerCallback('BeforeHighlight', _this);
926+
928927
// Parameter index is required
929928
if ( index === undefined ) {
930929
return;
@@ -938,6 +937,8 @@
938937

939938
_this.detectItemVisibility(index);
940939
}
940+
941+
_this.utils.triggerCallback('Highlight', _this);
941942
},
942943

943944
/**
@@ -946,20 +947,22 @@
946947
* @param {number} index - Index of the option that will be selected
947948
*/
948949
select: function(index) {
949-
// don't select disabled items
950-
if (index !== -1 && this.lookupItems[index].disabled) {
951-
return false;
952-
}
953-
954950
var _this = this;
955951
var $filteredLi = _this.$li.filter('[data-index]').removeClass('selected');
956952

953+
_this.utils.triggerCallback('BeforeSelect', _this, index);
954+
955+
// Don't select disabled items
956+
if (index !== -1 && _this.lookupItems[index].disabled) {
957+
return false;
958+
}
959+
957960
if ( _this.state.multiple ) {
958961
// Make sure selectedIdx is an array
959962
_this.state.selectedIdx = $.isArray(_this.state.selectedIdx) ? _this.state.selectedIdx : [_this.state.selectedIdx];
960963

961964
var hasSelectedIndex = $.inArray(index, _this.state.selectedIdx);
962-
if (hasSelectedIndex !== -1 ) {
965+
if ( hasSelectedIndex !== -1 ) {
963966
_this.state.selectedIdx.splice(hasSelectedIndex, 1);
964967
} else {
965968
_this.state.selectedIdx.push(index);
@@ -976,7 +979,13 @@
976979
.addClass('selected');
977980
}
978981

982+
if ( !_this.state.multiple || !_this.options.multiple.keepMenuOpen ) {
983+
_this.close();
984+
}
985+
979986
_this.change();
987+
988+
_this.utils.triggerCallback('Select', _this, index);
980989
},
981990

982991
/**

test/events.spec.js

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,29 @@ describe('events', function() {
3838
'open',
3939
'beforeClose',
4040
'close',
41+
'beforeHighlight',
42+
'highlight',
43+
'beforeSelect',
44+
'select',
4145
'beforeChange',
4246
'change',
4347
'refresh'
4448
]);
4549

4650
select.selectric('destroy');
47-
select.on('selectric-before-init', events.beforeInit);
48-
select.on('selectric-init', events.init);
49-
select.on('selectric-before-open', events.beforeOpen);
50-
select.on('selectric-open', events.open);
51-
select.on('selectric-before-close', events.beforeClose);
52-
select.on('selectric-close', events.close);
53-
select.on('selectric-before-change', events.beforeChange);
54-
select.on('selectric-change', events.change);
55-
select.on('selectric-refresh', events.refresh);
51+
select.on('selectric-before-init', events.beforeInit);
52+
select.on('selectric-init', events.init);
53+
select.on('selectric-before-open', events.beforeOpen);
54+
select.on('selectric-open', events.open);
55+
select.on('selectric-before-close', events.beforeClose);
56+
select.on('selectric-close', events.close);
57+
select.on('selectric-before-highlight', events.beforeHighlight);
58+
select.on('selectric-highlight', events.highlight);
59+
select.on('selectric-before-select', events.beforeSelect);
60+
select.on('selectric-select', events.select);
61+
select.on('selectric-before-change', events.beforeChange);
62+
select.on('selectric-change', events.change);
63+
select.on('selectric-refresh', events.refresh);
5664
select.selectric();
5765

5866
$('.selectric').click();
@@ -65,6 +73,10 @@ describe('events', function() {
6573
expect(events.open).toHaveBeenCalled();
6674
expect(events.beforeClose).toHaveBeenCalled();
6775
expect(events.close).toHaveBeenCalled();
76+
expect(events.beforeHighlight).toHaveBeenCalled();
77+
expect(events.highlight).toHaveBeenCalled();
78+
expect(events.beforeSelect).toHaveBeenCalled();
79+
expect(events.select).toHaveBeenCalled();
6880
expect(events.beforeChange).toHaveBeenCalled();
6981
expect(events.change).toHaveBeenCalled();
7082
expect(events.refresh).toHaveBeenCalled();

test/visibility.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ describe('visibility', function() {
4343
it('should open on mouseover and close after timeout', function(done) {
4444
select.selectric({
4545
openOnHover: true,
46-
hoverIntentTimeout: 50
46+
hoverIntentTimeout: 30
4747
});
4848

4949
var $wrapper = $('.selectric-wrapper');
@@ -56,6 +56,6 @@ describe('visibility', function() {
5656
setTimeout(function() {
5757
expect($optionsBox.is(':visible')).toBe(false);
5858
done();
59-
}, 100);
59+
}, 40);
6060
});
6161
});

0 commit comments

Comments
 (0)