I'm displaying search results with a table. Each result has a button for user to click on to show the full detail of it. That's working well.
What I also want is to make it possible to navigat the search results by using keyboard's up and down arrow.
Now, user have to click on the Select
button or tab to the button and press space bar
.
I suppose I can trap the keyup and down event and then find the previous or next one I need to select and then set it, but it sounds like a lot of work. I wonder if there's a better way to do it?
javascript
var myModel = new function() {
var self = this;
self.selectedResult = ko.observable(new MyObj());
self.searchResults = ko.observableArray();
self.navUpDown = function (item, evt) {
if (evt.keyCode == 38) { // up
var id = item.ID();
// find previous one and set selectedResult
}
if (evt.keyCode == 40) { // down
var id = item.ID();
// find next one and set selectedResult
}
};
};
html
<table class="table">
<thead>
<tr>
<th> </th>
<th>table header 1</th>
<th>table header 2</th>
</tr>
</thead>
<tbody data-bind="foreach: searchResults">
<tr data-bind="css: { 'btn-info': $parent.selectedResult() == $data }, event: { keyup: $parent.navUpDown } ">
<td>
<button class="btn btn-small" data-bind="click: $parent.selectResult">Select</button>
</td>
<td data-bind="text: data1"></td>
<td data-bind="text: data2"></td>
</tr>
</tbody>
</table>
To navigate to the Table Row Actions: Use the keyboard keys to navigate through the page elements. Use the Down Arrow key to move focus to the table rows.
press and hold down the Alt key, type the Alt Code value of the arrow you want, for example for an arrow down symbol, type 2 5 on the numeric pad , release the Alt key and you got a ↓ downwards arrow.
Turn off Scroll Lock on your keyboard Most of the time, if your arrow keys aren't moving the cursor from cell to cell, the fix is as simple as disabling the Scroll Lock key on your keyboard.
I think this is what you are looking for.
var myModel = new function () {
var self = this;
self.selectResult = function (item) {
self.selectedResult(item);
};
self.selectedResult = ko.observable();
self.searchResults = ko.observableArray([{
data1: "1",
data2: "2"
}, {
data1: "2",
data2: "2"
}, {
data1: "3",
data2: "2"
}]);
self.selectPrevious = function () {
var index = self.searchResults().indexOf(self.selectedResult()) - 1;
if (index < 0) index = 0;
self.selectedResult(self.searchResults()[index]);
};
self.selectNext = function () {
var index = self.searchResults().indexOf(self.selectedResult()) + 1;
if (index >= self.searchResults().length) index = self.searchResults().length - 1;
self.selectedResult(self.searchResults()[index]);
};
};
ko.applyBindings(myModel);
$(window).keyup(function (evt) {
if (evt.keyCode == 38) {
myModel.selectPrevious();
} else if (evt.keyCode == 40) {
myModel.selectNext();
}
});
See Fiddle
I hope it helps.
It's actually not that hard to find next
and prev
For example
$(window).keyup(function (evt) {
if (evt.keyCode == 38) { // up
$('tbody tr:not(:first).selected').removeClass('selected').prev().addClass('selected')
}
if (evt.keyCode == 40) { // down
$('tbody tr:not(:last).selected').removeClass('selected').next().addClass('selected')
}
});
FIDDLE
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With