You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击按钮新增拖拽插槽时报Cannot read property 'dataTransfer' of undefined错误

报错原因

Uncaught TypeError: Cannot read property 'dataTransfer' of undefined...

  • 事件绑定逻辑错误:在addRow函数中,你使用了div.ondrop = drop(event)、div.ondragover= allowDrop(event)的写法,这会在创建元素时立即执行drop/allowDrop函数,而非将这两个函数绑定为事件触发时的回调。此时传入的event要么是未定义的全局变量,要么是和拖拽无关的其他事件对象,访问dataTransfer自然会报错。
  • 事件属性调用错误:originalEvent是jQuery框架封装事件对象后新增的属性,你使用的是原生JS实现拖拽,原生事件对象本身就直接挂载dataTransfer属性,额外加.originalEvent会导致属性读取失败。
解决方法
  1. 修正addRow中的事件绑定逻辑,直接将函数赋值给事件回调属性,拖拽事件触发时浏览器会自动传入真实的事件对象:
    // 错误写法,会立即执行函数
    // div.ondrop = drop(event);
    // div.ondragover= allowDrop(event);
    // 正确写法,绑定函数引用
    div.ondrop = drop;
    div.ondragover= allowDrop;
    
  2. 去掉drag、drop函数中事件对象的.originalEvent前缀,直接访问原生属性:
    function drag(ev) {
      ev.dataTransfer.setData("text", ev.target.id);
    }
    function drop(ev) {
      ev.preventDefault();
      var data = ev.dataTransfer.getData("text");
      ev.target.appendChild(document.getElementById(data));
    }
    
完整修正后的代码

Javascript 代码

<script>
function allowDrop(ev) {
  ev.preventDefault();
}

function drag(ev) {
  ev.dataTransfer.setData("text", ev.target.id);
}

function drop(ev) {
  ev.preventDefault();
  var data = ev.dataTransfer.getData("text");
  ev.target.appendChild(document.getElementById(data));
}

function addRow() {
  const div = document.createElement('div');
  div.className = 'dragcontainer';
  // 若新增的插槽不需要自身可拖拽,可删除下一行
  // div.draggable = true;
  div.ondrop = drop;
  div.ondragover= allowDrop;
  document.getElementById('content').appendChild(div);
}
</script>

HTML 代码

(原有HTML仅存在一处标签嵌套语法错误,不影响拖拽功能,已修正嵌套问题,其余逻辑无需改动)

<input type="button" value="add slot" onclick="addRow()">
<div id="content">
    <div id="div1" class="dragcontainer" ondrop="drop(event)" ondragover="allowDrop(event)">
        <ul draggable="true" ondragstart="drag(event)" id="drag1"> 
          <li><h1>Sample title</h1></li> 
          <li><p>sample text</p></li>
        </ul>
      </div>
      
      <div id="div2" class="dragcontainer" ondrop="drop(event)" ondragover="allowDrop(event)"></div>

</div>

内容的提问来源于stack exchange,提问作者lendo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:21:00