0

对于我的键盘电源键脚本,我为每个请求实现了一项功能,以启用up/down箭头键以将焦点放在表示电子邮件的表格上的复选框(上一行中的复选框,下一行中的复选框)(显然就像旧的雅虎经典邮件一样,尽管在他们停止允许访问之前我不知道该功能)。此功能非常有效,但有一个例外:当我按住向上箭头键(而不是轻按,轻按轻按)时,它最终会在到达顶部复选框时锁定 Firefox;我越是按住它,它就越有可能 KO 浏览器,我将不得不手动终止该过程。

尽管涉及全局变量的任何内容都必须使用option该类,但我对各种方法持开放态度。

框架被明确禁止,我们谈论的是真实的代码和性能。

选项类,除非您的方法需要全局变量,否则不是必需的...

var option = new function() {this.name = '';}

这是处理各种按键事件的函数......

function keyPressed(evt)
{
 var e = evt || event;
 var key = e.which || e.keyCode;

 if (powerKeysEnabled)
 {
  switch (key)
  {
   case 38://Up Arrow
   if (e.target.nodeName.toLowerCase()=='a' && e.target.previousSibling && e.target.previousSibling.nodeName.toLowerCase()=='input' && e.target.previousSibling.type=='checkbox' && e.target.parentNode.parentNode.nodeName.toLowerCase()=='tr')
   {
    var t;
    if (e.target.parentNode.parentNode.parentNode.parentNode.nodeName.toLowerCase()=='table') {t = e.target.parentNode.parentNode.parentNode.parentNode;}
    else if (e.target.parentNode.parentNode.parentNode.nodeName.toLowerCase()=='table') {t = e.target.parentNode.parentNode.parentNode;}

    var tr = t.getElementsByTagName('tr');

    for (var i=0; i<tr.length; i++)
    {
     if (tr[i]===e.target.parentNode.parentNode)
     {
      i--;

      if (tr[i])
      {
       var a = tr[i].getElementsByTagName('input');

       if (a[0] && a[0].type=='checkbox')
       {
        a[0].focus();
        break;
       }
       else
       {
        i--;

        if (tr[i])
        {
         var b = tr[i].getElementsByTagName('input');

         if (b[0] && b[0].type=='checkbox')
         {
          b[0].focus();
          break;
         }
        }
       }
      }
     }
    }
   }
   break;
  }
 }
}

任何对脚本如何工作感兴趣的人都应该意识到我将 XHTML 用作application/xhtml+xml并且对正确的代码非常清楚。还应该注意的是,我用锚替换不可自定义的输入复选框元素并隐藏复选框(通过 CSS positionnot display)并用锚元素直观地替换每个复选框。请注意,在脚本解释 XHTML 的方式中,空格在一定程度上很重要,不要为了他人而编辑。这是一个适用于...的示例 XHTML 表。

<table summary="This table displays emails from the currently choosen folder.">
<colgroup style="width: 5%;"></colgroup>
<colgroup style="width: 20%;"></colgroup>
<colgroup style="width: 50%;"></colgroup>
<colgroup style="width: 25%;"></colgroup>
<colgroup style="width: 5%;"></colgroup>
<thead><tr><td colspan="5"><span>Delete, move, other email features...</span></td></tr><tr><td><input type="checkbox" value="" /></td><td> </td><td> </td><td> </td><td> </td></tr></thead>
<tfoot><tr><td></td><td> </td><td> </td><td> </td><td> /td></tr></tfoot>
<tbody>
<tr id="mail_inbox_208_row"><td><input type="checkbox" value="" /></td><td> </td><td> </td><td> </td><td> </td></tr>
<tr id="mail_inbox_207_row"><td><input type="checkbox" value="" /></td><td> </td><td> </td><td> </td><td> </td></tr>
</tbody>
</table>
4

2 回答 2

0

您是否尝试过使用延迟为 0 的 setTimeout 来“让步”?类似于以下内容:

function keyPressed(evt)
{
 var e = evt || event;
 var key = e.which || e.keyCode;

 if (powerKeysEnabled)
 {
    setTimeout(function() {
      //perform work here
    }, 0);
 }
}
于 2013-09-07T20:43:30.457 回答
0

我为全选复选框添加了排除id项,它不再锁定;第二个如果条件...

if (
e.target.nodeName.toLowerCase()=='a' && 
e.target.id!='mail_inbox_all_img' && 
e.target.previousSibling && 
e.target.previousSibling.nodeName.toLowerCase()=='input' && 
e.target.previousSibling.type=='checkbox' && 
e.target.parentNode.parentNode.nodeName.toLowerCase()=='tr'
)
于 2013-09-22T20:58:25.687 回答