为 Li 元素注册事件的两种方法为何一错一对?

为 li 元素注册事件的两种方法为何一错一对?

注册事件的两种方法为何一错一对?

问题描述

在给 li 元素注册 onmouseover 和 onmouseout 事件时,尝试了两种方法。第一种方法正常工作,而第二种方法则报错。演示可参考:https://codepen.io/feifeiyu19...

方法一

var itemhidden = document.queryselectorall('.item_hide');
var sidebarli = document.queryselectorall('#sidebar li');

function setfun2(event_n1, event_n2) {
    event_n1.onmouseover = function () {
        event_n2.style.visibility = 'visible';
    }

    event_n1.onmouseout = function () {
        event_n2.style.visibility = 'hidden';
    }

    event_n2.onmouseover = function () {
        event_n2.style.visibility = 'visible';
    }

    event_n2.onmouseout = function () {
        event_n2.style.visibility = 'hidden';
    }
}

setfun2(sidebarli[0], itemhidden[0]);
setfun2(sidebarli[1], itemhidden[1]);
setfun2(sidebarli[2], itemhidden[2]);   

方法二

var itemHidden = document.querySelectorAll('.item_hide');
var sideBarLi = document.querySelectorAll('#sideBar li');    

for (let i = 0; i <p><strong>分析</strong></p><p>虽然两种方法最终效果相同,但第二种方法在特定情况下会报错。</p><p><strong>原因</strong></p><p>经过排查,发现两种方法中 li 元素和隐藏元素的数组长度不一致。</p>
  • 在方法一中,sidebarli 和 itemhidden 数组都只有 0, 1, 2 三个元素。
  • 而在方法二中,sidebarli 数组的长度可能会大于 itemhidden 数组的长度。

当 i 大于 itemhidden 数组的长度时,itemhidden[i] 就变成了 undefined,无法为其设置 onmouseover 事件监听器。这就导致了报错。

因此,第二种方法应该进行边界检查,确保在注册事件时不会出现越界的情况。

以上就是为 Li 元素注册事件的两种方法为何一错一对?的详细内容,更多请关注其它相关文章!