函数在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>
注意标签的onload
属性<body>
。(附带说明:标签的language
属性<script>
已被弃用。不要使用它。)
但是,存在一个问题onload
:它会等待所有内容(包括图像等)加载完毕。
另一种选择是等到 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 准备好后立即运行。第二个示例也使用.click()来绑定 kk 的onclick
处理程序,而不是在 HTML 中进行内联。