【问题标题】:click Event is not delegated in chrome单击事件未在 chrome 中委派
【发布时间】:2012-02-17 06:37:34
【问题描述】:

在我的应用程序中,我创建了一些新元素并根据用户的操作将它们附加到页面,

var dv=document.createElement('div');
//set styles for the dv
.....

创建这个 div 元素后,我会添加一些事件:

MyLib.Event.addDomListener(dv,'click',function(e){
    console.info('click');
});
MyLib.Event.addDomListener(dv,'mousedown',function(e){
    console.info('mousedown');
});

这是页面中生成的结果(一个div包含一个img标签和一个span标签):

页面加载后,出现问题。

如果我直接点击图片,click 事件不会触发,但mousedown 事件会触发。

如果我直接点击没有图像的div,一切顺利。

似乎,当我单击图像时,click 事件并未委托给 div。

然后我通过Chrome开发工具复制最终生成的代码,是这样的:

<div id="con" style="position: absolute; border:1px solid red; left: 10px; top: 10px; width: 20px; height: 34px; ">
        <img src="http://localhost/MAPALINE/IMAGES/MARKER_LARGE.PNG" id="ov" style="left: 0px; top: 0px; position: relative; width: 20px; height: 34px; ">
        <span style="text-align: center; left: 0px; top: 0px; width: 20px; position: absolute; ">1</span>
</div>

然后我将它复制到一个新的 .html 文件中,并添加事件脚本:

<script type="text/javascript">
    var con=document.getElementById('con');
    con.addEventListener('click',function(e){
        console.info('click');
    },false);
    con.addEventListener('mousedown',function(e){
        console.info('mousedown');
    },false);
</script>

现在,无论我在 div 内的哪个位置单击,这两个事件都会发生。

我真的疯了,有什么问题吗?我没有专门为生成的 div 做任何事情。

所以我想知道你们中是否有人遇到过这个问题?或者在哪种情况下会发生这种异常?


更新:

Mylib.Event.addDomListener=function(target,evt,handler){
    if(target.addListener){
        target.addListener(evt,handler,false);
    }else if(target.atttchEvent){
        target.attachEvent('on'+evt,handler);
    }else
        #~ target['on'+evt]=handler;
}

它仅用于跨浏览器使用,请注意mousedown 事件无论如何都可以正常工作。

【问题讨论】:

  • MyLib.Event.addDomListener() 是做什么的(请出示代码)?

标签: javascript dom-events event-delegation


【解决方案1】:

我注意到您正在使用两种不同的方法在两个示例之间附加侦听器。

最好的做法是通过使事情尽可能地重复来隔离可能的原因。尝试使用相同的方法为两个测试附加监听器,这可能会让您有所了解。

另外,我不知道“MyLib”是什么,但如果它是某种 JS 库,问题可能出在那个库中。尝试使用原生 JS 方法或其他库。

【讨论】:

  • 您应该验证该事件实际上是附加的。这将帮助您确定问题是附加事件之一还是事件传播之一。我建议在“元素”面板中尝试 Chrome 的“事件侦听器”选项卡。 (stackoverflow.com/a/7122245/867944) 或者可能在 Firefox 中使用 Firebug 的 Eventbug 扩展 (getfirebug.com/wiki/index.php/Firebug_Extensions#Eventbug)
  • 它附加在 chrome 中。但它仍然不起作用。但是,如果我添加此MyLib.addDomListener(dv,'mousedown',function(e){e.cancelBubble=true;e.stopPropagation &amp;&amp; e.stopPropagation();});。点击事件将起作用。
  • 我想知道为什么鼠标按下会阻止点击?
  • 有时最好找到解决方法,跳过谜团,继续前进。
猜你喜欢
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多