2013-03-30 76 views
1

我有一个元素点击事件,点击一次点击两次,这是一个常见的搜索问题,但我排除了其他答案的潜在原因。该代码是jQuery点击触发两次,但只注册一次

console.log("registering label click"); 
$("label.tiletype").click(
    function(event) { 
    event.stopPropagation(); // stop the .tile click being called 
    console.log("label clicked, x = " + event.pageX + ", y = " + event.pageY); 
    // more code... 
    } 
} 

当页面加载和“label.tiletype”点击,日志

registering label click 
label clicked, x = 679, y = 172 
label clicked, x = 679, y = 172 

由于“注册标签上单击”只会发生一次,它不能是由于任何原因点击被绑定两次。

由于pageX和pageY坐标是相同的,双重事件发生在相同的物理点击,而不是在元素上调用的第二个程序化点击()(我认为,如果错误的话纠正我)。

调试行只在这个特定位的代码中,所以没有其他点击事件触发。

我已经检查了Firebug中的源代码,并且有多个“label.tiletype”元素但屏幕上没有重叠,它们都是display:block和float:left。

JavaScript文件中还有其他的东西发生(行375 https://github.com/okohll/agileBase/blob/200dd1c6c1a8968bc9d8f5b2b3d9188ac4776984/gtpb_clientside/resources/simple/simple.js),但无论发生什么,上述语句必须始终在逻辑上是真实的。

这在Firefox和Safari中都会发生。

我错过了什么?

的jsfiddle:http://jsfiddle.net/okohll/cKgAp/

+0

你能得到[小提琴](http://jsfiddle.net)请? – yckart

+0

http:// jsfiddle。净/ okohll/cKgAp/ –

回答

1

你的代码有语法错误的话,它应是

console.log("registering label click"); 
$("label.tiletype").click(function(event) { 
    event.stopPropagation(); // stop the .tile click being called 
    console.log("label clicked, x = " + event.pageX + ", y = " + event.pageY); 
    // more code... 
}); 

但这个代码按预期工作(只有一个“标签点击”消息触发)。因此,您应该检查其他代码或HTML代码的有效性(例如,未封闭的标签可能导致此行为)。

+0

啊谢谢,失踪)是我的复制错误,而不是原来的代码。尽管如此,我会查找未封闭的标签和其他语法错误。我刚刚做了一个jsfiddle,我将编辑该问题添加。 –

4

根据this site双重使用$(document).ready可能是原因。尝试通过首先解除您的功能来避免它:

$('label.tiletype').unbind('click').bind('click', 
function(event) { 
    event.stopPropagation(); // stop the .tile click being called 
    console.log('label clicked, x = ' + event.pageX + ', y = ' + event.pageY); 
    // more code... 
} 
+0

谢谢,我没有成功尝试过。如果它是一个双重绑定(没有双关语意图),那么“注册点击事件”不会记录两次 –

+0

有趣的是:如果我点击你的小提琴中的单选按钮,我只会得到1个警报,如果我点击文本,我得到两个。也许这可能会导致一些解决方案。 – danielwinter

+1

是的,我同时发现,点击输入作为第二个事件冒泡 - 看到我刚刚添加的答案。谢谢。 –

2

啊,发现它!标签有一个输入封装在里面,其中一个事件是由于点击传播了。

添加

$("label.tiletype input").click(function(event) { 
    event.stopPropagation(); 
}); 

http://jsfiddle.net/okohll/cKgAp/

修复它。感谢提示做一个jsfiddle,我最初认为我不能复制它。

+1

的提琴手中获得了两个事件stopPropagation可能会中止事件委托(您的其他代码或其他模块可能无法工作)。更好的解决方案是修复HTML结构,例如像这样:http://jsfiddle.net/richard03/cKgAp/3/ – Richard

0

您可以使用on()

$("label.tiletype").on('click', function (event) { 
    alert("label clicked, x = " + event.pageX + ", y = " + event.pageY); 
}); 

http://jsfiddle.net/cKgAp/6/