2017-06-08 5 views
0

コンテキスト:ブロックを使用してページ上にidenticonをレンダリングする場合、web3からdefaultAccountが取得されます。このため、ユーザーはmetamaskに選択された状態でログオンする必要があります彼の財布からの住所。metamaskを使用しているときにweb3のデフォルトアカウントを検出するパターンを改善する

問題:Webアプリケーションは、ページのロードイベントでweb3オブジェクトを検出していないようですが、wchihがそれを検出するための推奨される場所です。

コードは:時々web3は、私は、それはないですが、時には唯一のソリューションです、私は断続挙動を有する保つ

https://github.com/MetaMask/metamask-plugin/issues/1158

https://github.com/MetaMask/faq/blob/master/DEVELOPERS.md#partly_sunny-web3---ethereum-browser-environment-check

:以下の勧告からインスピレーションを得ていますタイマーを持っていることを考えることができますが、それは私に少し単純すぎるようです、私はよりエレガントなものを好むでしょう。

質問:ページが読み込まれたときにweb3からdefaultAccountを検出する優れた方法はありますか?

function startApp() { 
     GenerateIdenticon(); 
} 


window.addEventListener('load', function() { 

// Checking if Web3 has been injected by the browser (Mist/MetaMask) 
if (typeof web3 !== 'undefined') { 

    // Use Mist/MetaMask's provider 
    window.web3 = new Web3(web3.currentProvider); 
    if (web3.currentProvider.isMetaMask === true) { 
     if (typeof web3.eth.defaultAccount === 'undefined') { 
      document.body.innerHTML = '<body><h1>Oops! Your browser does not support Ethereum Ðapps.</h1></body>'; 
     } 
     else { 
      startApp(); 
     } 
    } 
    else { 
     alert('No web3? Please use google chrome and metamask plugin to enter this Dapp!', null, null); 
     // fallback - use your fallback strategy (local node/hosted node + in-dapp id mgmt/fail) 
     window.web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545")); 
} 

答えて

0

ChromeがMetaMask Web3ライブラリを挿入してタイムアウトが必要になるため、遅延があります(1秒のタイムアウトで十分です)。

タイムアウト後、web3グローバルオブジェクトが存在するかどうかを確認してから、デフォルトアカウントを読み取ります。

存在しない場合は、独自のweb3オブジェクトを挿入します。

関連する問題