例如,我想要这个:
<div class="draggable">
<p>Text that can be selected</p>
</div>
答案 0 :(得分:33)
答案 1 :(得分:9)
除了p之外,还有其他元素作为子元素。在这种情况下,您必须使用空间选择器:
$(".draggable").draggable({cancel: ".draggable *"});
工作示例位于JSFIDDLE。
它使用空间选择器,它选择元素的所有子元素,无论它们是子元素还是大元素元素。 w3schools处的空间选择器示例。
这样做的缺点是所有文本节点都必须包含在标签内,例如。 span,div,p。如果它们不在标记内,则*选择器无法匹配它们。要保持纯文本节点可选,您必须使用更复杂的代码,因为CSS和jQuery不包含纯文本节点的选择器。你可以,例如。使用您自己的标记来包装文本节点。自定义节点的原因是它降低了这个自定义元素被意外设置的可能性(比如使用span等),在这种情况下我们将其命名为“custom&#39;:
$(".draggable").draggable({cancel:'.draggable *'})
.contents().filter(function() {return this.nodeType == Node.TEXT_NODE;})
.wrap('<custom></custom>');
以上JSFIDDLE。现在也可以选择纯文本节点。如果您将更多文本节点动态添加到可拖动元素中,则情况会发生变化。然后你必须再次包装它们。
答案 2 :(得分:0)
您可以覆盖start
函数作为初始化选项的一部分。在这里返回假将过早地突破它。要访问单击时创建的鼠标事件,可以访问jQuery事件上的originalEvent
属性。
$(".draggable").draggable({
start: function(event, ui) {
return event.originalEvent.target === this;
}
});
这允许只有父项可拖动。您可以将this
替换为您想要成为唯一可拖动项的元素,只需确保它是被比较的dom节点。