Web3js
如何檢測 Metamask 中的帳戶更改?
當使用者在 metamask 中更改為不同的帳戶時,有沒有辦法在程式碼中非同步檢測它?
我目前使用
this.web3.eth.getAccounts((err, accs) => { this.account = accs[0]; });
但是當帳戶更改時,它仍然會拿起以前的帳戶。刷新頁面不是一種方法。有沒有人面對這個並有解決方案?
正如Metamask FAQs所建議的,這可能是一個選項:
var account = web3.eth.accounts[0]; var accountInterval = setInterval(function() { if (web3.eth.accounts[0] !== account) { account = web3.eth.accounts[0]; updateInterface(); } }, 100);
編輯
在較新的版本中,元遮罩暴露了一個事件,該事件可用於根據新文件檢測是否存在帳戶更改:
window.ethereum.on('accountsChanged', function (accounts) { // Time to reload your interface with accounts[0]! })
來自MetaMask 文件:
window.ethereum.on('accountsChanged', function (accounts) { // Time to reload your interface with accounts[0]! }) window.ethereum.on('networkChanged', function (networkId) { // Time to reload your interface with the new networkId })
正如@Sr.PEDRO所指出
ethereum.publicConfigStore
的那樣,將來不會起作用。事實上,它將被完全刪除。有關詳細資訊,請參閱此 GitHub 評論。您還可以阻止 MetaMask 自動重新載入網頁:
window.onbeforeunload = function() { return "Prevent reload" }
這僅適用於您使用
window.web3
MetaMask 注入的對象,該對像也計劃被刪除。