据我所知,该链接<a id="workID" href="#">WORK</a>
未绑定到单击事件处理程序。在屏幕截图中,您可以看到您设置了多个事件,但未设置单击。
在您的main.js中,您正在调用函数 showWorkPane() 但在此函数中,您没有为 onClick 定义事件处理程序:
function showWorkPane() {
var workID = document.getElementById("workID");
workID.addEventListener("mouseover", showWorkPaneHandler, false);
// add an event handler for click
}
解决您的问题:为什么 DOM2“点击”事件不起作用,而它对“鼠标悬停”起作用?
那么你必须绑定两个事件(单击和鼠标悬停)。目前我正在查看您的代码,看起来触发的事件处理程序 onmouseouthideWorkPaneHandler(e)
将与您显示工作窗格的意图相冲突。
事件顺序是这样的
- 用户将鼠标移到链接“工作”上
- 用户单击链接“工作”<--当前没有事件处理程序,您必须添加它
- 用户将鼠标移出链接->这会触发
hideWorkPane(e)
更新 1:不工作的原因
在评论中,用户Felix King说:“我理解这个问题,将处理程序绑定到鼠标悬停是有效的,但是当 OP 将其更改为单击时,它无法按预期工作。” 请您对此发表评论。请将非工作版本点击在线并在此处链接,以便我们查看。
不管是不是这种情况,如果您将所有事件(单击、鼠标悬停、鼠标悬停)添加到链接,您必须找到一个解决方案,即单击链接不会与将鼠标移离链接(并触发 mouseout)发生冲突.
更新 2:代码重构
一个辅助函数,因为跨浏览器的事件不同(参见quirksmode.org/ on events)。如果你愿意,你可以使用 jQuery。
function getTargetFromEvent(e) {
// http://www.quirksmode.org/js/events_properties.html#target
var targ;
if (!e) var e = window.event;
if (e.target) targ = e.target;
else if (e.srcElement) targ = e.srcElement;
if (targ.nodeType == 3) // defeat Safari bug
targ = targ.parentNode;
return targ;
}
我创建了一个函数来包装事件处理程序的添加。您可以通过这样调用它来使用它addEventShowPaneHandler('mouseover');
function addEventShowPaneHandler(eventType){
document.getElementById("workID").addEventListener(eventType, showPaneHandler, false);
document.getElementById("aboutID").addEventListener(eventType, showPaneHandler, false);
document.getElementById("connectID").addEventListener(eventType, showPaneHandler, false);
}
以下函数替换了您show---PaneHandler(e)
和您的所有hide---PaneHandler(e)
函数。您所要做的就是在链接中添加相应的窗格 ID 作为数据属性。例子:<li><a id="workID" data-paneId="workPane" href="#work">WORK</a></li>
function showPaneHandler(e) { // suggestion to rename it to togglePaneDisplay
e.preventDefault();
if (!e) var e = window.event;
console.log(e.type);
var element = getTargetFromEvent(e);
// see nodeinformation attributes at http://www.quirksmode.org/dom/w3c_core.html
var paneId = element.attributes["data-paneId"].value;
var pane = document.getElementById(paneId);
if(pane.style.display == "block" || pane.style.display == "undefined")
{
pane.style.display = "none";
}else{
pane.style.display = "block";
}
}
因此,对于导航中的每个链接,您都可以添加 data-paneId 属性以及相应的窗格 ID,如下所示:
<nav role="navigation" id="pageNav">
<ul>
<li><a id="workID" data-paneId="workPane" href="#work">WORK</a></li>
<li><a id="aboutID" data-paneId="aboutPane" href="#about">ABOUT</a></li>
<li><a id="connectID" data-paneId="connectPane" href="#connect">CONNECT</a></li>
</ul>
如果您有更多问题或需要进一步帮助,请告诉我。