2013-09-24 29 views
1

我有一个好奇的情况。我正在编辑一个页面,它是一个可以移动的部件。任何方式来知道点击是来自“触发”还是实际点击?

不管怎样,我有一个对话框(弹出),它是绑定的(通过对话框创建类)到一个body click处理程序。基本上,如果你点击页面上的任何地方,它就会关闭。太好了。

这是蹭。页面上有另一个运行“$(body).trigger('click')”的进程。这是一个问题,因为在这种情况下,我不希望我的特定对话框关闭。

我跑了一些测试,他们似乎是相同的 - 1.)通过触发器产生一个点击 2.),并实际点击页面的主体。

是否有任何明确的方式知道点击是“假”触发呼叫还是真正的“点击”事件?由于触发点击中没有任何东西冒泡,有没有办法以某种方式尝试查看页面上是否有子元素以查看其冒泡或其他内容?

我希望我在我的解释中足够简洁。

+1

伪造的触发很少有鼠标coordinat在他们的事件中,尝试一下。 – prayerslayer

+0

你可以检查传递给事件处理程序的事件对象吗? –

+1

如果你不想检查事件对象,你可以让一个额外的参数传递一个或两个参数来详细说明事件的起源。 – Nightfirecat

回答

3

HTML:

<input type="button" id="button" value="click me" /> 

JS:

$("#button").on("click", function(e) { 
    if(typeof e.isTrigger == 'undefined') { 
     console.log("clicked"); 
    } else { 
     console.log("triggered"); 
    } 
}); 

setTimeout(function() { 
    $("#button").trigger("click"); 
}, 1000); 

演示:http://jsfiddle.net/wXnwp/1/

一种用于jQuery的1.6版本=>http://jsfiddle.net/wXnwp/3/

$("#button").click(function(e) { 
    if(typeof e.ctrlKey !== 'undefined') { 
     console.log("clicked"); 
    } else { 
     console.log("triggered"); 
    } 
}); 

setTimeout(function() { 
    $("#button").trigger("click"); 
}, 1000); 
+0

非常感谢你!我没有意识到有一个“isTrigger” - 当时,我只是看着。我没有使用jquery 1.7 - 看起来在那个版本中使用。我只有1.6。 arrghh。这是我所需要的!哼。也许我可以使用polyfil做它..我upvoted只是因为它的一个很好的答案。但它不适用于我。虽然聪明。 –

+0

请检查此小提琴http://jsfiddle.net/wXnwp/3/打开控制台,然后单击按钮。你会看到这两个对象有很多不同之处。这个小提琴也适用于1.6 – Krasimir

+0

这也工作!大。谢谢。好奇 - 为什么用ctrlKey?我发现currentTarget或originalEvent可能也是很好的选择。只是好奇ctrlKey指定。 (我认为这只是控制键)。 –