Javascript 防止在可拖动上单击绑定?

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-click绑定无关。我发现的唯一一个答案与此相关,但没有被接受的答案(唯一的答案是含糊不清的,并说要尝试preventDefault()


因此,在拖动项目后释放鼠标按钮时,如何防止单击绑定?

您可以通过自定义绑定解决此问题:

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 -->