如果你在函数之外定义了lol
,那么函数不起作用的原因是当JavaScript第一次运行时,DOM尚未加载。因此,getElementById
将返回null
(请参见MDN)。
你已经找到了最明显的解决方案:在函数内部调用getElementById
,这样DOM会在函数调用时加载并准备好,就像你预期的那样找到元素。
还有其他几种解决方案。其中一种是等待整个文档加载完成,像这样:
<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>
注意 <body>
标签的 onload
属性。 (顺便提一下:<script>
标签的 language
属性已经被弃用,请不要使用。)
然而,onload
存在一个问题:它会等待直到所有内容(包括图像等)都加载完成。
另一个选项是等待 DOM 准备就绪(通常比 onload
早得多)。这可以使用“纯” JavaScript 完成,但使用 DOM 库(如jQuery)会更容易。
例如:
<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准备就绪时立即运行。第二个示例还使用.click()来绑定kk的onclick
处理程序,而不是在HTML中内联执行。