Как я могу включить «перетаскивание» для элемента с contentEditable?

Я хотел бы иметь div, который можно одновременно редактировать и перетаскивать с помощью пользовательского интерфейса jQuery. Редактируемость контента работает только в том случае, если функция перетаскивания не включена. Я что-то упускаю? Я использую jQuery 1.4.4 и jQuery UI 1.8.9.

JavaScript:

$(function(){
    $('#draggable').draggable();
});  

HTML:

<div contenteditable="true" id="draggable">TEXT</div>

person Tommy    schedule 10.02.2011    source источник
comment
какой редактируемый плагин вы используете?   -  person Vivek    schedule 10.02.2011
comment
это не плагин — contenteditable — это просто атрибут HTML5   -  person Tommy    schedule 10.02.2011


Ответы (4)


Он работает, но перетаскиваемый jQuery перехватывает событие click. Вы все еще можете перейти к нему. Это быстрое решение.

$('#draggable').draggable().bind('click', function(){
  $(this).focus();
})
person Krule    schedule 10.02.2011
comment
Проблема в том, что focus() устанавливает курсор в начало, а не в то место, где он был нажат. - person tybro0103; 30.06.2011

Хотя ответ, предоставленный Krule, будет работать, существует проблема удобства использования. Курсор всегда будет появляться в начале редактируемой области при нажатии. Это делает невозможным выделение текста мышью. Единственный способ перейти к области текста — использовать клавиши со стрелками. Я не верю, что это приемлемо.

Единственное решение, которое я смог придумать, - это использовать "дескриптор" для перетаскивания:

<style>
.positionable {
    position:absolute;
    width:400px; height:200px;
}
.drag_handle {
    position:absolute;
    top:-8px; left:-8px;
    background-color:#FFF; color:#000;
    width:14px; height:14px;
    cursor:move;
    font-size:14px; line-height:14px;
    font-weight:bold;
    text-align:center;
    border:1px solid #000;
}
.editable {
    outline:none;
    width:100%; height:100%;
}
</style>

<div class="positionable">
    <div class="drag_handle">+</div>
    <div class="editable" contentEditable="TRUE">type here...</div>
</div>

<script>
    $('.positionable').draggable({handle: '.drag_handle'});
</script>
person tybro0103    schedule 06.07.2011
comment
Полезный фрагмент. Я беспокоился, что проблема только у меня, видимо все вопросы уже заданы/отвечены. - person Mars Robertson; 15.11.2012

вы можете дать этому div «родительский div» и добавить к нему событие draggable parent. затем используйте официальный API «отмена»

HTML:

<div id="draggable">
    <div contenteditable="true" class="editable">TEXT</div>
</div>

JS:

 $('#draggable').draggable({cancel: '.editable'});
person oliver34    schedule 11.04.2017

Это сводило меня с ума, но есть способ сделать это без ручки перетаскивания. Используйте другой тег для редактируемого элемента и запретите перетаскивание этого элемента http://api.jqueryui.com/draggable/#option-cancel

person user3046913    schedule 28.11.2013