0

我正在编写一个 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);

每当按钮没有检索到鼠标事件时,窗口甚至也不会接收到这些事件之一。所以不知何故,这些事件一定是在全球范围内被删除的!?

所以我需要的是一个提示,什么可能是导致这种行为的可能原因......当一个事件被跳过和什么时候不被跳过时,它似乎真的是不确定的。

谢谢你的帮助!

4

0 回答 0