【问题标题】:Keyboard up and down arrows键盘向上和向下箭头
【发布时间】:2010-09-21 18:43:11
【问题描述】:

我有一个自动完成搜索,通过输入几个字符,它会显示所有与输入字符匹配的名称。我正在使用 DIV 标记在 jsp 中填充这些数据,通过使用鼠标我可以选择名称。但我想使用键盘上下箭头选择要选择的 DIV 标签中的名称。谁能帮我解决这个问题。

【问题讨论】:

    标签: javascript html autocomplete keyboard arrow-keys


    【解决方案1】:

    使用 onkeydownonkeyup 事件检查结果 div 中的按键事件:

    var UP = 38;
    var DOWN = 40;
    var ENTER = 13;
    
    var getKey = function(e) {
      if(window.event) { return e.keyCode; }  // IE
      else if(e.which) { return e.which; }    // Netscape/Firefox/Opera
    };
    
    
    var keynum = getKey(e);
    
    if(keynum === UP) {
      //Move selection up
    }
    
    if(keynum === DOWN) {
      //Move selection down
    }
    
    if(keynum === ENTER) {
      //Act on current selection
    }
    

    【讨论】:

      【解决方案2】:

      复制并粘贴这段代码并尝试..

      <style>
      div.active{ 
              background: lightblue
      }
      </style>
      <center>
      <input type="text" id="tb">
      <div id="Parent" style="position:absolute;display:block;left:428px; width:146px;top:38px; height:100px; border: 2px solid lightblue; overflow:auto;">  
      <div id="childOne">1 </div>     
      <div id="childOne">2 </div>     
      <div id="childOne">3 </div>     
      <div id="childOne">4 </div>
      <div id="childOne">5 </div>
      <div id="childOne">6 </div>
      <div id="childOne">7 </div>
      <div id="childOne">8 </div>
      <div id="childOne">9 </div>
      <div id="childOne">10 </div>
      </div>
      </center>
      <script type="text/javascript">
          var scrolLength = 19;
          function autocomplete( textBoxId, containerDivId ) { 
              var ac = this;    
              this.textbox     = document.getElementById(textBoxId);    
              this.div         = document.getElementById(containerDivId);    
              this.list        = this.div.getElementsByTagName('div');    
              this.pointer     = null;    
              this.textbox.onkeydown = function( e ) {
                  e = e || window.event;        
                  switch( e.keyCode ) {            
                  case 38: //up                
                      ac.selectDiv(-1);                
                  break;            
                  case 40: //down                
                      ac.selectDiv(1);                
                  break;        }    
                  }    
      
                  this.selectDiv = function( inc ) {        
                       if(this.pointer > 1){
                           scrollDiv();
                       }
                       if(this.pointer == 0)
                          document.getElementById("Parent").scrollTop = 0;   
                      if( this.pointer !== null && this.pointer+inc >= 0 && this.pointer+inc < this.list.length ) { 
                          this.list[this.pointer].className = '';            
                          this.pointer += inc;            
                          this.list[this.pointer].className = 'active';            
                          this.textbox.value = this.list[this.pointer].innerHTML; 
                      }
                      if( this.pointer === null ) {            
      
                          this.pointer = 0;            
                          scrolLength = 20;
                          this.list[this.pointer].className = 'active';            
                          this.textbox.value = this.list[this.pointer].innerHTML;        
                      }    
                  }
                  function scrollDiv(){
                       if(window.event.keyCode == 40){
                           document.getElementById("Parent").scrollTop = scrolLength;
                           scrolLength = scrolLength + 19;  
                       }           
                       else if(window.event.keyCode == 38){
      
                           scrolLength = scrolLength - 19;  
                           document.getElementById("Parent").scrollTop = scrolLength;
      
                       }
                  }
              } 
          new autocomplete( 'tb', 'Parent' );
      </script>
      

      【讨论】:

        【解决方案3】:

        我假设您有一个输入来处理输入。

        为您读出 event.keyCode 的输入映射 onkeyup-eventhandler,并在它是向上/向下箭头 (38, 40) 的适当键码时执行操作,以保留对哪个节点的引用(您的div) 你把焦点移到。

        然后当你按下回车键(keyCode 13)时调用同一个处理程序,就像你在点击时一样。

        很难给出一个编码示例,因为它高度依赖于上下文,但是关于如何浏览 div 的提示是让我们使用 .nextSibling 和 .previousSibling,以及 .firstChild 和 .childNodes。

        【讨论】:

          【解决方案4】:

          我已经很久没有这样做了,但我想你可以使用event.keyCode

          如果返回的值为 38 和 40,则用户分别按下了向上和向下箭头。

          然后,您必须选择当前位置上方或下方的行。如何选择行将取决于您的具体情况。

          【讨论】:

          • 好的...这里开始.. function showKeyCode(e) { alert("keyCode for the keypressed:" + e.keyCode);并在您的 DIV 标签中,您将像这样调用上述方法: onkeydown="showKeyCode(event);"猜猜这应该可行。
          最近更新 更多