Use Up And Down Arrows For Autocomplete Search
There are many examples onauto complete with jquery in google 'eg searching facebook like search jquery' But I cant find any that show how can you use the up and down arrow keys t
Solution 1:
This is a basic function to move through a list using the arrow keys.
$("ul").keydown(function (e) {
var searchbox = $(this);
switch (e.which) {
case40:
$('li:not(:last-child).selected').removeClass('selected')
.next().addClass('selected');
break;
case38:
$('li:not(:first-child).selected').removeClass('selected')
.prev().addClass('selected');
break;
}
});
We can apply this to a form with an input to move the selected item. The focus needs to remain on the input for this to work
$(".search-terms").keydown(function(e) {
switch (e.which) {
case40:
e.preventDefault(); // prevent moving the cursor
$('li:not(:last-child).selected').removeClass('selected')
.next().addClass('selected');
break;
case38:
e.preventDefault(); // prevent moving the cursor
$('li:not(:first-child).selected').removeClass('selected')
.prev().addClass('selected');
break;
}
});
$('.search-terms').keyup(function() {
if (this.value.length >= 1) {
$('#results').show();
} else {
$('#results').hide();
}
})
.selected {
color: red
}
<scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script><formid="search-form"method="get"action="search.php"><inputclass="search-terms"type="text"value=""placeholder='Search'autocomplete="off"name="resultsFor" /><inputclass="submit-search"type="submit"value="go" /></form><divid="results"style="display: none;"><h4class="tophit-title"style="background-color: #4AABD8">Top Hits</h4><ultabindex='1'><liclass='selected'>ok</li><li>ok</li><li>ok</li><li>ok</li><li>ok</li></ul></div>
Solution 2:
In one of the projects I was on I recalled making something like that. I dug up the code for your inspection (DSL stands for Dynamic Search List):
var dslTimer = [];
var dslData = [];
var dslControls = [];
var dslSelected = [];
var dslSelectedIndex = 0;
var callBackFunction;
functionaddDsl(inputField, dslPlaceHolder, dslUrl, maxDepth, callback, countryLimitation) {
var dslIndex = dslControls.length + 1;
dslControls[dslIndex] = [inputField, dslPlaceHolder, dslUrl, maxDepth, countryLimitation];
callBackFunction = callback;
$('#' + inputField).keyup(function(e) {
var key = e.keyCode;
if (key == '13') {
if ($('#' + dslControls[dslIndex][1]).hasClass('hidden') && $('#' + inputField).val().length > 0) {
if (callback == null) {
$('#' + dslControls[dslIndex][1]).closest('form').submit();
}
else {
callback();
}
}
else {
$('#' + dslControls[dslIndex][1]).addClass('hidden');
}
} elseif (key == '38') {
//Up key
$('#' + dslControls[dslIndex][1] + ' ul li:nth-child(' + dslSelectedIndex + ') a').removeClass('highlight');
dslSelectedIndex -= 1;
if (dslSelectedIndex < 0) {
dslSelectedIndex = $('#' + dslControls[dslIndex][1] + ' ul li').length;
}
$('#' + dslControls[dslIndex][1] + ' ul li:nth-child(' + dslSelectedIndex + ') a').addClass('highlight');
var str = $('#' + dslControls[dslIndex][1] + ' ul li:nth-child(' + dslSelectedIndex + ') a').text();
if (str != null && str != "") {
$('#' + dslControls[dslIndex][0]).val(str);
}
} elseif (key == '40') {
//Down key
$('#' + dslControls[dslIndex][1] + ' ul li:nth-child(' + dslSelectedIndex + ') a').removeClass('highlight');
dslSelectedIndex += 1if (dslSelectedIndex > $('#' + dslControls[dslIndex][1] + ' ul li').length) {
dslSelectedIndex = 0;
}
$('#' + dslControls[dslIndex][1] + ' ul li:nth-child(' + dslSelectedIndex + ') a').addClass('highlight');
var str = $('#' + dslControls[dslIndex][1] + ' ul li:nth-child(' + dslSelectedIndex + ') a').text();
if (str != null && str != "") {
$('#' + dslControls[dslIndex][0]).val(str);
}
} else {
var input = $('#' + dslControls[dslIndex][0]).val();
if (input.length >= 2) {
window.clearTimeout(dslTimer[dslIndex]);
dslTimer[dslIndex] = window.setTimeout('doDsl(' + dslIndex + ')', 100);
}
else {
$('#' + dslControls[dslIndex][1]).addClass('hidden');
}
}
});
$('#' + inputField).blur(function(e) {
window.setTimeout('blurDsl(' + dslIndex + ')', 500);
});
return dslIndex;
}
functiondoDsl(dslIndex) {
getDsl(dslIndex, $('#' + dslControls[dslIndex][0]).val());
}
functiongetDsl(dslIndex, searchstring) {
if (searchstring.length < 2) {
return;
}
var postData = { 'input': searchstring, 'maxDepth': dslControls[dslIndex][3] };
if (typeof (dslControls[dslIndex][4]) != 'undefined' || dslControls[dslIndex][4] != null) {
postData.countryId = dslControls[dslIndex][4].val();
}
$.ajax({
type: 'POST',
url: dslControls[dslIndex][2],
data: postData,
dataType: "json",
contentType: "application/x-www-form-urlencoded",
timeout: 60000,
global : false,
success: function (data) {
(data.length > 0)
? showDsl(dslIndex, data)
: blurDsl(dslIndex);
}
});
}
functionshowDsl(dslIndex, data) {
dslData[dslIndex] = data;
dslSelected[dslIndex] = null;
var htmlString = '<ul>';
var searchText = $('#' + dslControls[dslIndex][0]).val().ignoreAccent();
$.each(data, function(i, item) {
var text = item.Text;
var accentlessText = item.AccentlessText.Value;
var boldStart = accentlessText.toLowerCase().indexOf(searchText.toLowerCase());
while (boldStart > -1 && searchText.length > 0) {
text = text.substring(0, boldStart) + '<strong>' + text.substring(boldStart, (boldStart + searchText.length)) + '</strong>' + text.substring((boldStart + searchText.length), text.length);
boldStart = accentlessText.toLowerCase().indexOf(searchText.toLowerCase(), (boldStart + 17 + searchText.length));
}
htmlString += '<li><a href="javascript:void(0)" onmousedown="selectDsl(' + dslIndex + ', \'' + item.Id + '\')" tabindex="' + (1000 + i) + '">' + text + '</a></li>';
});
htmlString += '</ul>';
$('#' + dslControls[dslIndex][1] + ' ul').replaceWith(htmlString);
dslSelectedIndex = 0;
if (data.length > 0) {
$('#' + dslControls[dslIndex][1]).removeClass('hidden');
}
}
functionselectDsl(dslIndex, id) {
$('#' + dslControls[dslIndex][1]).addClass('hidden');
$.each(dslData[dslIndex], function(i, item) {
if (item.Id == id) {
$('#' + dslControls[dslIndex][0]).val(item.Text);
dslSelected[dslIndex] = item;
if (callBackFunction != null) {
callBackFunction();
}
}
});
}
functionblurDsl(dslIndex) {
$('#' + dslControls[dslIndex][1]).addClass('hidden');
}
// Source: https://github.com/zimny/accentless
(function () {
if (String.prototype.ignoreAccent) return;
varAccentCharCodesTable = {
"a": [224, 229],
"A": [192, 198],
"c": [231, 231],
"C": [199, 199],
"e": [231, 235],
"E": [200, 203],
"i": [236, 239],
"I": [204, 208],
"n": [241, 241],
"N": [209, 209],
"o": [242, 246],
"O": [209, 214],
"s": [353, 353],
"S": [352, 352],
"u": [248, 252],
"U": [216, 220],
"y": [253, 253],
"Y": [221, 221],
"z": [382, 382],
"Z": [381, 381]
};
String.prototype.ignoreAccent = function() {
var i, currentCharCode, char, str = this.split("");
for (i = 0; i < str.length; i++) {
currentCharCode = str[i].charCodeAt(0);
if (currentCharCode < 192) continue;
for (char inAccentCharCodesTable) {
if (AccentCharCodesTable.hasOwnProperty(char)) {
if (currentCharCode >= AccentCharCodesTable[char][0] && currentCharCode <= AccentCharCodesTable[char][1]) {
str[i] = char;
break;
}
}
}
}
return str.join("");
};
})();
Post a Comment for "Use Up And Down Arrows For Autocomplete Search"