最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - NoModificationAllowedError in Firefox when using DnD events - Stack Overflow

programmeradmin4浏览0评论

Using some basic drag'n'drop features and i keep getting this message in Firefox, works well in Chrome though.

NoModificationAllowedError: Modifications are not allowed for this document

This happens when i try to use the clearData() function on the event when the ondrop event is fired.

HTML:

<!-- draggable element -->
<div draggable="true" ondragstart="onDragStart(event);">
<!-- dropzone element -->
<div ondragover="onDragOver(event);" ondragenter="onDragEnter(event);" ondrop="onDrop(event);"></div>

JS:

function onDragStart(event) {
    event
        .dataTransfer
        .setData('text/plain', 'test');
}
function onDragOver(event) {
    event.preventDefault();
}
function onDragEnter(event) {
    event.preventDefault(); // polyfill fix
}
function onDrop(event) {
    event.preventDefault();
    event
        .currentTarget
        .parentNode
        .classList.add("dropped");
    event
        .dataTransfer
        .clearData(); //<---- This is where it fails
}

So yeah no idea how to fix this, and i need to clear the data as i set/reset some variable and internal params using it (code omitted). Works well in chrome (even IE)

Using some basic drag'n'drop features and i keep getting this message in Firefox, works well in Chrome though.

NoModificationAllowedError: Modifications are not allowed for this document

This happens when i try to use the clearData() function on the event when the ondrop event is fired.

HTML:

<!-- draggable element -->
<div draggable="true" ondragstart="onDragStart(event);">
<!-- dropzone element -->
<div ondragover="onDragOver(event);" ondragenter="onDragEnter(event);" ondrop="onDrop(event);"></div>

JS:

function onDragStart(event) {
    event
        .dataTransfer
        .setData('text/plain', 'test');
}
function onDragOver(event) {
    event.preventDefault();
}
function onDragEnter(event) {
    event.preventDefault(); // polyfill fix
}
function onDrop(event) {
    event.preventDefault();
    event
        .currentTarget
        .parentNode
        .classList.add("dropped");
    event
        .dataTransfer
        .clearData(); //<---- This is where it fails
}

So yeah no idea how to fix this, and i need to clear the data as i set/reset some variable and internal params using it (code omitted). Works well in chrome (even IE)

Share Improve this question asked Oct 2, 2019 at 12:12 lordZ3dlordZ3d 6218 silver badges22 bronze badges 2
  • 12 DataTransfer.clearData(): "This method can only be used in the handler for the dragstart event, because that's the only time the drag operation's data store is writeable." – Andreas Commented Oct 2, 2019 at 12:16
  • Yes unfortunately you are right, thanks. – lordZ3d Commented Oct 3, 2019 at 7:42
Add a ment  | 

1 Answer 1

Reset to default 5

Use Cleardata() method in OnDragStart and not use it in OnDrop() Method.

onDragStart(event) {
    event.dataTransfer.clearData();
    event
        .dataTransfer
        .setData('text/plain', event.target.dataset.item);
}

Must user text/plain. Must use preventDefault() while dropping.

onDragOver(event) {
        event.preventDefault();
    }

Must use preventDefault inside onDrop Method like that.

 onDrop(event) {
        const id = event
            .dataTransfer
            .getData('text');
        const draggableElement = '';
        event.preventDefault();
        this.template.querySelectorAll('.example-draggable').forEach(element => {
            if (element.innerHTML == id) {
                this.draggableElement = element;
            }
        });;
        if ((!event.target.innerText.includes('Drag From Here')) && (!event.target.innerText.includes('Drop Here'))) {
            const bar = event.target.parentElement;
            bar.appendChild(this.draggableElement);
        }
        else {

            const bar = event.target;
            bar.appendChild(this.draggableElement);

        }


    }

here i use preventdefault in middle of the code that will prevent reloading of the page while appending element.

发布评论

评论列表(0)

  1. 暂无评论