JavaScript【DOM操作】

1、概念

    JavaScript简称JS,是运行在浏览器端的一门脚本语言。其代表行为(网页界面和用户交互),用于响应用户操作。一开始主要用来做浏览器端验证,但是现在功能已经不止于此。
    所谓的脚本语言就是指:代码不需要编译,可以直接运行,并且读入一行,运行一行。

特点:
    弱类型:声明时不需要指定类型
    动态类型的语言:可以动态的分配类型
    是解释型的语言,由浏览器的JavaScript引擎执行

2、编写的位置

需要写在script标签中:

<script type="text/javascript">
   // JavaScript代码
</script>

可以引入外部的js文件:

<script type="text/javascript" src=""></script>

src为外部js文件的路径

3、变量的声明

不需要指定类型,通过var关键字声明,要告诉浏览器自己编写的是JavaScript代码。

类型的分配

首先需要声明变量;然后给变量赋值时,会分配类型;也可以重新给变量赋值,动态分配类型。

示例:

 // 声明变量a
var a;
// 给变量a赋值为10【即数值型】
a = 10;
// 弹出一个警告框
alert(a); // 10
// 重新将字符串复制给变量a【动态改变a的类型为字符型】
a = "abc";
alert(a); // abc

命名规范


字母,下划线(_),美元符号($)开头,推荐使用字母开头,大小写敏感。

4、函数

相当于Java中的方法
在JavaScript中,函数也被看作为一个对象,可以将一个函数的引用赋值给一个变量

函数的声明

通过function关键字
每一个语句都是用分号(;)隔开

有名函数

function 函数名 (形式参数1, 形式参数2){
};

不需要指定形参的类型

匿名函数

var 变量名 = function(){};

变量名就是函数名

函数的使用

通过函数名【有名函数】或接收函数的变量名【匿名函数】,外加小括号来调用函数
函数名(实参);

函数的特点

⑴ js函数的形参,不需要指定类型,即不需要使用var关键字
⑵ js函数调用时,不会检查参数的个数和类型
⑶ 当传入的参数和函数的参数个数不匹配时:
    ⒈ 参数不够:使用null补充
    ⒉ 参数过多:从前往后匹配使用

使用示例


【无参的匿名函数】

   // 声明一个匿名函数,并用变量fun来接收
   var fun = function(){
     alert("我是匿名函数");
   };

   // 通过fun来调用函数
   fun();

【有参的有名函数】

   // 声明一个有名(sum)的有参的函数
  // a和b不需要指定类型,所以没有写var
  function sum(a, b){
    // 返回a+b的结果
    return a + b;
  };

  // 打印两个数值相加
  alert(sum(3, 4.7)); // 7.7

 // 打印数值和字符串相加
 alert(sum("a", 2)); // a2 【字符串拼接】

 // 打印数值和布尔类型相加
 // true为1;false为0,和数字计算
 alert(sum(false, 3)); // 3
 alert(sum(true, 3)); // 4

 // 打印形参个数不匹配的结果
 // 少写参数
 alert(sum(3)); // NaN 【Not A Number】
 // 多写参数
 alert(sum(1, 2, 3)); // 3 【会从前往后匹配使用】

5、对象

在JavaScript中,所有的对象都是Object类型

创建对象的方式

⑴ 通过new Object(); 来创建一个对象
⑵ 直接创建并初始化对象 { }; 并在大括号中初始化属性和函数,属性或函数跟值用冒号(:)连接,多个属性或函数之间通过逗号(,)隔开

注意:
⑴ 对象的属性或函数,必须通过对象来调用
⑵ 调用不存在的属性,返回结果为:undefined【未定义的】

使用示例

// ⑴ 通过new Object(),创建一个对象
var obj1 = new Object();
obj1.name = "张三";
obj1.age = 14;
obj1.info = function(){
             // 通过对象来调用       通过this关键字来调用【this代表调用这个函数的对象】
  return "我是:" + obj1.name + ",年龄:" + this.age;
};

alert(obj1.name); // 张三
alert(obj1.info());// 我是:张三,年龄:14
// 该对象没有此属性
alert(obj1.a); // undefined


// ⑵ 直接创建并初始化对象
var obj2 = {
  name:"李四",
  age:16,
  info:function(){
    return this.name + ", " +  this.age;
  }
};

alert(obj2.info());// 李四, 16

6、事件

事件即:用户和浏览器之间发生的交互

注意:需要给标签设置特定事件时,使用JS代码来给HTML标签指定事件,当特定的操作发生时,事件方法才会被浏览器调用

例如:通过js给按钮设置单击事件
    三种方式:
        ⑴ 每一个标签都有事件的属性: onclick,可以在属性值中直接使用js代码
            但是这种方式的耦合度很高,基本不使用
        ⑵ 在script标签内书写js代码
            要写在所有的标签后面
        ⑶ 在head标签中的script标签中书写js代码
            但是如果直接写js代码,会报错:
            Uncaught TypeError: Cannot set property ‘onclick’ of null
            因为文档的加载方式是从上到下,执行js代码的时候,btn对象还没有,所以对象为空

        解决方法:让js代码在整个文档加载完成之后再执行
        这时就需要调用window对象的onload函数。因为这个函数是当文档加载完成后,浏览器才调用

Tips:window对象:表示浏览器窗口

使用示例

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <title>添加点击事件</title>

    <script type="text/javascript">
      /* 添加事件方式3,在头部标签中的script标签中写JS代码
           需要调用window对象的onload函数
           这样才能找到btn3按钮对象 */
      window.onload = function(){
        var btn3 = document.getElementById("btn3");
        btn3.onclick = function(){
          alert("Button 3");
        };
      };
    </script>
  </head>
  <body>
                                   <!-- 添加事件方式1,通过标签的onclick属性来创建点击事件
                                        这种方式耦合度较高,尽量不要用 -->
    <input type="button" value="按钮1" onclick="alert('我是按钮1');" />
    <br /><br />
    <button id = "btn2">按钮2</button>
    <br /><br />
    <button id = 'btn3'>按钮3</button>

    <!-- 添加事件方式2,在所有的标签的下面添加JS代码 -->
    <script type="text/javascript">
      var btn2 = document.getElementById("btn2");
      btn2.onclick = function(){
        alert("按钮2");
      };
    </script>
  </body>
</html>

7、DOM

概念

    Document Object Model 文档对象模型
    帮助我们在JS中查找标签对象,对标签进行增删改查,添加或修改属性,设置CSS样式等操作

    将整个文档当作一个对象,页面中所有的内容都是对象,都是document的后代对象。而对象操作标签(元素)很方便,属性和函数可以直接调用
    缺点是:使用麻烦,浏览器兼容性差
    因为浏览器解析网页有三个引擎:html、css、js引擎,每个浏览器的解析效果不同,所以在使用时需要判断是哪个浏览器
    所以一般开发时都会使用第三方的JS库,例如jQuery等

    Document:代表整个 HTML 文档,可以用来访问页面中的所有元素

    Window对象表示一个浏览器窗口或一个框架。Window 对象是全局对象,所有的表达式都在当前的环境中计算。也就是说,要引用当前窗口根本不需要特殊的语法,可以把那个窗口的属性作为全局变量来使用。所以,可以只写document,而不必写 window.document

节点

节点:Node——构成HTML文档最基本的单元

节点分为三类:
元素节点:构成HTML文档最基本的HTML元素,对应HTML文档中的HTML标签
属性节点:元素的属性
文本节点:HTML标签中的文本内容

示例:

 <font color="red">字体</font>
 元素节点:所有的font标签,即:<font color="red">字体</font>
 属性节点:font标签的属性,即:color="red"
 文本节点:font标签的文本内容,即:字体

元素类型

父元素:只要有子元素的元素都是父元素
子元素:有上级元素的元素
祖先元素:父元素的更上级元素
后代元素:子元素的下级元素
    例如: html是div的祖先元素
                div是html的后代元素
兄弟元素:在同一个层级内的元素
    例如: head和body就是兄弟元素

常用的DOM对象属性

nodeName


返回节点的名称

nodeType


返回节点的类型

nodeValue


返回节点的值
节点的属性

innerHTML


获取或设置元素的文本内容
虽不是W3C标准,却被所有主流的浏览器支持
    ① 读取元素内部HTML代码
        元素对象.innerHTML
    ② 修改元素内部HTML代码
        元素对象.innerHTML=HTML代码

childNodes


返回元素的所有子节点。返回值类型为 [object NodeList]

Tips:对于集合或节点数组,可以调用length来获取长度,并使用for循环来遍历

注意:因为浏览器的兼容问题,DOM解析时会将空格、文本也解析成一个节点对象。所以该属性最好不要用

firstChild

返回元素的第一个子节点
注意:因为浏览器的兼容问题,DOM解析时会将空格、文本也解析成一个节点对象。所以该属性最好不要用

lastChild

返回元素的最后一个子元素
注意:因为浏览器的兼容问题,DOM解析时会将空格、文本也解析成一个节点对象。所以该属性最好不要用

parentNode

返回元素的父节点

previousSibling

返回元素的前一个兄弟节点
注意:因为浏览器的兼容问题,DOM解析时会将空格、文本也解析成一个节点对象。所以该属性最好不要用

nextSibling

返回元素的后一个兄弟节点
注意:因为浏览器的兼容问题,DOM解析时会将空格、文本也解析成一个节点对象。所以该属性最好不要用

value

返回或设置元素的value属性值

常用的DOM对象方法

getElementById


document.getElementById(String elementId);
返回带有指定 ID 的元素。查找一个元素

getElementsByTagName


document.getElementsByTagName(String tagname);
根据标签名查找元素。返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。查找一组元素。返回值类型为[object HTMLCollection]

Tips:对于集合或节点数组,可以调用length来获取长度,并使用for循环来遍历

getElementsByName


document.getElementsByName(String elementName);
根据name属性值查询元素。一般是input元素或一组元素。返回值类型为[object HTMLCollection]

Tips:对于集合或节点数组,可以调用length来获取长度,并使用for循环来遍历

使用示例

<!DOCTYPE html>

<html>
  <head>
    <meta charset="utf-8" />
    <title>DOM操作</title>

    <script type="text/javascript">
      window.onload = function(){

        // 根据标签名获取元素【返回一个集合】
        var btns = document.getElementsByTagName("button");
        // 获取节点类型
        // alert(btns); // [object HTMLCollection]

        // 因为整个页面中只有一个button,所以取第一个
        var btn = btns[0];
        // alert(btn); // [object HTMLButtonElement]

        // 修改按钮的onclick事件
        btn.onclick = function(){
          // 根据id获取节点
          var fEle = document.getElementById("f1");
          fEle.color = "red";
        };

//

        // 根据name属性获取节点【返回一个集合】
        var lists = document.getElementsByName("list");
        // alert(lists); // [object HTMLCollection]

        // 因为整个页面中只有一个无序列表,所以取第一个
        var list = lists[0];

        // 得到ul的所有子节点【li】
        var children =  list.childNodes;
        // 获取集合的长度
        var len = children.length;
        // 因为有的浏览器在解析DOM时,会将空格、字符也解析为节点
        alert(len); // 7 【IE10 测试】

        var first = list.firstChild;
        // 还是因为有的浏览器会将空格解析为节点
        alert(first); // [object Text] 【IE10 测试】

        var last = list.firstChild;
        alert(last); // [object Text] 【IE10 测试】

//

        // 获取id为li2的li标签
        var li2 = document.getElementById("li2");
        // 获取li的父节点【ul】
        var parentEle = li2.parentNode;
        alert(parentEle); // [object HTMLUListElement]

        // 获取li的前一个兄弟节点
        var preEle = li2.previousSibling;
        // 还是因为有的浏览器会将空格解析为节点
        alert(preEle); // [object Text] 【IE10 测试】

        // 获取li的下一个兄弟节点
        var nextEle = li2.nextSibling;
        alert(nextEle); // [object Text] 【IE10 测试】


//

        var hEle = document.getElementsByTagName("h1")[0];
        // 获取元素的文本内容
        alert(hEle.innerHTML); // 这是1级标签
        hEle.innerHTML = "修改!";

        var fEle = document.getElementById("f1");
        alert(fEle.innerHTML); // 我是font标签

        // 节点的名称
        alert(fEle.nodeName); // FONT
        // 节点的类型
        alert(fEle.nodeType); // 1
        // 节点的值
        alert(fEle.nodeValue); // null

        var txtEle = document.getElementById("txt");
        // 获取input标签的value属性值
        var typeEle = txtEle.value;
        alert(typeEle);
        // 修改input标签的value属性值
        txtEle.value = "txt";

      };
    </script>
  </head>
  <body>
    <h1>这是1级标签</h1>
    <font id="f1">我是font标签</font><br /><br />
    <button>让上面的font标签文字变红色</button><br /><br />

    <ul name="list">
      <li>列表项1</li>
      <li id="li2">列表项2</li>
      <li>列表项3</li>
    </ul>

    <input type="text" id="txt" value="文本框" />
  </body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值