如何防止拖拽孩子,但允许拖拽父母?

aep*_*eus 11 javascript html5 drag-and-drop

我有一个用户可以拖动的div,在div里面是一个带有一些文本的跨度,我希望允许用户选择(因此他们无法拖动它).如何允许div拖动,而不是跨度?

dragstart事件在div上.

我可能忽略了一些简单的事情.我在div上尝试了draggable = true,在span上尝试了draggable = false.那没用.尝试在dragstart上返回false,这也不起作用.

dragstart(粗略地):

var jTarget = $(e.target);
if ((jTarget.is('div.header') || (jTarget.parents('div.header')) 
       && !jTarget.is('a, input, span'))) 
{
   e.originalEvent.dataTransfer.setData("Text", "test");
}
else
{
   if(e.preventBubble)
      e.preventBubble();
   if(e.stopPropagation)
      e.stopPropagation();
   return false;//???
}
Run Code Online (Sandbox Code Playgroud)

if else部分按照我的预期工作,但我无法阻止拖动并允许选择.

mec*_*ech 7

只是发布,以防有​​人搜索类似问题

element.addEventListener('mousedown', function() { this.parentNode.setAttribute("draggable", false); });
element.addEventListener('mouseup', function() { this.parentNode.setAttribute("draggable", true); });
Run Code Online (Sandbox Code Playgroud)

为我工作


shu*_*uji 5

您可以在 ondragstart 时将子元素更改为可拖动并防止默认,这将保留子元素上的常规行为,而父元素仍可拖动

function drag(e){ if(e.target.type=="range")e.preventDefault();/*rest of your code*/  }
Run Code Online (Sandbox Code Playgroud)

html:

<input type="range" draggable="true" ondragstart="drag(event)">
Run Code Online (Sandbox Code Playgroud)


Bli*_*ixt 5

如果要真正取消拖动并使父拖动处理程序不引起注意,则需要同时preventDefaultstopPropagation

<div draggable="true" ondragstart="console.log('dragging')">
    <span>Drag me! :)</span>
    <input draggable="true"
           ondragstart="event.preventDefault();
                        event.stopPropagation();"
           value="Don't drag me :(">
</div>
Run Code Online (Sandbox Code Playgroud)

如果不使用stopPropagationondragstart即使将阻止默认行为(event.defaultPrevented == true),仍将调用父对象。如果该处理程序中有无法处理这种情况的代码,则可能会看到细微的错误。

您当然也可以将JavaScript放在里面element.addEventListener('dragstart', ...)

  • 在您不想拖动的“input”元素上设置“draggable=”true“”是这个答案的一个微妙但关键的方面,乍一看违反直觉,但对于获取输入的“ondragstart”至关重要触发事件。我只是说出来,因为这就是我所缺少的部分,这个答案帮助我找到了,并且可能也适用于其他人。 (8认同)

小智 3

在跨度上放置一个 mousedown 处理程序并在那里停止事件传播。

  • 测试过(我有一个类似的问题),至少它不会发生拖动,但其他任何事情也不会发生,无法选择文本,并且如果对象是可内容编辑的,则无法设置光标... (2认同)