Data binding 敲除绑定双击和单击,如果双击则忽略单击
我有一个绑定到以下ko函数的click事件:Data binding 敲除绑定双击和单击,如果双击则忽略单击,data-binding,knockout.js,double-click,Data Binding,Knockout.js,Double Click,我有一个绑定到以下ko函数的click事件: self.select = function (entity, event) { var ctrlPressed = false; if (event.ctrlKey) { ctrlPressed = true; } if (!ctrlPressed) { manager.deselectAll(); this.selected(true);
self.select = function (entity, event) {
var ctrlPressed = false;
if (event.ctrlKey) { ctrlPressed = true; }
if (!ctrlPressed) {
manager.deselectAll();
this.selected(true);
} else {
this.selected() ? this.selected(false) : this.selected(true);
}
}
它是这样的:
data-bind="click: select, event: { dblclick: function(){alert('test');}}"
这目前的工作,除了它激发“选择”两次当你双击,这是我不想要的。我尝试了以下操作,但是当我创建singleClick()函数时,我得到一个错误:“ctrlKey不是一个未定义的函数”。所以它没有正确地传递事件。此外,另一个答案中的doubleClick()函数根本不起作用。它在“handler.call”部分给出一个错误,表示未定义处理程序
那么,我怎样才能在单次单击时成功调用ko select函数,而不是在双击时成功调用它呢?我认为这不是一个真正的问题。您至少有以下两种选择: 1.实现一些自定义逻辑,如果单击已开始处理,则阻止处理 2.完全禁止双击功能。JQuery有一个方便的处理程序:
$(selector).on("dblclick", function(e){
e.preventDefault(); //cancel system double-click event
});
所以从技术上讲我让它起作用了。这是我的新单键点击功能
ko.bindingHandlers.singleClick = {
init: function (element, valueAccessor, c, viewModel) {
var handler = valueAccessor(),
delay = 400,
clickTimeout = false;
$(element).click(function (event) {
if (clickTimeout !== false) {
clearTimeout(clickTimeout);
clickTimeout = false;
} else {
clickTimeout = setTimeout(function () {
clickTimeout = false;
handler(viewModel, event);
}, delay);
}
});
}
};
这会将viewModel和事件传递给处理程序,以便我仍然可以修改可观察对象并捕获ctrlKey
约束力:
data-bind="singleClick: select, event: { dblclick: function(){alert('test');}}"
问题是,很明显,现在单击一个项目在等待是否是双击时会有延迟。我相信,这是一个固有的和无法解决的问题,因此,尽管从技术上回答了我的问题,但我会考虑完全不同的路径(即,在我的界面中没有双击)