这该怎么做?
这该怎么做?
这是一个很好的问题,我认为它并不容易解决。(这里有一些相关讨论)
如果你非常需要这个功能,可以通过以下方式进行修改:
function singleClick(e) {
// do something, "this" will be the DOM element
}
function doubleClick(e) {
// do something, "this" will be the DOM element
}
$(selector).click(function(e) {
var that = this;
setTimeout(function() {
var dblclick = parseInt($(that).data('double'), 10);
if (dblclick > 0) {
$(that).data('double', dblclick-1);
} else {
singleClick.call(that, e);
}
}, 300);
}).dblclick(function(e) {
$(this).data('double', 2);
doubleClick.call(this, e);
});
这里有一个它的工作示例。
评论中提到,有一个插件可以做到我上面所做的事情,但是它将其打包起来,让你不必看到丑陋的代码:FixClick。
雷蒙德·陈(Raymond Chen)讨论了单击与双击的一些含义 - 尽管他是在Windows环境下谈论,但他所说的对于基于浏览器的UI设计也是相关的。
基本上,在双击时执行的操作应该是单击后逻辑上要做的事情。例如,在桌面UI中,单击选择一个项目,双击打开它(例如,打开文件或启动应用程序)。用户必须先选择要打开的文件,因此单击操作在双击操作之前执行并不重要。
如果您有一个UI组件,其双击操作与单击操作完全无关,以至于一旦系统意识到实际上是双击操作,就需要防止单击操作发生,那么您真的应该重新考虑您的设计。用户会觉得笨拙和违反直觉,因为它不会像他们习惯的东西那样运作。
如果您仍然想走这条路,那么您将不得不使用去抖动技术(在这种情况下,所有单击操作都将延迟),否则实现一些机制,使双击处理程序撤消单击处理程序完成的工作。
您还应该知道,一些用户设置了非常长的双击时间。例如,患有关节炎的人可能将其系统首选项中的双击时间设置为超过一秒钟,因此基于您选择的任意时间段的去抖动技术将使单击操作排除双击操作的UI组件无法访问这些人。据我所知,“撤销刚才发生的单击操作”技术是唯一可行的解决方法。
jQuery Sparkle 提供了一个干净优雅的解决方案,通过实现单击自定义事件。通过这样做,您可以像使用任何其他事件一样使用它:
$('#el').singleclick(function(){});
// or event
$('#el').bind('singleclick', function(){});
$('#el').lastclick(function(event,clicks){
if ( clicks === 3 ) alert('Tripple Click!');
});
您可以在这里找到定义自定义事件的源代码。
它是根据AGPL许可证的开源软件,所以您可以放心地随意获取所需! :-) 它也在日常基础上积极开发,因此您永远不会缺少支持。
但最重要的是,它是一个DRY插件/效果框架,可以让您更轻松地开发插件和扩展。希望这能帮助您实现这个目标!
$(selector).click(function(e) {
$(this).prop('disable', true);
}