2012-04-13 41 views
8

考虑下面的HTML:为什么在部分标记文本时Opera没有发出点击事件?

<div contenteditable="true">Some text</div> 

而一些JS检测使用jQuery的单击事件:

$("div").click(function() { 
    alert('click!'); 
}); 

如果选择在div文本的一部分,click事件会(Opera 11.61在Linux上测试,在Windows上测试11.62)。双击某个词将其部分标记确实是的工作。

事件在IE7-9,Firefox,Chrome和Safari中抛出。有一个稍微修改JSFiddle here

这是预期的行为,JQuery错误,Opera错误还是其他?

+2

这听起来像是一个浏览器错误。您是否尝试过'mousedown'或'mouseup'作为解决方法? – 2012-04-13 08:56:34

+0

噢,我现在做了,而且确实可以解决这个问题,谢谢!尽管如此,我仍然希望找到原始问题的原因。 – kvikshaug 2012-04-13 09:00:25

+0

Opera是否将它视为一个onselect事件,但是它是一个div没有onselect事件? – Greg 2012-04-13 10:06:54

回答

2

哪种行为是“正确”的肯定是一个有趣的问题。我认为:我个人认为Opera的行为更有意义,因为用户打算在这里做的显然不是“点击”某些东西,而是“选择”某些东西。另一方面,我也认为Opera应该将其改为与其他浏览器兼容(除非我们可以让其他浏览器与Opera匹配)。兼容性非常非常重要。所以,在我的Opera员工帽子上说:我认为我们是正确的,我认为我们应该解决这个问题:-p

+0

我想这是官方的,因为它会得到:) – kvikshaug 2012-05-01 19:47:08

2

已知点击事件在不同元素和不同浏览器之间具有不一致的行为。在它的核心部分,当一个元素记录一个mousedown后跟一个mouseup时,点击事件应该被触发,请参阅jquery doc

我所听到的最好的建议是从here

无论这是一个问题取决于你想要的用户交互。但是,除非您完全确定您需要单击事件,否则您通常应将脚本注册为/ up。

因此,在评论你的问题的协议,最简单的解决方法是注册的mousedown或鼠标松开(哪一个取决于您正在寻找的,最接近的行为的行为“点击”是“鼠标松开')

+0

尽管我确实同意你的观点,但它并没有真正回答有关Opera的行为以及它是预期行为还是错误的问题。除非你真的说这是故意未定义的,在这种情况下,你将不得不纠正我。 – kvikshaug 2012-04-16 08:13:19

+0

你说得对,我没有答案。与许多编程API相比,我发现大多数文本和容器对象没有点击事件,这些事件通常出现在用户可交互元素(如按钮)上。所以,在你的例子中没有在div容器中定义它并不奇怪。如果你真的想知道,我会发邮件给Opera支持或在Opera论坛发帖子,他们在那里有一个非常好的社区。 – Sogger 2012-04-16 14:51:49

相关问题