我正在编写一个 JavaScript 应用程序并遇到问题,在 Firefox 上,大约 5-10% 的鼠标点击自定义按钮被忽略。
用于设置点击处理程序的原型
function Button(parent, styleClassName) {
Element.call(this, parent, "div");
this.setStyleClass(styleClassName);
}
Button.prototype = Object.create(Element.prototype);
Button.prototype.constructor = Button;
Button.prototype.setOnClick = function(handler) {
this.domNode.handler = handler;
// sporadically skipped
this.domNode.onclick = function(event) {
console.log("ocl: " + event.currentTarget.id);
this.handler(event);
if(event.preventDefault) event.preventDefault();
event.stopPropagation();
}
this.domNode.ontouchstart = function(event) {
console.log("ots: " + event.currentTarget.id);
this.handler(event);
if(event.preventDefault) event.preventDefault();
event.stopPropagation();
}
}
受影响的 html 元素的示例(事件处理程序已正确分配给外部 div):
<div style="position: absolute; overflow: hidden; visibility: visible; left: 291px; top: 4px; width: 34px; height: 34px;" id="LandscapeScreen0_pMain_dlg_Element0_btnCloseDialog">
<svg style="position: absolute; overflow: hidden; visibility: visible; width: 32px; height: 32px; cursor: pointer;" id="LandscapeScreen0_pMain_dlg_Element0_btnCloseDialog_RefSVG0">
<use href="#svg08"/>
</svg>
</div>
一些附加信息:
- 这些处理程序一旦设置,就永远不会修改或删除
- 甚至没有日志消息写入控制台
- 使用 addEventListener() 并不能解决问题
- 问题只存在于火狐(在v25.0测试)
- 最重要的是:即使是窗口也不检索事件!
关于最后一点:我添加了这些行进行调试:
window.onclick=function(e){console.log("onclick0");};
window.addEventListener("click",function(e){console.log("onclick1");}, true);
window.addEventListener("click",function(e){console.log("onclick2");}, false);
每当按钮没有检索到鼠标事件时,窗口甚至也不会接收到这些事件之一。所以不知何故,这些事件一定是在全球范围内被删除的!?
所以我需要的是一个提示,什么可能是导致这种行为的可能原因......当一个事件被跳过和什么时候不被跳过时,它似乎真的是不确定的。
谢谢你的帮助!