【问题标题】:Typescript :Property 'className' does not exist on type 'EventTarget'打字稿:“EventTarget”类型上不存在属性“className”
【发布时间】:2026-02-13 16:25:03
【问题描述】:

我在我的代码中使用 draggable,如下所示: 首先创建和附加元素:

let myImg = document.createElement("img");
myImg.setAttribute('src', ...);
myImg.id = some_value;
myImg.className = "store_img";
myImg.draggable = true;

myImg.addEventListener('dragstart',function(event){
    event.dataTransfer?.setData("text", somedata);
    myImg.style.opacity = "0.5";

myImg.addEventListener('dragend',function(){
    mask.style.opacity = "1";
   
document.getElementById("myStorageDiv")?.appendChild(myImg);

之后,我在其他地方修改了“myStorageDiv”以允许接受可拖动:

document.getElementById("myArea")?.addEventListener('dragenter', 
function(event){
    event.preventDefault();
    if(event.dataTransfer?.getData("className") == "store_img"){
        this.style.backgroundColor = "red";
    }
}, false);

最后一行告诉我“EventTarget”上不存在 className。我想使用它的原因是我有两种类型的可拖动,每种只允许一个区域,我希望这些区域在进行任何更改之前识别可拖动的来源,例如'if(event.target.className = =“StoreImg”){...}'。我还注意到dataTransfer的数据只能在Drop中使用,所以我不能为dropenter和dropleave等其他人传递className。有没有其他方法可以做到这一点?谢谢!

【问题讨论】:

  • 变量event 期望哪个接口?如果您使用的是 VS Code,您应该能够通过将鼠标悬停在变量上来查看它。
  • 它说'(参数)事件:DragEvent'
  • 但是 className 是 HTML 元素的属性还是事件的属性?因为在我看来,您想编辑 img 元素的 className。
  • 我这样做的原因是我在developer.mozilla.org/en-US/docs/Web/API/Document/drag_event 上看到了示例代码,这在我的情况下不起作用。如果我们忘记了这一点,还有其他方法吗?不必是 className,任何可以将我的可拖动对象分隔为不同类的东西?
  • myImg.className = "StoreImg"代替event.target.className = "StoreImg"不行吗?

标签: javascript html typescript


【解决方案1】:

让我们看看我是否正确理解了您的问题,您想根据事件更改myImg 的类并测试它当前具有哪个类,对吗?

除了 TypeScript,这应该很容易实现,这是一个示例(尝试拖动图像):

const myImg = document.querySelector("#my-img");

myImg.addEventListener("dragstart", () => {      
  if (myImg.className == "blue") {
    alert("Element was blue, I guess.");
  }
  
  myImg.className = "red";
})
.blue {
  border-style: solid;
  border-width: 10px;
  color: blue;
}

.red {
  border-style: solid;
  border-width: 10px;
  color: red;
}
<img id="my-img" class="blue" src="https://www.gravatar.com/avatar/95686594a8e10ec60422e9478e9d1785"></img>

这对你有用还是你得到了一些 TypeScript 错误?如果你愿意,你可以在这里发布,我会尽力提供帮助。

【讨论】:

  • 我已经编辑了我的问题。所以问题是这样的,我有两个可拖动的类 D1 和 D2,区域 A1 和 A2,我希望 A1 只有在 D1 进入它时才做一些事情,如果 D2 进入它不应该做任何事情,对于 D2 和 A2 也是如此。有什么我可以放入 IF LOOP 来识别可拖动对象的来源吗?谢谢