添加使用向上和向下箭头键选择表格行的功能

2024-01-04

我需要专家的帮助来解决我的以下问题,因为它超出并远远超出了我对 JavaScript 编程的知识水平。

鉴于下面现有的 JavaScript 编码,我如何搭载并添加到现有编码中,以便为用户添加功能,以便在滚动时使用向上和向下箭头键滚动表格(顺便说一下标题列) except) 它将突出显示所选行并更改其行颜色。

需要注意的是,如果选择现有的表格行,并且我按下向上或向下箭头键,它只会移动到并突出显示上一行和下一行。这里的一些逻辑是,我猜测需要找到行索引才能执行此操作。就像我说的,这远远超出了我所知道的范围。

非常感谢并非常感谢您的所有帮助。

<!DOCTYPE html>
<html>
<head>
<style type="text/css">
tr.normal td {
    color: black;
    background-color: white;
}
tr.highlighted td {
    color: white;
    background-color: red;
}
</style>
</head>
<body>
<div id="results" class="scrollingdatagrid">
  <table id="mstrTable" cellspacing="0" border="1">
     <thead>
      <tr> 
        <th>File Number</th>
        <th>Date1</th>
        <th>Date2</th>
        <th>Status</th>
        <th>Num.</th>
      </tr>
    </thead>
    <tbody>
      <tr> 
        <td>KABC</td>
        <td>09/12/2002</td>
        <td>09/12/2002</td>
        <td>Submitted</td>
        <td>1</td>

      </tr>
      <tr> 
        <td>KCBS</td>
        <td>09/11/2002</td>
        <td>09/11/2002</td>
        <td>Lockdown</td>
        <td>2</td>
      </tr>

      <tr> 
        <td>WFLA</td>
        <td>09/11/2002</td>
        <td>09/11/2002</td>
        <td>Submitted</td>
        <td>3</td>
      </tr>
      <tr> 
        <td>WTSP</td>
        <td>09/15/2002</td>
        <td>09/15/2002</td>
        <td>In-Progress</td>
        <td>4</td>
      </tr>
    </tbody>
  </table>
</div>

<script type="text/javascript">
(
function() {
var trows = document.getElementById("mstrTable").rows;

    for (var t = 1; t < trows.length; ++t) {
        trow = trows[t];
        trow.className = "normal";
        trow.onclick = highlightRow;
    }//end for

    function highlightRow() {
        for ( var t = 1; t < trows.length; ++t ) {
            trow = trows[t];
            if (trow != this) { trow.className = "normal" }
        }//end for

        this.className = (this.className == "highlighted")?"normal":"highlighted";
      }//end function



  }//end function

)();//end script
</script>
</body>
</html>

这当然不是最佳的,但由于您没有使用 jQuery(或类似的库),您已经产生了大量的跨浏览器开销。这应该向后兼容至 IE8。

Live Demo http://jsfiddle.net/EYYgT/2/

HTML

这里唯一的变化是添加了tabindex

<table tabindex='0' id="mstrTable" cellspacing="0" border="1">

JS

//From: http://forrst.com/posts/JavaScript_Cross_Browser_Event_Binding-yMd
var addEvent = (function( window, document ) {
    if ( document.addEventListener ) {
        return function( elem, type, cb ) {
            if ( (elem && !elem.length) || elem === window ) {
                elem.addEventListener(type, cb, false );
            }
            else if ( elem && elem.length ) {
                var len = elem.length;
                for ( var i = 0; i < len; i++ ) {
                    addEvent( elem[i], type, cb );
                }
            }
        };
    }
    else if ( document.attachEvent ) {
        return function ( elem, type, cb ) {
            if ( (elem && !elem.length) || elem === window ) {
                elem.attachEvent( 'on' + type, function() { return cb.call(elem, window.event) } );
            }
            else if ( elem.length ) {
                var len = elem.length;
                for ( var i = 0; i < len; i++ ) {
                    addEvent( elem[i], type, cb );
                }
            }
        };
    }
})( this, document );

//derived from: http://stackoverflow.com/a/10924150/402706
function getpreviousSibling(element) {
    var p = element;
    do p = p.previousSibling;
    while (p && p.nodeType != 1);
    return p;
}

//derived from: http://stackoverflow.com/a/10924150/402706
function getnextSibling(element) {
    var p = element;
    do p = p.nextSibling;
    while (p && p.nodeType != 1);
    return p;
}

;(function() {
    var trows = document.getElementById("mstrTable").rows;

    for (var t = 1; t < trows.length; ++t) {
        trow = trows[t];
        trow.className = "normal";
        trow.onclick = highlightRow;
    }//end for

    function highlightRow() {
        for ( var t = 1; t < trows.length; ++t ) {
            trow = trows[t];
            if (trow != this) { trow.className = "normal" }
        }//end for

        this.className = (this.className == "highlighted")?"normal":"highlighted";
    }//end function

    addEvent(document.getElementById('mstrTable'), 'keydown', function(e){
        var key = e.keyCode || e.which;

        if((key === 38 || key === 40) && !e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey){

            var highlightedRows = document.querySelectorAll('.highlighted'); 

            if(highlightedRows.length > 0){

                var highlightedRow = highlightedRows[0];

                var prev = getpreviousSibling(highlightedRow); 
                var next = getnextSibling(highlightedRow); 

                if(key === 38 && prev && prev.nodeName === highlightedRow.nodeName){//up
                    highlightedRow.className = 'normal';
                    prev.className = 'highlighted';
                } else if(key === 40 && next && next.nodeName === highlightedRow.nodeName){ //down
                    highlightedRow.className = 'normal';
                    next.className = 'highlighted';
                }

            }
        }

    });


})();//end script
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加使用向上和向下箭头键选择表格行的功能 的相关文章

随机推荐

  • 为什么 hadoop 对于简单的 hello world 作业来说很慢

    我正在按照hadoop网站上的教程进行操作 https hadoop apache org docs r3 1 2 hadoop project dist hadoop common SingleCluster html https had
  • 在 Angular 2 中等待服务器对 http 请求的答复

    我的 Angular2 应用程序有一点问题 我想从服务器获取一些数据以供用户登录 但我的代码仍在继续 并且有很多错误 我想等待服务器的答复 然后对我的数据执行某些操作 这是我的代码 import Injectable from angula
  • Hive:在主表上进行增量更新的最佳方法

    所以我在 Hive 中有一个主表 它将存储我的所有数据 我希望能够每月加载增量数据更新 有大量数据 数十亿行 将会有新的数据 以及更新的条目 解决这个问题的最佳方法是什么 我知道 Hive 最近升级并支持更新 插入 删除 我一直在想的是以某
  • ASI 是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 Javascript自动插入分号的规则是什么 https stackoverflow com questions 2846283 what are the rules for javascripts
  • 在 Xcode 4 中将文件添加到单独的目标

    自从升级到 xcode 4 以来 我找不到在哪里指定资源所属的 Target 以前 我选择了该文件并点击 command i 但现在这似乎是运行该程序 而不是调出该文件的信息框 Select the project file in the
  • 禁用 dc.js 中的交互性

    我有许多使用创建的条形图dc js 在默认行为中 用户可以单击并拖动其中任何一个来更新交叉过滤器 如何使图表 仅显示 也就是说 当其他组件更新交叉过滤器时 图表也会更新 但用户无法选择 仅显示 图表中的数据来更新交叉过滤器 None
  • 查询列定义的数据长度 - SQL Server

    我希望生成数据库的所有表 列和数据类型的列表 这个查询将为我提供除数据类型长度之外的所有信息 SELECT t name AS TableName c name AS ColumnName y name AS DataType FROM s
  • 为什么一个简单的 T-SQL UDF 函数会使代码执行速度慢 3 倍

    我正在重写一些旧的存储过程 并且在使用函数而不是内联代码时遇到了意外的性能问题 该功能非常简单如下 ALTER FUNCTION dbo GetDateDifferenceInDays first date SMALLDATETIME se
  • 是否有可能/如何获取特定 Facebook 群组成员的数量(即使数量超过 500 人)?

    我需要监控 Facebook 群组用户的数量并将其显示在网站上 我知道可以使用他们的 API 获取用户 ID 但仅限 500 个 如果会员总数超过 500 人 获取注册我建立的 Facebook 群组的成员总数的最简单方法是什么 这是可能吗
  • teamcity错误MSB4057:项目中不存在目标“pack”

    无法使用 4 7 框架为 Dot Net Core 项目创建包 我正在 teamcity 中使用 msbuild t pack p COnfiguration Release 命令来创建包
  • 从 JSON 类别中获取数据

    我正在编写一个应用程序 我在其中从 JSON 中获取数据 我能够获取类别列表但每当我点击任何类别时未获取产品列表始终在该特定类别下获取空白活动 JSON categoryId 1 categoryTitle SmartPhones Smar
  • User.IsInRole 返回 false

    我正在使用 Identity 2 在 mvc 5 网站中进行身份验证 在我看来 我想检查用户的角色 if User IsInRole Customers do something 但这总是返回 false 我已经设置了
  • 带有 Facebook 评论的自定义滚动条

    The goal 我想在窗口加载时运行滚动条脸书评论 容器 问题 滚动条工作得很好 但我必须resize屏幕强制其调用 场景 I made jsFiddle 上的示例 http jsfiddle net vDUyU 看一下 说明当前的情况
  • 用 C 生成所有元组 - 比嵌套循环更好的方法?

    我有一个数组double x 长度为 11 的函数f double x 我想找到函数的最小值f 通过离散化 所以对于给定的值val1 val2 valn我需要一个循环遍历 val 1 val n 11 中 x 的所有元组 我可以轻松地使用
  • C++ 概念占位符类型推导

    在范围规范中N4622 http www open std org jtc1 sc22 wg21 docs papers 2016 n4622 pdf the Same概念被定义为两种类型T and U 但有时在内部使用requires只有
  • 无法从 START_ARRAY 令牌中反序列化 java.util.HashMap 的实例

    我在使用 jackson core 2 7 3 jar 解析 JSON 时遇到问题 你可以从这里得到它们http repo1 maven org maven2 com fasterxml jackson core http repo1 ma
  • 在 C++11 中实现元函数 zip

    我实际上想看看是否可以获得一个最小的库 该库支持我从 boost fusion 使用的极少数操作 这是我到目前为止所拥有的 template lt typename Types gt struct typelist template lt
  • 是什么导致Spring在使用AnnotationConfigApplicationContext时无法加载配置类?

    我最近遇到了这个问题 在搜索 stackoverflow 网站后 找不到可行的解决方案 我收到的错误是 Spring 在加载配置类时遇到问题 我使用注释和 Spring 类来配置 而不是 XML 文件 以练习使用注释而不是 XML 文件配置
  • 是否可以强制使用 DataType 作为 DataType.Currency 的 MVC3 字段的货币

    我正在编写一个 MVC3 应用程序 它从数据库中读取一堆货币数据 我遇到的问题是这些金额都是不同的货币 如果我像这样设置字段的类型 DataType DataType Currency public Amount get set 我得到小数
  • 添加使用向上和向下箭头键选择表格行的功能

    我需要专家的帮助来解决我的以下问题 因为它超出并远远超出了我对 JavaScript 编程的知识水平 鉴于下面现有的 JavaScript 编码 我如何搭载并添加到现有编码中 以便为用户添加功能 以便在滚动时使用向上和向下箭头键滚动表格 顺