javascript - contenteditable div 中的 HTML5 可拖动元素 - 在第一次放置后停止工作 - 为什么?

标签 javascript jquery html draggable contenteditable

我正在尝试创建一些可拖动的元素( token ),这些元素可以在 contenteditable div 中四处拖动。似乎一切正常,除了......在我拖放一个元素后,我无法再次拖动它。看来我无法再次绑定(bind)到它的 dragstart 事件。

知道为什么会发生这种情况吗?我该如何解决?

这是我的 fiddle 的链接:http://jsfiddle.net/gXScu/1/

HTML:

<div id="editor" contenteditable="true">
    Testime siinkohal seda, et kuidas<br />
    on võimalik asja testida.
    <span class="draggable" draggable="true" contenteditable="false">Token</span>
</div>
<span class="draggable" draggable="true" contenteditable="false">Token 2</span>

Javascript (jQuery)

var bindDraggables = function() {
    console.log('binding draggables', $('.draggable').length);
    $('.draggable').off('dragstart').on('dragstart', function(e) {
        if (!e.target.id)
            e.target.id = (new Date()).getTime();
        e.originalEvent.dataTransfer.setData('text/html', e.target.outerHTML);
        console.log('started dragging');
        $(e.target).addClass('dragged');
    }).on('click', function() {
        console.log('there was a click');
    });
}

$('#editor').on('dragover', function (e) {
    e.preventDefault();
    return false;
});

$('#editor').on('drop', function(e) {
    e.preventDefault();
    var e = e.originalEvent;
    var content = e.dataTransfer.getData('text/html');
    var range = null;
  if (document.caretRangeFromPoint) { // Chrome
    range = document.caretRangeFromPoint(e.clientX, e.clientY);
  }
  else if (e.rangeParent) { // Firefox
    range = document.createRange();
        range.setStart(e.rangeParent, e.rangeOffset);
  }
    console.log('range', range)
  var sel = window.getSelection();
  sel.removeAllRanges(); sel.addRange(range);

  $('#editor').get(0).focus(); // essential
  document.execCommand('insertHTML',false, content);
    //$('#editor').append(content);
  sel.removeAllRanges();
    bindDraggables();
    console.log($('[dragged="dragged"]').length);
    $('.dragged').remove();
});

bindDraggables();

CSS:

#editor {
    border: 2px solid red;
    padding: 5px;
}
.draggable {
    display: inline-block;
    padding: 3px;
    background: yellow;
    cursor: move !important;
}

最佳答案

我也尝试了一些 hack,但似乎都不起作用。我正在检查 HTML,我发现在您的示例中,新插入的 content 没有分配任何 contenteditable 属性,当我手动分配给它时,它开始工作正常。

这是我的代码 http://jsfiddle.net/gXScu/8/

我刚刚添加了这一行

$('.draggable').attr("contenteditable", false);bindDraggables 方法中。

我同意 Reinmar 关于 contenteditable 的解释。

关于javascript - contenteditable div 中的 HTML5 可拖动元素 - 在第一次放置后停止工作 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16900032/

相关文章:

javascript - 选择所需的 'select box' 并保留空值

jquery - 定义 "custom"HTML 标签是不好的做法吗

html - 应用于 body 时线性渐变不起作用

javascript - Fabricjs在 Canvas 中复制html

javascript - 重构 jQuery/JavaScript 代码以显示/隐藏大量模态窗口

php - 如何触发重新加载浏览器选项卡

html - sass 选择器可以包含 '%' 字符吗?

javascript - 使用 nodeJS 开发 API

javascript - 定位 div 中的所有元素

javascript - 有没有更有效的方法在 Canvas 中创建网格?