【发布时间】:2023-03-25 15:50:01
【问题描述】:
我一直在开发一个基本的 javascript 下拉菜单,使用 addEventListener 和 attachEvent 来处理点击和鼠标功能。点击事件调用的函数subOpen,使用javascript“this”关键字获取被点击元素的id。
添加事件示例:
//add event listeners to menuitems
for (var i=0; i < menuitems.length; i++) {
if (menuitems[i].addEventListener) {
menuitems[i].addEventListener('click', subOpen, false);
menuitems[i].addEventListener('mouseout', closeTimer, false);
menuitems[i].addEventListener('mouseover', cancelTimer, false);
menuitems[i].addEventListener('selectstart', menucursorselect, false);
} else if (menuitems[i].attachEvent) {
menuitems[i].attachEvent('onclick', subOpen);
menuitems[i].attachEvent('onmouseout', closeTimer);
menuitems[i].attachEvent('onmouseover', cancelTimer);
menuitems[i].attachEvent('onselectstart', menucursorselect);
}
}
使用“this”关键字的 subOpen 函数示例:
function subOpen() {
cancelTimer(); //stops the close timer
if (submenudisplay) {
document.getElementById(submenudisplay).style.display = "none";
activeSubMenu = false;
}
var curMenuId = this.id;
var curSubMenuId = this.id + "submenu";
if (curSubMenuId) {
document.getElementById(curSubMenuId).style.display = "block";
activeSubMenu = true;
}
submenudisplay = curSubMenuId;
现在,除了早期版本的 Internet Explorer 之外,我测试过的所有浏览器都可以正常运行。对于旧版本的 IE,调试器会将“this.id”标记为未定义,因此它不知道要打开哪个子菜单。我做了一些研究,发现旧的IE在附加事件时不会复制函数,而是引用它,所以我无法使用“this”关键字捕获任何有用的数据。
我想知道是否有不同的关键字或函数可以用来完成与旧版本 IE 相同的工作。
我的完整版测试代码可以在here找到:
【问题讨论】:
-
我讨厌推荐可怕的大框架,但这是 jQuery 擅长做的事情。它真的很方便,而且对 Internet Explorer 的处理也足够好。
-
我会将 jQuery 描述为 温暖和模糊,而不是 又大又可怕。在这个时代,使用 JavaScript 时几乎可以理解为使用 jQuery。
-
@user1689607 - 哪一部分是废话? “温暖而模糊”还是“明白用过”?我认为第一个陈述非常可靠。第二个无疑是有问题的......
-
抱歉,主要是后者,虽然我真的不认为 jQuery 大而可怕或温暖而模糊。这对我来说只是另一个代码库。
标签: javascript html