我在Web Inspector中收到错误,如下所示:
TypeError: 'null' is not an object (evaluating 'myButton.onclick = function() {
var userName = myTextfield.value;
greetUser(userName);
return false;
}')
这是我的代码(HTML):
<h2>Hello World!</h2>
<p id="myParagraph">This is an example website</p>
<script src="js/script.js" type="text/javascript"></script>
<form>
<input type="text" id="myTextfield" placeholder="Type your name" />
<input type="submit" id="myButton" value="Go" />
</form>
这是JS:
var myButton = document.getElementById("myButton");
var myTextfield = document.getElementById("myTextfield");
function greetUser(userName) {
var greeting = "Hello " + userName + "!";
document.getElementsByTagName ("h2")[0].innerHTML = greeting;
}
myButton.onclick = function() {
var userName = myTextfield.value;
greetUser(userName);
return false;
}
我知道为什么会收到错误?
答案 0 :(得分:30)
放置代码,使其在定义元素后执行,或者使用 DOM ready 回调,或者将源放在HTML中的元素下。
如果找不到该元素,则 document.getElementById()
会返回null
。属性分配只能在对象上进行。 null
不是一个对象(与typeof
所说的相反)。
答案 1 :(得分:4)
任何执行和处理DOM元素的JS代码都应该在创建DOM元素之后执行。 JS代码从上到下解释为HTML中的布局。 因此,如果DOM元素之前有标记,则脚本标记中的JS代码将在浏览器解析HTML页面时执行。
因此,在您的情况下,您可以将DOM交互代码放在函数中,以便只定义函数但不执行。
然后,您可以为文档加载添加事件侦听器以执行该函数。
这会给你类似的东西:
<script>
function init() {
var myButton = document.getElementById("myButton");
var myTextfield = document.getElementById("myTextfield");
myButton.onclick = function() {
var userName = myTextfield.value;
greetUser(userName);
}
}
function greetUser(userName) {
var greeting = "Hello " + userName + "!";
document.getElementsByTagName ("h2")[0].innerHTML = greeting;
}
document.addEventListener('readystatechange', function() {
if (document.readyState === "complete") {
init();
}
});
</script>
<h2>Hello World!</h2>
<p id="myParagraph">This is an example website</p>
<form>
<input type="text" id="myTextfield" placeholder="Type your name" />
<input type="button" id="myButton" value="Go" />
</form>
答案 2 :(得分:2)
我认为错误是因为元素未定义,所以你需要添加window.onload
事件,该事件将在加载窗口时定义你的元素。
window.addEventListener('load',Loaded,false);
function Loaded(){
var myButton = document.getElementById("myButton");
var myTextfield = document.getElementById("myTextfield");
function greetUser(userName) {
var greeting = "Hello " + userName + "!";
document.getElementsByTagName ("h2")[0].innerHTML = greeting;
}
myButton.onclick = function() {
var userName = myTextfield.value;
greetUser(userName);
return false;
}
}
答案 3 :(得分:0)
尝试加载你的javascript。
试试这个:
<h2>Hello World!</h2>
<p id="myParagraph">This is an example website</p>
<form>
<input type="text" id="myTextfield" placeholder="Type your name" />
<input type="submit" id="myButton" value="Go" />
</form>
<script src="js/script.js" type="text/javascript"></script>
答案 4 :(得分:0)
我同意alex关于确保DOM已加载的信息。我还认为提交按钮会触发刷新。
这就是我要做的事情
<html>
<head>
<title>webpage</title>
</head>
<script type="text/javascript">
var myButton;
var myTextfield;
function setup() {
myButton = document.getElementById("myButton");
myTextfield = document.getElementById("myTextfield");
myButton.onclick = function() {
var userName = myTextfield.value;
greetUser(userName);
return false;
}
}
function greetUser(userName) {
var greeting = "Hello " + userName + "!";
document.getElementsByTagName("h2")[0].innerHTML = greeting;
}
</script>
<body onload="setup()">
<h2>Hello World!</h2>
<p id="myParagraph">This is an example website</p>
<form>
<input type="text" id="myTextfield" placeholder="Type your name" />
<input type="button" id="myButton" value="Go" />
</form>
</body>
</html>
玩得开心!