lol
が外部で定義されている場合に関数が機能しない理由は、JavaScript が最初に実行されたときにDOMがまだロードされていないためです。そのため、getElementById
戻りますnull
( MDN を参照)。
最も明白な解決策はすでに見つかりました。getElementById
関数内で呼び出すことにより、関数が呼び出されるまでに DOM が読み込まれて準備が整い、期待どおりに要素が検出されます。
他にもいくつかの解決策があります。1 つは、次のように、ドキュメント全体が読み込まれるまで待機することです。
<script type="text/javascript">
var lolz;
function onload() {
lolz = document.getElementById('lolz');
}
function kk(){
alert(lolz.value);
}
</script>
<body onload="onload();">
<input type="text" name="enter" class="enter" value="" id="lolz"/>
<input type="button" value="click" onclick="kk();"/>
</body>
タグのonload
属性に注意してください。(補足: タグの属性は非推奨です。使用しないでください。)<body>
language
<script>
ただし、 には問題があります。すべて(画像などを含む) がロードされるonload
まで待機します。
もう 1 つのオプションは、DOM の準備が整うまで待機することです (通常は よりもかなり早い時期ですonload
)。これは「プレーンな」JavaScript で実行できますが、jQueryなどの DOM ライブラリを使用する方がはるかに簡単です。
例えば:
<script type="text/javascript">
$(document).ready(function() {
var lolz = $('#lolz');
var kk = $('#kk');
kk.click(function() {
alert(lolz.val());
});
});
</script>
<body>
<input type="text" name="enter" class="enter" value="" id="lolz"/>
<input type="button" value="click" id="kk" />
</body>
jQuery の.ready()は関数を引数として取ります。関数は、DOM の準備が整うとすぐに実行されます。この 2 番目の例では、HTML でインラインで行う代わりに、.click()を使用して kk のハンドラーをバインドしています。onclick