例如,我想有這樣的:如何使用jQuery UI使元素可拖動,但不能使用其子元素?
<div class="draggable">
<p>Text that can be selected</p>
</div>
例如,我想有這樣的:如何使用jQuery UI使元素可拖動,但不能使用其子元素?
<div class="draggable">
<p>Text that can be selected</p>
</div>
這適用於p元素,但孩子可以是什麼元素,甚至是文本節點。問題是「但不是其子元素」。任何想法呢? – 2014-11-05 04:43:47
我添加了一個答案,它提供了一種可能的方法來選擇所有的子節點和其他textnode方法。 – 2014-11-05 10:06:20
可以有其他元素作爲孩子比p。在這種情況下,您必須使用空間選擇器:
$(".draggable").draggable({cancel: ".draggable *"});
工作示例爲JSFIDDLE。
它使用空間選擇器,選擇元素的所有子元素,無論他們是孩子還是大孩子。空間選擇器示例,位於w3schools。
這樣做的缺點是所有的textnode都必須包裝在標籤內,例如。 span,div,p。如果它們不在標籤內,則*選擇器無法匹配它們。爲了保持純文本節點可選,你必須使用更復雜的代碼,因爲CSS和jQuery不包含純文本節點的選擇器。你可以例如。使用你自己的標籤來包裝文本節點。其原因自定義節點是它降低了該自定義元件被意外樣式(使用跨度等時等)的可能性,在這種情況下,我們將其命名爲「自定義」:
$(".draggable").draggable({cancel:'.draggable *'})
.contents().filter(function() {return this.nodeType == Node.TEXT_NODE;})
.wrap('<custom></custom>');
上面在JSFIDDLE。現在也可以選擇純文本節點。如果您將更多文本節點動態添加到可拖動元素中,情況會發生變化。然後你必須再次包裝它們。
您可以覆蓋start
函數作爲初始化選項的一部分。在這裏返回錯誤將會過早地發生。要訪問單擊時創建的鼠標事件,可以訪問jQuery事件中的originalEvent
屬性。
$(".draggable").draggable({
start: function(event, ui) {
return event.originalEvent.target === this;
}
});
這允許只有父母是可拖動的。你可以用你想成爲唯一可拖動項目的任何元素替換this
,只要確保它是獲得比較的DOM節點。
@AymanSafadi,這就是我一開始以爲過。但是不:我很*確定他希望用戶能夠選擇段落中包含的文本,而不必在可拖動的父元素上啓動拖動操作。 – 2011-12-30 16:41:04