防止拖动上的ko点击绑定
Prevent ko click binding on draggable?
我发现了一些问题来阻止拖动时的事件传播,包括我现在尝试的解决方案:
演示Fiddle
$('div').draggable({
start: function(event, ui) {
ui.helper.bind("click.prevent",
function(event) { event.preventDefault(); });
},
stop: function(event, ui) {
setTimeout(function(){ui.helper.unbind("click.prevent");}, 300);
}
这根本不起作用。该问题与KO点击绑定无关。我发现的唯一一个相关的,没有被接受的答案(唯一的答案很模糊,说要尝试preventDefault())。
那么,在拖动项目后释放鼠标按钮时,如何防止单击绑定呢?
您可以使用自定义绑定来解决此问题:
ko.bindingHandlers.clickUnlessDragged = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var $element = $(element),
clickHandler = ko.utils.unwrapObservable(valueAccessor()),
wasDragged = false,
mouseupHandler,
dragstartHandler,
dragstopHandler;
mouseupHandler = function mouseupHandler(event) {
if (!wasDragged) {
clickHandler(event);
}
};
dragstartHandler = function dragstartHandler() {
wasDragged = true;
};
dragstopHandler = function dragstopHandler() {
wasDragged = false;
};
$element.on('mouseup', mouseupHandler);
$element.on('dragstart', dragstartHandler);
$element.on('dragstop', dragstopHandler);
$element.draggable();
// clean up after ourselves if KO removes the element
ko.utils.domNodeDisposal.addDisposeCallback(element, function() {
$element.off('mouseup', mouseupHandler);
$element.off('dragstart', dragstartHandler);
$element.off('dragstop', dragstopHandler);
$element.draggable("destroy");
});
}
};
将其用于:
<!-- ko foreach: name -->
<div data-bind="text: name, clickUnlessDragged: function() {console.log('clicked')}"></div>
<!-- /ko -->
所有三个事件处理程序共享相同的闭包,因此我们能够使用wasDragged
标志来通信拖动是否已经开始。
mouseup
事件后拖动停止;由于我们首先绑定自己的mouseup
处理程序,所以它在dragstop
之前运行。
更新的小提琴。
相关文章:
- jquery数据表的自定义ko绑定
- 淘汰赛JS;绑定值未更新或 ko.computed() 未更新
- KO 绑定复选框:从代码更改“选中”属性,不更改可观察字段
- 将 d3 演示中的圆圈和文本替换为包含自定义 HTML 和 ko 绑定的 foreignObject
- 防止拖动上的ko点击绑定
- 如何刷新'选项'ko多选组件中的绑定
- foreach:绑定不起作用 ko.mapping.fromJS 数据
- 将 TreeView 子项绑定到 ko.observables
- Knockout JS值不显示/绑定/更新,但可通过ko.toJS($data).value获得
- 如何使用 cookie 数组中的项目填充 KO 绑定列表
- 无法处理绑定,请使用 ko.mapping.fromJS 将 JSON 数据推送到 ObservableArray
- 防止 KO 绑定处理程序在页面加载时触发
- KO - 因为每个绑定似乎没有绑定,但我无法解决
- 分组结果为 KO.js foreach 绑定
- KO选项绑定在页面重新加载时将值保存为默认值
- 为什么我的 ko 计算的可观察量在其值更改时不更新绑定的 UI 元素
- 使用ko.mapping插件时,IF绑定未按预期工作
- ko-jquery自动完成自定义绑定将覆盖以前的绑定
- 如何正确应用KO绑定以下示例
- ko foreach绑定内部<脚本>