4

我在页面上有一些可拖动的元素。这些相同的元素有一个导航到另一个页面的点击事件。我试图确定阻止点击事件发起的最好方法,如果用户正在拖动,但仍然允许点击事件(如果不拖动)。任何人有任何想法来完成这个最好的方法?使用Scriptaculous拖放防止JavaScript单击事件

回答

1

我解决了这个使用类似以下内容:

new Draggable('id', { 
    onStart: function() { 
     dPhoto = $('id'); 
     Event.stopObserving('id', 'click'); 
    }, 
    onEnd : function() { 
     setTimeout("Event.observe('id', 'click', function() { location.href = 'url'; });", 500); 
    }, 
    revert: true 
}); 
0

类似下面可能做的伎俩(防止click事件被解雇了)

new Draggable('tag', 
    { 
     revert:function() 
     { 
      $('tag').onclick = function(){return false;}; 
      setTimeout('$(\'tag\').onclick = function(){return true;}','500'); 
      return true; 
     } 
    } 
); 
+0

谢谢,但这并没有很好的工作。它可以防止即使在超时之后发生点击事件。似乎应该有一个更清洁的解决方案。 – digitalsanctum 2008-11-08 17:38:05

+0

我同意。我值得一试。 – VonC 2008-11-08 17:57:54

1
var click_func; 
function onDragStart(drgObj,mouseEvent){ 
    click_func = mouseEvent.target.onclick; 

    mouseEvent.target.onclick = function(e){ 
     mouseEvent.target.onclick = click_func; 
     return false; 
    } 
} 
0

你也可以用另一种方式做到这一点。在你的startDrag你停止观察对象。然后你再次观察点击会导致重新创建第一个事件处理程序的enddrag函数。

function onDragStart() { 
    Event.stopObserving(this.OBJECT,'click'); 
    Event.observe(this.OBJECT,'click',this.onDragEnd.bindAsEventListener(this)); 
} 

function onDragEnd() { 
    Event.stopObserving(this.OBJECT,'click'); 
    Event.observe(this.OBJECT,'click',this.PREVIOUSFUNCTION.bindAsEventListener(this)); 
} 

这将赶上吃剩的点击事件,仍然是活动后enddrag只是重建原始的处理程序。我希望这可以帮助那里的人:)