开发者问题收集

JavaScript DOM 编码 - ‘未定义’ 错误

2011-08-12
5894

我遇到了这个错误:

'undefined' is null or not an object'

您能看一下并告诉我吗?在我的编码中,我想要简单的 DOM JavaScript 代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>
<script>
    init();
    function init()
    {
        getElementByTabIndex("4", "submit")[0].addEventListener("click", Verify, false);
    }
    function Verify() {
        alert('done');  
        // all verification code will be here...
    }
    function getElementByTabIndex(index, type, node)
    {
        if (!node)
        { 
            node = document.getElementsByTagName('body')[0]; 
        } 

        var a = [];
        els = node.getElementsByTagName('*'); 
        for (var i = 0, j = els.length; i < j; i++) 
        { 
            if (els[i].tabIndex == index && els[i].type == type)
            { 
                a.push(els[i]);
            } 
        } 
    return a; 
}

</script>
<body>
<input type="email" id="email" /><input type="password" id="pass" /> <label class="Login" for="login"><input value="Log In" tabindex="4" type="submit" id="login"></label>
</body>
</html>
3个回答

您必须将代码移至底部或在主体加载后调用 init()

原因: 您试图在元素存在之前获取它们。

例如

<head>
   <script>
      var elm= document.getElementById('id');

      //this will be always undefied, as trying to read element even before they exist
   </script>
</head>

<body>
  <div id='foo'></div>

   <script>
      var elm= document.getElementById('id');

      //this wont be undefined 
   </script>

</body>
Praveen Prasad
2011-08-12

您调用:

if (!node) { 
    node = document.getElementsByTagName('body')[0]; 
} 

但是您的脚本在 DOM 完成加载之前运行,因此 body 标记不存在。

因此 nodeundefined ,当您尝试执行以下操作时,会出现错误:

node.getElementsByTagName('*');

在文档加载时运行 init() ,而不是立即运行。


PS. jsfiddle 和 Firebug 允许我非常快速地调试它。

Lightness Races in Orbit
2011-08-12

在您尝试调用 init() 时,javascript 无法使用“body”。

在 dom 加载完成后调用您的 init 方法,如下所示:

window.onload = function (){
    init();
}

请注意,为了使其跨浏览器工作(如果您打算在计划的 Safari 扩展之外使用它),您将必须做一些额外的工作。更多信息: http://www.javascriptkit.com/dhtmltutors/domready.shtml

mhe
2011-08-12