HTML5可拖拽元素在可满足的div中-第一次拖拽后停止工作-为什么?



我试图创建一些可拖动的元素(令牌),可以在一个可满足的div内拖动。似乎一切都在工作,除了…在我拖放一个元素之后,我不能再拖放它了。似乎我不能绑定到它的dragstart事件了。

知道为什么会发生这种情况,我该如何修复它吗?

这是我小提琴的链接: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;
}

我也尝试了一些技巧,但似乎都不起作用。我正在检查HTML,我发现,在你的例子中,新插入的内容没有任何 contentitable 属性分配,当我手动分配给它,然后它开始工作良好。

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

我刚加了这行

$('.draggable').attr("contenteditable", false); in bindDraggables method.

我同意Reinmar关于 contentitable 的解释。

显然Chrome有一个bug(不足为奇- contenteditable是所有浏览器中bug最多的功能)。您的代码在Firefox上工作得很好,但是由于某些原因,使用insertHTML命令插入可编辑的元素不能再拖动了。

我尝试了一些技巧,但只有一个有效-插入其他元素然后替换它。

所以:

document.execCommand('insertHTML', false, content);

像这样使用:

var spanId = 'temp-' + (new Date()).getTime();
// Insert span with zero-width space (so it isn't visible and it isn't empty).
document.execCommand('insertHTML', false, '<span id="' + spanId + '">u200b</span>');
// Replace that span with our dragged content.
$('#' + spanId).replaceWith(content);

你可以在这里试试:http://jsfiddle.net/gXScu/5/。我也纠正了这个错误的顺序:

$('.dragged').remove();
bindDraggables();

最新更新