【发布时间】:2016-01-27 16:38:09
【问题描述】:
这很棘手,所以我会尽力解释清楚。
我有一个网络应用程序,我想允许我的用户更改某些 div 的背景颜色。为此,我想使用颜色选择器界面,并且我想在目标 div 上使用contextmenu 事件来打开它,因为它们已经附加了另一个行为到点击事件。
所以想法是在屏幕中隐藏输入类型颜色,将其点击事件附加到目标 div 上的contextmenu 事件,并在输入类型颜色更改事件上更改目标 div 的背景颜色。
有趣的事情是,当我尝试链接事件时,如果从 contextmenu 事件处理程序中调用它的点击事件,颜色选择器不会打开,但如果从点击中调用它会打开事件。
使用 jQuery 来简化代码:
//this works perfectly, color picker opens
$("#myTargetDiv").on("click", function() {
$("#inputTypeColor").trigger("click");
});
//this fails miserably
$("#myTargetDiv").on("contextmenu", function() {
$("#inputTypeColor").trigger("click");
return false;
});
最奇怪的事实是,如果我使用第三个元素来传递事件,例如,我调用一个中间输入类型文本,它将调用从 myTargetDiv 传递到inputTypeControl,中间元素中的 click 事件会触发(即使从 contextmenu 事件处理程序中调用),而输入类型 color 中的事件不会触发。
但如果您直接点击中间输入类型文本,颜色选择器就会打开!
//If you right click on myTargetDiv "firing!" appears on console, but color picker doesn't opens
$("#myTargetDiv").on("contextmenu", function() {
$("#intermediateElement").trigger("click");
return false;
});
//If you click on intermediateElement, however, the color picker opens!!!
$("#intermediateElement")on("click", function() {
console.log("firing!");
$("#inputTypeColor").trigger("click");
});
我已经在 Firefox 和 Chrome 中重现了这种行为,但我不太确定这是预期的功能、浏览器输入类型颜色实现中的错误还是 jQuery 的事件处理问题(我没有尝试启动事件我自己还没有)。
https://jsfiddle.net/bardobrave/0z6ev4rd/1 如果你点击“开火!”颜色选择器会打开,但如果您右键单击它,颜色选择器不会打开,即使您单击输入类型文本也会打开。
有人可以就此事提供一些见解吗?
【问题讨论】:
-
好吧,看来HTML5颜色选择器只响应
click事件,不能被其他事件触发。修补你的小提琴,你可以看到一切都火了:jsfiddle.net/Twisty/0z6ev4rd/2 但由于它不是点击事件,所以选择器不会打开。因此,如果您想让自己创建一个菜单,然后单击颜色选项,这将起作用。
标签: javascript jquery event-handling jquery-events color-picker