拖拽时 ondragover 事件不生效是怎么回事?
我在做一个简单的拖拽上传功能,但发现拖拽元素到目标区域时,ondragover 事件好像没触发,导致 drop 也无效。我明明加了 preventDefault,但还是不行。
这是我的 HTML 结构:
<div id="dropzone" style="width: 200px; height: 200px; border: 2px dashed #ccc;"
ondragover="event.preventDefault(); console.log('over')"
ondrop="handleDrop(event)">
Drop here
</div>
<img src="file.png" draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'file')" />
控制台完全没输出 ‘over’,是不是哪里漏了?
第一,用内联事件写法有时候会有作用域问题,特别是
handleDrop函数如果写在window.onload或者模块里面会找不到。第二,有些浏览器还需要在 dragenter 时也阻止默认行为才能让 dragover 正常触发。
改成这样最稳:
这种写法调试起来也方便,哪一步出问题一目了然。
ondragover本身,而是拖拽可能根本没正确开始。官方文档里说,
draggable属性设为true只是第一步,图片元素默认是可拖拽的,但你手动设置ondragstart时,如果图片没加载成功或者路径有问题,拖拽行为会很奇怪。先确认file.png是否存在。另外一个常见问题是
dropzone内部的文本节点。当你把元素拖到 "Drop here" 文字上方时,dragover事件的 target 是文本节点,不是div。虽然事件会冒泡,但有些情况下会出问题。建议给 dropzone 加上这个样式:或者更规范的做法,用 JavaScript 绑定事件而不是内联:
根据 MDN 文档,
dragover事件必须调用preventDefault()才能让后续的drop事件触发,这点你做对了。但内联事件的写法在某些浏览器上会有兼容性问题,特别是event对象的传递。另外检查一下你的页面是否有其他 JS 错误,打开控制台看看有没有报错信息,有时候一个报错会阻断后面所有脚本执行。