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

Vite+TypeScript中onclick调用deleteItem提示未定义的问题

问题

我基于无框架的Vite+TypeScript开发天气应用,想给每个天气列表项添加删除功能:点击删除按钮时将对应ID传入deleteItem函数,从savedWeatherList数组中删除该项,但触发点击时出现错误:

(index):29 Uncaught ReferenceError: deleteItem is not defined
    at HTMLButtonElement.onclick

我的main.ts里定义了如下deleteItem函数:

function deleteItem(clickedID: number): void {
  console.log("Item with the id of: " + clickedID + " was clicked!");
  savedWeatherList = savedWeatherList.filter((item) => {
    return item.id !== clickedID;
  });
}

同时在main.ts中通过代码为按钮添加onclick属性:

const deleteButton: HTMLElement = document.createElement("button");    
deleteButton.setAttribute("onclick", "deleteItem(item.id)");

HTML属性已正确添加,但script标签为module类型,放在head或body均无效,请问为何该函数未定义无法调用?

原因分析

因为你使用了ES模块(script标签添加了type="module"),模块内的变量和函数默认处于模块作用域,不会自动暴露到全局window对象上。而通过onclick属性绑定的代码,是在全局作用域下执行的,自然找不到仅存在于模块内部的deleteItem函数。另外你写的deleteItem(item.id)中的item也存在问题,该变量在全局作用域中同样不存在。

解决方案

方法1:用addEventListener绑定事件(推荐)

直接给按钮添加点击事件监听器,利用闭包获取当前item的id,既不依赖全局作用域,还能避免变量污染:

const deleteButton: HTMLButtonElement = document.createElement("button");
// 假设此处存在当前操作的item对象
deleteButton.addEventListener('click', () => {
  deleteItem(item.id);
});

方法2:将函数暴露到全局(不推荐)

如果一定要用onclick属性的方式,可以把deleteItem挂载到window对象上,同时确保item.id能正确传递:

// 在main.ts里把函数挂载到window全局对象
(window as any).deleteItem = deleteItem;

// 创建按钮时,将item.id作为字符串拼接进onclick属性
const deleteButton: HTMLElement = document.createElement("button");    
deleteButton.setAttribute("onclick", `deleteItem(${item.id})`);

这种方法会污染全局作用域,容易引发命名冲突,因此更推荐第一种方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 13:13:16