Javascript 防止在可拖动上单击绑定?
我发现了一些在拖动时阻止事件传播的问题,包括我正在尝试的解决方案: 这根本不起作用。这个问题与KO-click绑定无关。我发现的唯一一个答案与此相关,但没有被接受的答案(唯一的答案是含糊不清的,并说要尝试preventDefault()Javascript 防止在可拖动上单击绑定?,javascript,jquery,jquery-ui,knockout.js,click,Javascript,Jquery,Jquery Ui,Knockout.js,Click,我发现了一些在拖动时阻止事件传播的问题,包括我正在尝试的解决方案: 这根本不起作用。这个问题与KO-click绑定无关。我发现的唯一一个答案与此相关,但没有被接受的答案(唯一的答案是含糊不清的,并说要尝试preventDefault() 因此,在拖动项目后释放鼠标按钮时,如何防止单击绑定?您可以通过自定义绑定解决此问题: ko.bindingHandlers.ClickUnlessDrawed={ init:function(元素、valueAccessor、allBindingsAccess
因此,在拖动项目后释放鼠标按钮时,如何防止单击绑定?您可以通过自定义绑定解决此问题:
ko.bindingHandlers.ClickUnlessDrawed={
init:function(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
变量$element=$(element),
clickHandler=ko.utils.unwrapObservable(valueAccessor()),
wasdrable=false,
穆沙德勒,
dragstartHandler,
拖斗处理器;
mouseuphHandler=函数mouseuphHandler(事件){
如果(!被拖动){
clickHandler(事件);
}
};
dragstartHandler=函数dragstartHandler(){
wasdrable=true;
};
dragstopHandler=函数dragstopHandler(){
wasdrable=false;
};
$element.on('mouseup',mouseupHandler);
$element.on('dragstart',dragstartHandler);
$element.on('dragstop',dragstopHandler);
$element.draggable();
//如果KO移除了该元素,请自行清理
ko.utils.domNodeDisposal.addDisposeCallback(元素,函数(){
$element.off('mouseup',mouseupHandler);
$element.off('dragstart',dragstartHandler);
$element.off('dragstop',dragstopHandler);
$element.draggable(“销毁”);
});
}
};
将其用于:
所有三个事件处理程序共享相同的闭包,因此我们可以使用wasDragged
标志来通信是否已开始拖动
mouseup
事件后停止拖动;因为我们首先绑定自己的mouseup
处理程序,所以它在dragstop
之前运行
.可能重复您正试图实现的目标?您可以通过在fiddle:click:function(e){e.preventDefault();}中执行此操作来防止单击时的默认操作。我想我遗漏了一些东西。拖动后释放鼠标按钮不应触发单击事件?正确,拖动后释放鼠标按钮不应触发单击事件。效果很好,但它似乎不像默认的单击绑定那样传递事件。我使用e.ctrlKey来检测CTRL+点击。这是一个简单的解决方法吗?@ScottBeeson两个字:)我已经更新了鼠标手柄来传递事件。谢谢!和+1来理解这个问题:)事实上,还有一件事。。。我以为我能弄明白,但我运气不太好。它还需要传递viewModel。我应该事先说明这一切。抱歉。您是否尝试过将
MouseHandler
中的clickHandler(事件)
更改为clickHandler(bindingContext,event)
或clickHandler(viewModel,event)
?
$('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 foreach: name -->
<div data-bind="text: name, clickUnlessDragged: function() {console.log('clicked')}"></div>
<!-- /ko -->