window.web3弃用报错排查:Web3.js集成后功能失效问题
解决web3 shim废弃报错及按钮失效问题
报错提示You are accessing the window.web3 shim. This object is deprecated, please use window.ethereum instead的核心原因是代码依赖了已废弃的web3.currentProvider对象,同时代码中存在几处拼写错误,直接导致按钮功能失效。以下是修正后的完整代码及错误说明:
修正后的代码
<script> // 移除废弃的授权方法,改用标准请求授权逻辑 const provider = new ethers.providers.Web3Provider(window.ethereum, "goerli"); const MoodContractAddress = "0x65B1174cDBb463e0F9132c09aaEDc63b02986D7D"; const MoodContractABI = [ { "inputs": [ { "internalType": "string", "name": "_mood", "type": "string" } ], "name": "setMood", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getMood", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" } ] let MoodContract; let signer; provider.send("eth_requestAccounts", []).then(() => { provider.listAccounts().then(function(accounts) { signer = provider.getSigner(accounts[0]); MoodContract = new ethers.Contract(MoodContractAddress, MoodContractABI, signer); }); }); async function getMood(){ var getMoodPromise = MoodContract.getMood(); var Mood = await getMoodPromise; console.log(Mood); } async function setMood(){ var mood= document.getElementById("mood").value; var setMoodPromise = MoodContract.setMood(mood); await setMoodPromise; } </script>
关键错误修正点
- 废弃API替换:将
new ethers.providers.Web3Provider(web3.currentprovider, "goerli")改为new ethers.providers.Web3Provider(window.ethereum, "goerli"),直接使用官方推荐的window.ethereum作为提供者,彻底消除废弃提示。 - 拼写错误修正:
provider.listAccount()→provider.listAccounts()(方法名缺少复数后缀s)provider.getsigner()→provider.getSigner()(方法名首字母需大写)
- DOM操作修复:
getElementById("mood")→document.getElementById("mood"),必须通过document对象调用DOM选择器方法。 - 冗余代码移除:删除
window.ethereum.enable(),该方法已被废弃,provider.send("eth_requestAccounts", [])已完成钱包授权请求。
内容的提问来源于stack exchange,提问作者Coding_templar
相关产品推荐
相关产品推荐

