навигация с помощью клавиатуры для раскрывающегося списка ajax - PullRequest
0 голосов
/ 24 ноября 2010

Я использую следующий код для выпадающего списка Ajax (что-то похожее на Google). Это работает хорошо.

[источник]: http://www.dynamicajax.com/ этого кода

код в html

<html lang="en-US">
    <head>
        <style type="text/css" media="screen">
            body {
                font: 11px arial;
            }
            .suggest_link {
                background-color: #FFFFFF;
                padding: 2px 6px 2px 6px;
            }
            .suggest_link_over {
                background-color: #3366CC;
                padding: 2px 6px 2px 6px;
            }
            #search_suggest {
                position: absolute;
                background-color: #FFFFFF;
                text-align: left;
                border: 1px solid #000000;
            }
        </style>
        <script language="JavaScript" type="text/javascript" src="ajax_search.js"></script>
    </head>
    <body>
        <h3><a href="http://www.DynamicAJAX.com" style="color: #000000; text-decoration: none;">Simple AJAX Search Suggest</a></h3>


        <form id="frmSearch">
            <input type="text" id="txtSearch" name="txtSearch" alt="Search Criteria" onkeyup="searchSuggest(this.value);" autocomplete="off" />
           <!-- <input type="submit" id="cmdSearch" name="cmdSearch" value="Search" alt="Run Search" /><br />-->
            <div id="search_suggest">
            </div>
        </form>
    </body>
</html>

код в javascript

//Gets the browser specific XmlHttpRequest Object
function getXmlHttpRequestObject() {

        if (window.XMLHttpRequest) {
            // code for IE7+, Firefox, Chrome, Opera, Safari
  return new XMLHttpRequest();
 } else if(window.ActiveXObject) {
           // code for IE6, IE5
  return new ActiveXObject("Microsoft.XMLHTTP");
 } else {
  alert("It's about time to upgrade your browser. don't you think so?");
 }
}

//Our XmlHttpRequest object to get the auto suggest
var searchReq = getXmlHttpRequestObject();

//Called from keyup on the search textbox.
//Starts the AJAX request.
function searchSuggest() {
 if (searchReq.readyState == 4 || searchReq.readyState == 0) {
  var str = escape(document.getElementById('txtSearch').value);
  searchReq.open("GET", 'searchSuggest.php?search=' + str, true);
  searchReq.onreadystatechange = handleSearchSuggest;
  searchReq.send(null);
 }
}

//Called when the AJAX response is returned.
function handleSearchSuggest() {
 if (searchReq.readyState == 4) {
  var ss = document.getElementById('search_suggest')
  ss.innerHTML = '';
  var str = searchReq.responseText.split("\n");
  for(i=0; i < str.length - 1; i++) {
   //Build our element string.  This is cleaner using the DOM, but
   //IE doesn't support dynamically added attributes.
   var suggest = '<div onmouseover="javascript:suggestOver(this);" ';
   suggest += 'onmouseout="javascript:suggestOut(this);" ';
                        suggest += 'onclick="javascript:setSearch(this.innerHTML);" ';
   suggest += 'class="suggest_link">' + str[i] + '</div>';
   ss.innerHTML += suggest;
  }
 }
}

//Mouse over function
function suggestOver(div_value) {
 div_value.className = 'suggest_link_over';
}
//Mouse out function
function suggestOut(div_value) {
 div_value.className = 'suggest_link';
}

//Click function
function setSearch(value) {
 document.getElementById('txtSearch').value = value;
 document.getElementById('search_suggest').innerHTML = '';
}

Теперь я хотел знать, могу ли я перемещаться в выпадающем списке с помощью клавиш. то есть

открыть раскрывающийся список с помощью клавиши со стрелкой вниз. Открыв раскрывающийся список, пользователь может перемещаться между раскрывающимися элементами с помощью клавиш «Стрелка вверх», «Стрелка вниз», «Домой», «Конец», «Вверх», «Страница вниз», а затем выбирать элемент с помощью клавиши «Ввод». Чтобы закрыть список без изменения значения, пользователь может нажать клавишу Esc.

Приятно иметь все вышеупомянутые функции. - только если это возможно.

Но навигация с Стрелка вверх, Стрелка вниз обязательна. - Нужна помощь для этих 2

Заранее спасибо!

1 Ответ

1 голос
/ 24 ноября 2010

Вы имеете в виду опции автозаполнения, появляющиеся под вашим вводом текста?В этом случае вы хотите установить опцию для нажатия клавиш, и если это стрелка вниз, вы делаете то же самое, что вы в настоящее время делаете с «mouse_out» для элемента $ (this) и «mouse_over» для элемента под ним.Что касается стрелки вверх, то же самое с той, что над ней.

Сначала вам понадобятся идентификаторы для каждого div и сделайте их последовательными.Затем вы добавляете функции для нажатий клавиш

 for(i=0; i < str.length - 1; i++) {
   //Build our element string.  This is cleaner using the DOM, but
   //IE doesn't support dynamically added attributes.
   var suggest = '<div onmouseover="javascript:suggestOver(this);" ';
   suggest += 'onmouseout="javascript:suggestOut(this);" ';
                    suggest += 'onclick="javascript:setSearch(this.innerHTML);" ';

                    suggest += 'onkeypress="javascript:keyPressFunc(k,this);' //THIS IS NEW
                    suggest += 'id="item"+i'; //THIS IS THE NEW LINE TO ADD

   suggest += 'class="suggest_link">' + str[i] + '</div>';
   ss.innerHTML += s
}

function keyPressFunc(k, comesFrom)
{
    keyIn = k.keyCode;
    suggestOut(this);
    getsFocusId = "item" + 39-keyIn  //38 is up arrow, 40 is down
    suggestOver(document.getElementById(getFocusId));
}

Возможно, я перепутал аргументы для входящего ключа и элемента отчетности, но это идея.Широкие штрихи звучат, даже если некоторые детали отсутствуют:

1) добавьте уникальные (и последовательные) идентификаторы к каждому из этих элементов
2) добавьте событие для нажатия клавиши, используйте .keyCode для получения значения,стрелка вверх - 40, вниз - 38, ввод - 13, esc - 27. страница вверх, pagedown, end, home - 33-36
3) Для каждого из них вы должны сделать то, что вы в настоящее время делаете, для предложить.нажатие клавиши, и то, что вы в настоящее время делаете для наводки на другую

Я не делал ничего подобного в vanilla javascript довольно долгое время, поэтому я нечеткий.Я думаю, что вы действительно выиграете от jQuery, я знаю, что получил бы.

PS - получите jQuery.Тогда вы можете легко настроить эти события с такими вещами, как

$(".suggest_link").keypress(function(k) {.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...