题解 | #移动控制#

移动控制

http://www.nowcoder.com/practice/84af7932f53f4bbeaa1fa079a138bb35

简洁、带注释的js代码

function bind() {
    // 以下变量可以复用,因此定义在外部,形成闭包。
    // step1. 获取表格
    const map = document.querySelector('table tbody');
    // step2. 寻找cur,并记录其位置row和col
    // row/col: cur的行索引和列索引
    // rows/cols: 表格的总行数和总列数
    let row, col;
    const rows = map.children.length;
    const cols = map.children[0].children.length;
    let find = false;
    
    document.onkeydown = event => {
        if (!event) return;
        var code = event.keyCode || '';
        if (!{'37': 1, '38': 1, '39': 1, '40': 1}[code]) return;
        event.preventDefault && event.preventDefault();
        // 如果不知道当前位置,则寻找当前位置
        if (!find) {
            for (row = 0; row < rows; row++) {
                for (col = 0; col < cols; col++) {
                    if (map.children[row].children[col].className === 'current') {
                        find = true;
                        break;
                    }
                }
                if (find) {
                    break;
                }
            }
        }
        
        // step3. 获得移动后的位置
        // 可以发现,38和40是垂直方向的移动,37和39是水平方向的移动
        // 即code为偶数时,改变行,为奇数时,改变列
        let rowNew = row, colNew = col;
        if (code % 2 === 0) {
            rowNew = (row + code - 39 + rows) % rows;
        } else {
            colNew = (col + code - 38 + cols) % cols;
        }
        // step4. 更新表格
        map.children[row].children[col].className = '';
        map.children[rowNew].children[colNew].className = 'current';
    };
}
全部评论

相关推荐

2024-12-26 13:00
太原理工大学 Java
会飞的猿:简历没啥大问题啊,感觉是缺少了实习经历。多投投先找个中小厂过渡一下吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务