Fix searching in Firefox for Android
This fixes an issue where most keys would not trigger the search in Firefox for Android. There were only a few keys which would trigger `keyup`, such as space and enter (the search icon), but they were not consistent. We know that they were being triggered though, as you could type "new " (note the space) and it would trigger a search, giving us all states that started with "new". The problem is that Firefox for Android does not consistently trigger `keyup` and `keydown` events when a keyboard is used. To work around the issue, we are now using the `input` event in replacement of the `keyup` event, which was used to trigger the search. While this is not an actual `KeyboardEvent` in Chrome, and lacks some of the important metadata such as `which`/`key` in Firefox, it works for our implementation. As the `input` event is not supported in older browsers, such as those before Internet Explorer 9, we have to listen for both the old `keyup` event and the new `input` event. As the `input` event is always triggered before the `keyup` event, we unbind the `keyup` event automatically to prevent searches from being triggered twice. This solution was discovered in a blog post by Mathias Bynens at https://mathiasbynens.be/notes/oninput. **Note:** The ability to backspace in a blank text field on multiple selects in order to remove the last selected item does not work in Firefox for Android because the `keydown` event does not trigger when the text field is empty. Users can still use the "x" icon provided at the start of every selected option to achieve the same effect. This closes https://github.com/select2/select2/issues/2997.
This commit is contained in:
parent
61916b2cfb
commit
c0839b4f93
21
dist/js/select2.amd.full.js
vendored
21
dist/js/select2.amd.full.js
vendored
@ -1309,7 +1309,16 @@ define('select2/selection/search',[
|
||||
}
|
||||
});
|
||||
|
||||
this.$selection.on('keyup', '.select2-search--inline', function (evt) {
|
||||
// Workaround for browsers which do not support the `input` event
|
||||
// This will prevent double-triggering of events for browsers which support
|
||||
// both the `keyup` and `input` events.
|
||||
this.$selection.on('input', '.select2-search--inline', function (evt) {
|
||||
// Unbind the duplicated `keyup` event
|
||||
$(this).off('keyup');
|
||||
});
|
||||
|
||||
this.$selection.on('keyup input', '.select2-search--inline',
|
||||
function (evt) {
|
||||
self.handleSearch(evt);
|
||||
});
|
||||
};
|
||||
@ -3172,7 +3181,15 @@ define('select2/dropdown/search',[
|
||||
self._keyUpPrevented = evt.isDefaultPrevented();
|
||||
});
|
||||
|
||||
this.$search.on('keyup', function (evt) {
|
||||
// Workaround for browsers which do not support the `input` event
|
||||
// This will prevent double-triggering of events for browsers which support
|
||||
// both the `keyup` and `input` events.
|
||||
this.$search.on('input', function (evt) {
|
||||
// Unbind the duplicated `keyup` event
|
||||
$(this).off('keyup');
|
||||
});
|
||||
|
||||
this.$search.on('keyup input', function (evt) {
|
||||
self.handleSearch(evt);
|
||||
});
|
||||
|
||||
|
21
dist/js/select2.amd.js
vendored
21
dist/js/select2.amd.js
vendored
@ -1309,7 +1309,16 @@ define('select2/selection/search',[
|
||||
}
|
||||
});
|
||||
|
||||
this.$selection.on('keyup', '.select2-search--inline', function (evt) {
|
||||
// Workaround for browsers which do not support the `input` event
|
||||
// This will prevent double-triggering of events for browsers which support
|
||||
// both the `keyup` and `input` events.
|
||||
this.$selection.on('input', '.select2-search--inline', function (evt) {
|
||||
// Unbind the duplicated `keyup` event
|
||||
$(this).off('keyup');
|
||||
});
|
||||
|
||||
this.$selection.on('keyup input', '.select2-search--inline',
|
||||
function (evt) {
|
||||
self.handleSearch(evt);
|
||||
});
|
||||
};
|
||||
@ -3172,7 +3181,15 @@ define('select2/dropdown/search',[
|
||||
self._keyUpPrevented = evt.isDefaultPrevented();
|
||||
});
|
||||
|
||||
this.$search.on('keyup', function (evt) {
|
||||
// Workaround for browsers which do not support the `input` event
|
||||
// This will prevent double-triggering of events for browsers which support
|
||||
// both the `keyup` and `input` events.
|
||||
this.$search.on('input', function (evt) {
|
||||
// Unbind the duplicated `keyup` event
|
||||
$(this).off('keyup');
|
||||
});
|
||||
|
||||
this.$search.on('keyup input', function (evt) {
|
||||
self.handleSearch(evt);
|
||||
});
|
||||
|
||||
|
21
dist/js/select2.full.js
vendored
21
dist/js/select2.full.js
vendored
@ -1748,7 +1748,16 @@ define('select2/selection/search',[
|
||||
}
|
||||
});
|
||||
|
||||
this.$selection.on('keyup', '.select2-search--inline', function (evt) {
|
||||
// Workaround for browsers which do not support the `input` event
|
||||
// This will prevent double-triggering of events for browsers which support
|
||||
// both the `keyup` and `input` events.
|
||||
this.$selection.on('input', '.select2-search--inline', function (evt) {
|
||||
// Unbind the duplicated `keyup` event
|
||||
$(this).off('keyup');
|
||||
});
|
||||
|
||||
this.$selection.on('keyup input', '.select2-search--inline',
|
||||
function (evt) {
|
||||
self.handleSearch(evt);
|
||||
});
|
||||
};
|
||||
@ -3611,7 +3620,15 @@ define('select2/dropdown/search',[
|
||||
self._keyUpPrevented = evt.isDefaultPrevented();
|
||||
});
|
||||
|
||||
this.$search.on('keyup', function (evt) {
|
||||
// Workaround for browsers which do not support the `input` event
|
||||
// This will prevent double-triggering of events for browsers which support
|
||||
// both the `keyup` and `input` events.
|
||||
this.$search.on('input', function (evt) {
|
||||
// Unbind the duplicated `keyup` event
|
||||
$(this).off('keyup');
|
||||
});
|
||||
|
||||
this.$search.on('keyup input', function (evt) {
|
||||
self.handleSearch(evt);
|
||||
});
|
||||
|
||||
|
6
dist/js/select2.full.min.js
vendored
6
dist/js/select2.full.min.js
vendored
File diff suppressed because one or more lines are too long
21
dist/js/select2.js
vendored
21
dist/js/select2.js
vendored
@ -1748,7 +1748,16 @@ define('select2/selection/search',[
|
||||
}
|
||||
});
|
||||
|
||||
this.$selection.on('keyup', '.select2-search--inline', function (evt) {
|
||||
// Workaround for browsers which do not support the `input` event
|
||||
// This will prevent double-triggering of events for browsers which support
|
||||
// both the `keyup` and `input` events.
|
||||
this.$selection.on('input', '.select2-search--inline', function (evt) {
|
||||
// Unbind the duplicated `keyup` event
|
||||
$(this).off('keyup');
|
||||
});
|
||||
|
||||
this.$selection.on('keyup input', '.select2-search--inline',
|
||||
function (evt) {
|
||||
self.handleSearch(evt);
|
||||
});
|
||||
};
|
||||
@ -3611,7 +3620,15 @@ define('select2/dropdown/search',[
|
||||
self._keyUpPrevented = evt.isDefaultPrevented();
|
||||
});
|
||||
|
||||
this.$search.on('keyup', function (evt) {
|
||||
// Workaround for browsers which do not support the `input` event
|
||||
// This will prevent double-triggering of events for browsers which support
|
||||
// both the `keyup` and `input` events.
|
||||
this.$search.on('input', function (evt) {
|
||||
// Unbind the duplicated `keyup` event
|
||||
$(this).off('keyup');
|
||||
});
|
||||
|
||||
this.$search.on('keyup input', function (evt) {
|
||||
self.handleSearch(evt);
|
||||
});
|
||||
|
||||
|
4
dist/js/select2.min.js
vendored
4
dist/js/select2.min.js
vendored
File diff suppressed because one or more lines are too long
10
src/js/select2/dropdown/search.js
vendored
10
src/js/select2/dropdown/search.js
vendored
@ -34,7 +34,15 @@ define([
|
||||
self._keyUpPrevented = evt.isDefaultPrevented();
|
||||
});
|
||||
|
||||
this.$search.on('keyup', function (evt) {
|
||||
// Workaround for browsers which do not support the `input` event
|
||||
// This will prevent double-triggering of events for browsers which support
|
||||
// both the `keyup` and `input` events.
|
||||
this.$search.on('input', function (evt) {
|
||||
// Unbind the duplicated `keyup` event
|
||||
$(this).off('keyup');
|
||||
});
|
||||
|
||||
this.$search.on('keyup input', function (evt) {
|
||||
self.handleSearch(evt);
|
||||
});
|
||||
|
||||
|
11
src/js/select2/selection/search.js
vendored
11
src/js/select2/selection/search.js
vendored
@ -79,7 +79,16 @@ define([
|
||||
}
|
||||
});
|
||||
|
||||
this.$selection.on('keyup', '.select2-search--inline', function (evt) {
|
||||
// Workaround for browsers which do not support the `input` event
|
||||
// This will prevent double-triggering of events for browsers which support
|
||||
// both the `keyup` and `input` events.
|
||||
this.$selection.on('input', '.select2-search--inline', function (evt) {
|
||||
// Unbind the duplicated `keyup` event
|
||||
$(this).off('keyup');
|
||||
});
|
||||
|
||||
this.$selection.on('keyup input', '.select2-search--inline',
|
||||
function (evt) {
|
||||
self.handleSearch(evt);
|
||||
});
|
||||
};
|
||||
|
Loading…
x
Reference in New Issue
Block a user