2016-05-26 6 views
0

javascriptで番号を表示するオブジェクトを作成したいと思いますが、このエラーが発生します。JS:オブジェクトが定義されていません

Déclaration d'objet.html:30 

コード:

<script type="text/javascript"> 
    // <!-- 
    function Init() 

     { 
      var test= new Object; 
      test.affiche= function() 
      { 
       var champ=Number(document.getElementById("champSaisie").value); 
       alert(Number(champ+4)); 
      }; 
     } 
    </script> 
</head> 
<body onload="Init()"> 

<p><label for="champSaisie">Saisissez un nombre&nbsp;: </label><input type="text" id="champSaisie"></p> 
<p><input type="submit" onclick="test.affiche()" value="Effectuer le calcul"></p> 



</body></html> 

答えて

2

testは機能Initからローカルです。グローバルではないため、イベントハンドラ(onclick="test.affiche()")でアクセスすることはできません。

は、この例では、全くInit内のコードを配置する理由はありません、あなただけの直接<script>

var test= new Object; 
test.affiche= function() 
{ 
    var champ=Number(document.getElementById("champSaisie").value); 
    alert(Number(champ+4)); 
}; 

を置くことができます。これにより、testがグローバルになります。オブジェクトを作成する前にページが読み込まれるのを待つことには利点はありません。

create a global variableInitからも可能です。

しかし、インラインイベントハンドラを使用する代わりに、より良い解決策はおそらくグローバルとbind the eventhandler inside Initを避けることです。

関連:What is the scope of variables in JavaScript?

3

作成している変数、testあなたInit機能へローカルです。あなたはonclickハンドラでtestにアクセスしようとすると

、それが存在しないグローバルレベルでtestを探しています。

代わりにaddEventListenerを使用するようにコードを更新しました。

function Init() { 
 
    var test = {}; 
 
    test.affiche = function() { 
 
    var champ = Number(document.getElementById("champSaisie").value); 
 
    alert(Number(champ + 4)); 
 
    }; 
 
    document.getElementById("calc").addEventListener("click", test.affiche); 
 
} 
 

 
Init();
<p> 
 
    <label for="champSaisie">Saisissez un nombre&nbsp;:</label> 
 
    <input type="text" id="champSaisie"> 
 
</p> 
 
<p> 
 
    <input id="calc" type="submit" value="Effectuer le calcul"> 
 
</p>

+0

ありがとうございませんが、私のコードを維持する方法は?私は体内で関数Initをロードするので、それを見つける必要はありません? – unfoudev

+0

インラインイベントハンドラを使用する '(onclick =" blah() ")'は多くの人にとって悪い習慣とみなされます。それらを動的に追加または削除することはできません。コードを2つの場所(コードと呼び出されるHTML)に分けます。インラインハンドラを実際に保持したい場合は、グローバルスコープに移動する必要があります。 –

+0

'Déclarationd'objet.html:15 Uncaught TypeError:プロパティ 'addEventListener' of nullを読み取れません。このエラーが発生しました – unfoudev

関連する問題