javaScript初学者易错点

大家好,这是我在博客园写的第一篇博文。作为一名前端开发初学者,由于经验不足,水平有限,在做项目的过程中总会遇到这样或那样的问题,每每这时候,我都比较喜欢到博客园这里来寻求解决方案,结果也总是能找到满意的答案。人不仅要懂得获取,还应该懂得付出。因此,我今天在这里注册了一个账号,以后把自己在学习过程中积累的点点滴滴和大家一起分享一下下,还说不定也许对于那些比我晚学前端的亲们有一点点的帮助呢。我的目的很简单,那就是希望在这个平台里和大家一起学习,共同进步。其他的我就不多说了,现在直接切入正题吧,就是简单谈谈我在学习javaScript过程中比较喜欢犯下的一些错误儿,以让大家借鉴一下,免得在这些地方再次被坑。

首先,我要跟大家说说html和javascript代码的执行顺序吧。其实呢,代码的执行顺序是自上而下的。什么是自上而下的执行顺序呢?也许你会疑惑,好吧,那么,问题就来了,

我们一起来看看下面这段代码吧,你就会知道什么是“自上而下”了!!

 1 <html>
 2     <head>
 3         <meta charset="utf-8"/>
 4         <title>
 5             demo1
 6         </title>
 7         <script>
 8             var sing = document.getElementById("startSing");
 9             sing.onclick = function(){
10                 alert("happy birthday to you...happy birthday to you...");
11             }
12         </script>
13     </head>
14     <body>
15         <input type="button" value="sing" id="startSing"/>
16     </body>
17 </html>

上面代码的意图是通过点击按钮"sing",弹出一个"happy birthday to you“的窗口。但是,结果,浏览器却报错了。错误信息如下:

TypeError: sing is null

为什么会报“sing is null ”这样的错误呢,我们明明是通过id来得到startSing这个节点的dom的赋给sing的啊!sing应该是一个object才对的!!怎么会是null呢?其实道理很简单,我们前面不是说了吗?代码是自上而下执行的。当程序执行到第八行的document.getElementById("startSing")时,因为id=startSing的input节点在地15行,但在第八行之前没有id=startSing的节点,所以,得到的结果是一个null。这种错误,在项目实例开发当中是经常会碰到的。为了避开这个错误,我们应该把javascript代码放到onload这个事件函数里面去。把上面的js代码改成如下就行了。

 <script>
    window.onload=function(){
          var sing = document.getElementById("startSing");
          sing.onclick = function(){
                alert("happy birthday to you...happy birthday to you...");
            }
    }
 </script>

为什么放到onload函数里面就不会报错了呢?这是因为onload事件函数里面的代码是在整个页面加载完成之后才会执行的。也就是说,在执行里面代码时,整个页面都已经解析完了,当然,<input type="button" value="sing" id="startSing"/>这行也已经执行了。所以,就能够成功获取到了它的dom啦。

下面我们再来谈谈另外一个初学者比较容易犯错的地方吧。我们知道,要获取一个节点的dom对象有三种方法,一种同过它的id,还有一种是通过他的标签名(比如:p,div,span,h1等等),最后一种是通过name属性来获取。但是第一种方法得到的值和第二、三种是不同,第一种得到的是一个对象,第二、三种得到的是一个对象数组。比如,有下面的段代码:

<div id="box" name="box" > hello world! </div>

我们想要获取它的dom对象,现在分别用三种方法来试一下吧:

 <script>    window.onload=function(){
     var dom1 = document.getElementById("box");//方法1:通过id;
     var dom2 = document.getElementsByTagName("box");//方法2:通过TagName
     var dom3 = document.getElementsByName("div");//方法3:通过Name
     alert("dom1是"+dom1+" " + "dom2是"+dom2+" " +"dom3是" + dom3)
    }
 </script>
 

在火狐浏览器中打开,alert的结果是:dom1是[object HTMLDivElement] dom2是[object HTMLCollection] dom3是[object NodeList]

由此可知,dom1是是一个对象,dom2是一个对象数组,dom3也是一个对象数组。一个是对象,另外两个是对象数组,那么问题就来了,比如,现在要使

<div id="box" name="box" > hello world! </div>

的背景色变成蓝色,

dom1.style.background="blue"

这种方法是正确的,结果,hello world!的背景色可以变成蓝色的。但是,以下两种方法

dom2.style.background = "blue";
dom2.style.background = "blue";

就错误了。我们刚刚已经alert过了,dom2和dom3是一个对象数组,而不是简单的一个对象。我们要指定某个对象,还要加个下标给它,只需把上面改成

dom2[0].style.background = "blue";
dom3[0].style.background = "blue";

这样就正确了。

好吧,时间不早了,该休息了。今天就写这么多吧。大家晚安。

时间: 2024-10-10 06:11:03

javaScript初学者易错点的相关文章

Javascript易错知识点

? JS易错知识点总结: == 和 === 的区别: ==:判断两个变量的值是否相等. ===:判断两个变量的类型和值是否都相等,两个条件同时满足时,表达式为True. switch中break的作用: 如果一个case后面的语句,没有写break,那么程序会向下执行,而不会退出: 例如:当满足条件的case 2下面没有break时,case 3也会执行 1 var num = 2; 2 switch(num){ 3 case 1: 4 alert('case 1'); 5 break; 6 c

JavaScript易错知识点整理

本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES6的知识点. JavaScript知识点 1.变量作用域 var a = 1; function test() { var a = 2; console.log(a); // 2 } test(); 上方的函数作用域中声明并赋值了a,且在console之上,所以遵循就近原则输出a等于2. var a

JavaScript 易错知识点整理

本文是我学习JavaScript过程中收集与整理的一些易错知识点,将分别从变量作用域,类型比较,this指向,函数参数,闭包问题及对象拷贝与赋值这6个方面进行由浅入深的介绍和讲解,其中也涉及了一些ES6的知识点. JavaScript知识点 1.变量作用域 var a = 1;function test() { var a = 2; console.log(a); // 2} test();上方的函数作用域中声明并赋值了a,且在console之上,所以遵循就近原则输出a等于2. var a =

关于Verilog HDL的一些技巧、易错、易忘点(不定期更新)

本文记录一些关于Verilog HDL的一些技巧.易错.易忘点等(主要是语法上),一方面是方便自己忘记语法时进行查阅翻看,另一方面是分享给大家,如果有错的话,希望大家能够评论指出. 关键词: ·技巧篇: 组合逻辑输出类型选择; 语法上的变量交换; ·易忘篇: case/casex/casez语句; 循环语句: 数制和操作符: 数据类型: ·易错: 技巧篇: 1.组合逻辑输出:描述一个纯组合逻辑电路时,尽量不要把输出定义成输出类型,例如描述下面的电路: 1 module mux #(paramet

开发易错点收集

开发易错点收集 1.java 比较字符串内容是否相等,需要使用方法 boolean java.lang.String.equals(Object arg0),直接使用 == 判断的是两个串的地址是否相等. jvm加载jar是按照文件名排序后加载的,加载一次后不会重复加载.也就是说程序目录lib中同时存在 TestJar1.jar 和 TestJar2.jar,运行时加载的是TestJar1.jar < 2.javaScript ''==0 返回为true ,用全等返回false,对于喜欢用if(

JavaScript中易犯的小错误-------常见错误二:传统编程语言的生命周期误区

JavaScript中易犯的小错误-------常见错误二:传统编程语言的生命周期误区另一种易犯的错误,便是带着其他编程语言的思维,认为在JS中,也存在生命周期这么一说.请看下面的代码:for (var i = 0; i < 10; i++) { /* ... */ } console.log(i);如果你认为在运行console.log() 时肯定会报出 undefined 错误,那么你就大错特错了.我会告诉你其实它会返回 10吗.当然,在许多其他语言当中,遇到这样的代码,肯定会报错.因为i明

关于正则表达式的易错点

由于工作需要,在使用JavaScript过程中需要对输入参数做一些前端判断,所以接触到正则表达式.网上有很多教程可以学习参考,我只是初次接触,写一点自己的小结和遇到的易错点. 默认有一个TextBox,对其输入的内容进行检测var re=/^[0-9]$/i --只能输入一个数字var re=/^[0-9]/i --第一位是数字,后面任意字符且字符长度不限var re=/^[0-9]+/i --第一个是数字,后面字符任意.长度任意var re=/^[0-9]$/i --只能输入一个数字var r

黑马程序员---C基础3【变量的易错】【程序结构】【if语句】【Switch语句】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [变量的易错] 1.变量为什么要初始化为0 int  sum,a=3: sum = sum+a 如果未初始化则会成为一个不确定的变量,结果也会不确定,容易出错. 2.不同类型的变量之间的转换 切记int  a=1,b=0:b=1-1.5:其中b为一个整型所有结果是保留整数部分的0,而不是-0.5,又因为0没有正负之分,所有保存结果为b=0: 3.关于Xcode的一个快速注释的插件 快捷键://

细节!重点!易错点!--面试java基础篇(一)

今天来给大家分享一下java的重点易错点部分,也是各位同学面试需要准备的,欢迎大家交流指正. 1.java中的main方法是静态方法,即方法中的代码是存储在静态存储区的. 2.任何静态代码块都会在main方法之前执行. 3.java程序的初始化顺序:原则:静态优先于非静态,且只初始化一次:父类优先于子类:按照成员定义顺序初始化.例顺序:父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数. 4.