DOM事件与元素属性操作基本应用

事件

  • 事件:什么时候,做什么事
  • 执行机制:触发——响应
  • 绑定事件三要素
    1.事件源:绑定给谁事件
    2.事件类型:绑定什么类型的事件
    比如:click单击
    3.事件函数:事件发生后执行什么内容,写在函数内部

事件监听

  • JavaScript解析器会给有绑定事件的元素添加一个监听,解析器会一直监测这个元素,只要触发了绑定事件,就会立即执行事件函数

常见事件监听方法

  • 方法1:绑定HTML元素属性
  • 方法2:绑定DOM对象属性
    绑定HTML属性:
 <input type="button" id="btn" value="点击有惊喜" onclick="alert('点我做什么?')">

绑定DOM对象属性

<input type="button" id="btn" value="点击有惊喜">
    <script>
        // 获取元素
        var btn = document.getElementById("btn");
        // 添加绑定事件
        btn.onclick = function () {
            // 定义的是事件被触发后要做的事情
            alert("点我干嘛?");
        };
    </script>

常见鼠标事件类型

事件 说明
onclick 鼠标左键单击触发
ondbclick 鼠标左键双击触发
onmousedown 鼠标按键按下触发
onmouseup 鼠标按键放开时触发
onmousemove 鼠标在元素上移动触发
onmouseover 鼠标移动到元素上触发
onmouseout 鼠标移出元素边界触发

非表单元素属性操作

非表单元素的属性

  • 例如:href,title,id,src等等
  • 调用方式:元素对象打点调用属性名,例如obj.href
  • 注意:部分的属性名跟关键字和保留字冲突,会更换写法。
  • 属性赋值:给元素属性赋值,等号右侧的赋值都是字符串格式。
    class → className
    for → htmlFor
    rowspan → rowSpan
<body>    
    <a href="http://www.baidu.com" title="跳转到百度页面" id="link">跳转</a>
    <img src="images/a.jpg" alt="美女" class="pic" id="pic">
    <script>
        // 获取元素
        var link = document.getElementById("link");
        var pic = document.getElementById("pic");
        // 调用元素对象的属性,从而操作 HTML 中标签的属性
        console.log(link.href);
        console.log(link.title);
        console.log(link.id);
        console.log(pic.src);
        console.log(pic.alt);
        console.log(pic.className);
        // 等号赋值,值必须是字符串类型的
        pic.src = "images/b.jpg";
    </script>
</body>

案例:div的显示或者隐藏

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }
    div {
      width: 200px;
      height: 200px;
      background-color: pink;
    }
    .hide {
      display: none;
    }
    .show {
      display: block;
    }
  </style>
</head>
<body>
  <input type="button" value="点击隐藏" id="btn">
  <div id="box"></div>
  <script>
    // 获取元素
    var btn = document.getElementById("btn");
    var box = document.getElementById("box");
    // 点击按钮,让 div 显示或隐藏
    // box.style.display = "none";
    btn.onclick = function () {
      // 元素 div 当前是显示的,需要让他隐藏
      // 根据 按钮 的 value 值进行条件判断
      if (btn.value === "点击隐藏") {
        box.className = "hide";
        btn.value = "点击显示";
      } else {
        box.className = "show";
        btn.value = "点击隐藏";
      }
      
    };
  </script>
</body>
</html>

将hide类和show类放在css部分,需要调用的时候使用js代码控制显示

在事件函数内部 有一个 this ,指向事件源
区分一下不同函数内部 this 的指向
普通函数 -> window 对象
构造函数 -> 指向的是生成的实例对象
对象的方法 -> 指向的是对象本身
事件函数 -> 指向的是事件源

上述案例代码可以优化为

案例:切换图片

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <input type="button" value="点击" id="btn"><br>
  <img src="images/a.jpg" id="pic">
  <script>
    // 获取元素
    var btn = document.getElementById("btn");
    var pic = document.getElementById("pic");
    // 通过一个变量作为判断条件,变量值为 1,认为加载的是 a 图片,如果为 2 ,认为加载的是 b 图片
    var num = false;
    // 给按钮添加点击事件
    btn.onclick = function () {
      // 给图片换 src 的属性值
      // 通过 if 语句判断,如果是 a 图片,就换成 b 图片,反之换成 a 图片
      if (num === false) {
        pic.src = "images/b.jpg";
        // 数字要对应发生变化
        num = true;
      } else {
        pic.src = "images/a.jpg";
        num = false;
      }
    };
  </script>
</body>
</html>

使用一个中间变量进行控制,判断是什么图片,该换到什么图片

案例:画廊

<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style type="text/css">
        body {
            font-family: "Helvetica", "Arial", serif;
            color: #333;
            background-color: #ccc;
            margin: 1em 10%;
        }

        h1 {
            color: #333;
            background-color: transparent;
        }

        a {
            color: #c60;
            background-color: transparent;
            font-weight: bold;
            text-decoration: none;
        }

        ul {
            padding: 0;
        }

        li {
            float: left;
            padding: 1em;
            list-style: none;
        }

        #imagegallery {}

        #imagegallery a {
            margin: 0px 20px 20px 0px;
            padding: 0px;
            display: inline;
        }

        #imagegallery a img {
            border: 0;
        }
    </style>
</head>

<body>
    <h2>
        美女画廊
    </h2>

    <div id="imagegallery">
        <a href="images/1.jpg" title="美女A">
            <img src="images/1-small.jpg" width="100px" alt="美女1" />
        </a>
        <a href="images/2.jpg" title="美女B">
            <img src="images/2-small.jpg" width="100px" alt="美女2" />
        </a>
        <a href="images/3.jpg" title="美女C">
            <img src="images/3-small.jpg" width="100px" alt="美女3" />
        </a>
        <a href="images/4.jpg" title="美女D">
            <img src="images/4-small.jpg" width="100px" alt="美女4" />
        </a>
    </div>

    <div style="clear:both"></div>

    <img id="image" src="images/placeholder.png" alt="" width="450px" />

    <p id="des">选择一个图片</p>
    <script>
        // 1.获取元素
        var imagegallery = document.getElementById("imagegallery");
        var links = imagegallery.getElementsByTagName("a");
        var image = document.getElementById("image");
        var des = document.getElementById("des");

        // 2.遍历数组,添加点击事件
        for (var i = 0 ; i <= links.length - 1 ; i++) {
            links[i].onclick = function () {
                // alert("aaa");
                // 3.更改 image 内部的 src 属性值
                // this 关键字指代的是触发事件的真正事件源
                image.src = this.href;
                // 4.更改 des 内部的文字内容
                des.innerText = this.title;
                // 5.取消 a 标签的默认跳转效果
                return false;
            };
        }

        // for 循环内部添加的绑定事件,在触发时,所有的批量添加的事件已经成功,触发事件时都是在循环结束之后
        // 批量绑定的事件的事件函数内部如果有 变量 i,要注意,函数执行时已经是在循环结束后
        // 循环内部定义的变量是一个全局变量,在循环后执行的 i 变量的值是 i 跳出循环时的值
        // image.src = links[i].href;
        // console.log(i);
    </script>
</body>

</html>

获取标签内部内容的属性

  • 获取标签内部内容的都属性有两个:innerHTML和innerText
  • innerHTML属性,在获取标签内部内容时,如果包含标签,获取的内容会包含标签,获取的内容包括空白换行等。
  • innerText属性,在获取标签内部内容时,如果包含标签,获取的内容会过滤标签,获取的内容会去掉换行和缩进等空白。

更改标签内容

还可以通过两个属性给双标签内部去更改内容:

  • innerHTML 设置属性值,有标签的字符串,会按照 HTML 语法中的标签加载。
  • innerText 设置属性值,有标签的字符串,会按照普通的字符加载。

对比使用场景

  • innerText:在设置纯字符串时使用。
  • innerHTML:在设置有内部子标签结构时使用
<body>
  <div id="box">
    这是一个 div 标签
    <span>这是一个 span 标签</span>
  </div>
  <script>
    // 获取元素
    var box = document.getElementById("box");
    // 打印 box 对象
    console.dir(box);
    // 调用标签内部内容
    console.log(box.innerHTML);
    console.log(box.innerText);
    // 设置标签内部的内容
    box.innerHTML = "<h2>hello JS</h2>";
    // box.innerText = "<h2>hello JS</h2>";
  </script>
</body>
innerHTML

innerText

表单元素属性

  • value用于大部分表单元素的内容获取(option除外)
  • type可以获取input标签的类型(输入框,复选框等等)
  • disabled禁用属性
  • checked复选框选中属性
  • selected下拉菜单选中属性
  • 注意:在DOM中元素对象的属性值只有一个时,会被转成布尔值显示
txt.disabled = true;

意思就是:disabled = "disabled"这种属性,打印出来的值为false or true。

    // 表单元素特有的一些属性,属性名和属性值是一致的,只有一种属性名
    console.log(txt.disabled);
    txt.disabled = false;
    console.log(txt.disabled);
    btn.disabled = true;

表单元素案例:用户名和密码检测

  • 逻辑:两个输入框,一个提交按钮,id名分别是name,pw,btn
  • 给按钮加一个点击事件,判断长度或者其他的条件是否满足,不满足就高亮显示
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .bg{
            background: yellow;
        }
    </style>
</head>
<body>
    <input type="text" id="name"><br>    
    <input type="text" id="pw"><br>
    <input type="button" id="btn" value="提交">
    <script>
        // 检测用户名是否是3-6位,密码是否是6-8位,如果不满足要求高亮显示文本框
        // 1.获取元素
        var btn = document.getElementById("btn");
        
        // 2.给按钮添加点击事件,然后判断位数是否足够
        btn.onclick = function () {
            // 在事件触发后,去获取对象,内部的数据才是最新
            var name = document.getElementById("name");
            var pw = document.getElementById("pw");
            // 用户名位数是否在 3-6 位,不满足需要高亮显示
            if (name.value.length < 3 || name.value.length > 6) {
                name.className = "bg";
                return;
            } else {
                name.className = "";
            }
            // 密码的位数必须在 6-8 位之间,否则高亮显示
            if (pw.value.length < 6 || pw.value.length > 8) {
                pw.className = "bg";
                return;
            } else {
                pw.className = "";
            }
            // 提交数据
            console.log("提交数据");
        };  
    </script>
</body>
</html>

案例二:随机设置下拉菜单选中项

  • option里的选项,数组下标为随机数
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <input type="button" value="选择" id="btn">
    <br>
    <select id="food">
        <option>烤肉</option>
        <option>拉面</option>
        <option>麻辣烫</option>
        <option>小龙虾</option>
        <option>火锅</option>
        <option>外卖</option>
    </select>
    <script>
        // 1.获取元素
        var btn = document.getElementById("btn");
        var food = document.getElementById("food");
        var opts = document.getElementsByTagName("option");

        // 2.给按钮添加点击事件
        btn.onclick = function () {
            // 3.随机选择一个 option
            // 每次点击需要获取一个 opts 数组的随机下标
            // Math.random()   [0,1)
            // Math.random()*6   [0,6)
            var n = Math.floor(Math.random() * opts.length);
            // console.log(n);
            // 设置对应的随机项的属性
            opts[n].selected = true;
        };
    </script>
</body>
</html>

案例三:搜索文本框

  • 逻辑:没有进行输入的时候,是默认的字体,灰色字体,获得焦点的时候会进行输入,原来的内容清空,失去焦点的时候,同时没有内容的时候,就恢复到灰色字体默认的样子,有内容则保留内容
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    .gray {
      color: gray;
    }

    .black {
      color: black;
    }
  </style>
</head>

<body>
  <input type="text" class="gray" value="请输入搜索关键字" id="txtSearch">
  <input type="button" value="搜索" id="btnSearch">
  <script>
    // 获取元素
    var txtSearch = document.getElementById("txtSearch");
    // 1.获得焦点时,可以使用一个 onfocus,如果文本框内容是默认 请输入搜索关键字,需要清空文字,让文字加载黑色
    txtSearch.onfocus = function () {
      // 判断是否是默认的提示文字
      if (this.value === "请输入搜索关键字") {
        this.value = "";
        this.className = "black";
      }
    };
    // 2.失去焦点时,可以使用一个 onblur,如果文本框内容为空,需要改为默认提示内容 请输入搜索关键字,让文字颜色变为灰色
    txtSearch.onblur = function () {
      // 如果用户输入的内容正好与默认提示文本相同,失去焦点时,也应该让文字颜色变为灰色
      // 判断内容是否为空
      if (this.value === "" || this.value === "请输入搜索关键字") {
        this.value = "请输入搜索关键字";
        this.className = "gray";
      }
    };
  </script>
</body>

</html>

案例四:全选或者反选


<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        .wrap {
            width: 300px;
            margin: 100px auto 0;
        }

        table {
            border-collapse: collapse;
            border-spacing: 0;
            border: 1px solid #c0c0c0;
            width: 300px;
        }

        th,
        td {
            border: 1px solid #d0d0d0;
            color: #404060;
            padding: 10px;
        }

        th {
            background-color: #09c;
            font: bold 16px "微软雅黑";
            color: #fff;
        }

        td {
            font: 14px "微软雅黑";
        }

        tbody tr {
            background-color: #f0f0f0;
        }

        tbody tr:hover {
            cursor: pointer;
            background-color: #fafafa;
        }
    </style>

</head>
<body>
  <div class="wrap">
      <table>
          <thead>
            <tr>
                <th>
                    <input type="checkbox" id="all" />
                </th>
                <th>商品</th>
                <th>价钱</th>
            </tr>
          </thead>
          <tbody id="tb">
            <tr>
                <td>
                    <input type="checkbox" />
                </td>
                <td>iPhone8</td>
                <td>8000</td>
            </tr>
            <tr>
                <td>
                    <input type="checkbox" />
                </td>
                <td>iPad Pro</td>
                <td>5000</td>
            </tr>
            <tr>
                <td>
                    <input type="checkbox" />
                </td>
                <td>iPad Air</td>
                <td>2000</td>
            </tr>
            <tr>
                <td>
                    <input type="checkbox" />
                </td>
                <td>Apple Watch</td>
                <td>2000</td>
            </tr>

          </tbody>
      </table>
      <input type="button" value="  反 选  " id="btn">
  </div>
  <script>
    // 获取元素
    var all = document.getElementById("all");
    var tb = document.getElementById("tb");
    var btn = document.getElementById("btn");
    var tb_inputs = tb.getElementsByTagName("input");
    // 1.全选:让子选项的选择效果始终与全选保持一致
    all.onclick = function(){
        for(var i = 0;i < tb_inputs.length; i++){
            tb_inputs[i].checked = all.checked;
        }
    };
    // 2.单独选择子选项过程,每点击一次任何一个子选项,都要进行判断
    for(var i = 0;i<tb_inputs.length; i++){
        tb_inputs[i].onclick = function(){
            // 需要判断所有的子选项是否都是选中的状态,都选中了的话,让全选被选中,如果有的没有选中,让全选取消选中
            isAllChecked();
        }
    }
    // 3.反选
    btn.onclick = function(){
        // 让所有的子元素和之前的状态相反
        for(var i = 0;i<tb_inputs.length;i++){
            tb_inputs[i].checked = !tb_inputs[i].checked;
        }
        // 控制全选效果,进行取反
        isAllChecked();
    };
    function isAllChecked() {
        // 使用一个中间变量,初始认为所有的子选项都是被选中的
        var isAllChecked = true;
            // 遍历判断
            for(var j = 0;j<tb_inputs.length;j++){
                // 一旦有一个没有被选择,让变量变为false
                if(tb_inputs[j].checked == false){
                    isAllChecked = false;
                    // 只要走到这儿,就肯定不是全选,可以打断循环
                    break;
                }
            }
            // 如果循环条件不成立,说明子选项都被选中了,isAllChecked没有变化, 还是true
            // 给all设置checked属性
            all.checked = isAllChecked;
    }
  </script>
</body>
</html>

自定义属性

  • getAttribute(name) 获取标签行内属性
  • setAttribute(name,value) 设置标签行内属性
  • removeAttribute(name) 移除标签行内属性
  • 与element.属性的区别: 上述三个方法用于获取任意的行内属性,包括自定义的属性。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <div id="box" age="18" sex="male">小明</div>
  <script>
    // 获取元素
    var box = document.getElementById("box");
    // 元素自有属性
    console.log(box.id);
    // 元素自定义的新属性不能用点语法直接调用
    // 可以调用元素对象的获取自定义属性的方法
    console.log(box.getAttribute("age"));
    console.log(box.getAttribute("sex"));
    // 也可以调用自有的属性
    console.log(box.getAttribute("id"));

    // 设置属性,添加新的自定义属性或者自有属性
    box.setAttribute("age","20");
    box.setAttribute("city","Beijing");
    // 传的参数不需要进行属性名的修改
    box.setAttribute("class","demo");

    // 移除属性
    box.removeAttribute("age");
    box.removeAttribute("class");
  </script>
</body>
</html>

style样式属性操作

  • 使用 style 属性方式设置的样式显示在标签行内。
  • element.style 属性的值,是所有行内样式组成的一个样式对象。
  • 样式对象可以继续点语法调用或更改 css 的行内样式属性,例如 width、height 等属性。
  • 注意1:类似 background-color 这种复合属性的单一属性写法,是由多个单词组成的,要修改为驼峰命名方式书写 backgroundColor。
  • 注意2:通过样式属性设置宽高、位置的属性类型是字符串,需要加上 px 等单位
<input type="button" value="按钮" id="btn">
    <div id="box" style="width: 100px" class="bg">文字</div>
    <script>
        // 获取元素        
        var btn = document.getElementById("btn");
        var box = document.getElementById("box");
        // console.log(btn);
        // 1.更改类名的方式去更改样式
        // 2.根据对象的 style 属性去操作样式
        console.log(btn.style);
        // 元素对象的 style 属性的值是一个行内样式组成对象,对象内部封装了所有的行内的样式属性及属性值
        // 元素的样式属性对象可以继续打点调用,获取或设置相关的行内样式属性
        console.log(box.style);
        console.log(box.style.width);
        // 注意:如果使用的 css 属性名是复合属性的单一属性,需要更改为驼峰命名法
        console.log(box.style.backgroundColor);
        box.style.width = "200px";
    </script>

通过style样式属性操作的样式更改都是行内样式,唯独比important权重低,以后的JS代码更改样式都可以使用这种方式

className类名属性操作

  • 修改元素的 className 属性相当于直接修改标签的类名。
  • 如果需要修改多条 css 样式,可以提前将修改后的样式设置到一个类选择器中,后续通过修改类名的方式,批量修改 css 样式。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .cls {
          width: 100px;
          height: 100px;
          background-color: pink;
        }
    </style>
    <script src="common.js"></script>
</head>
<body>
    <input type="button" value="按钮" id="btn">
    <div id="box">文字</div>
    <script>
        // 问题:实际工作中我们应该选择哪种方法?
        // 获取元素
        var btn = document.getElementById("btn");
        var box = document.getElementById("box");
        // 给按钮添加事件
        btn.onclick = function () {
          // 1.通过更改类名
          box.className = "cls";
        };
    </script>
</body>
</html>

样式很多,类型很复杂的话,建议使用className类名属性操作

元素属性操作基本应用案例一:开关灯

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <input type="button" value="关灯" id="btn">
  <script src="common.js"></script>
  <script>
    // 获取元素,my$是定义在common.js内的方法
    var btn = my$("btn");
    // 添加点击事件
    // 定义一个判断变量,true表示开灯状态,false表示关灯状态
    var isOpen = true;
    btn.onclick = function(){
      // 关灯时,点击后让他关灯并转文字为开灯
      // if(isOpen){
      //   document.body.style.backgroundColor = "black";
      //   this.value = "开灯";
      //   isOpen = false;
      // }else{
      //   document.body.style.backgroundColor = "white";
      //   this.value = "关灯";
      //   isOpen = true;
      // }
      // 使用btn的value判断
      if(this.value =="关灯"){
        document.body.style.backgroundColor = "black";
        this.value = "开灯"
      }else{
        document.body.style.backgroundColor = "white";
        this.value = "关灯";
      }
    };
  </script>
</body>
</html>

元素属性操作基本应用案例二:图片切换二维码案例


<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box {
            width: 50px;
            height: 50px;
            background: url(images/bgs.png) no-repeat -159px -51px;
            position: fixed;
            right: 10px;
            top: 40%;
        }
        .erweima {
            position: absolute;
            top: 0;
            left: -150px;
        }
        .box a {
            display: block;
            width: 50px;
            height: 50px;
        }
        .hide {
            display: none;
        }
        .show {
            display: block;
        }
    </style>
</head>
<body>
    <div class="box" id="box">
        <div class="erweima hide" id="er">
            <img src="images/456.png" alt=""/>
        </div>
    </div>
    <script src="common.js"></script>
    <script>
        // 获取元素
        var box = my$("box");
        var er = my$("er");
        // 给 box 添加鼠标移上事件 onmouseover ,添加鼠标离开事件 onmouseout
        box.onmouseover = function () {
            // 让子级元素进行显示,就是将 hide 改为 show
            // er.className = "erweima show";
            er.className = er.className.replace("hide","show");
        };
        box.onmouseout = function () {
            // 让子级元素进行隐藏,就是将 show 改为 hide
            // er.className = "erweima hide";
            er.className = er.className.replace("show","hide");
        };
    </script>
</body>
</html>

元素属性操作基本应用案例三:排他思想——文本框高亮显示案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <input type="text"><br>
    <input type="text"><br>
    <input type="text"><br>
    <input type="text"><br>
    <input type="text"><br>
    <input type="text"><br>
    <input type="text"><br>
    <button id="btn">按钮</button>    
    <script>
        // 获取元素
        var txts = document.getElementsByTagName("input");
        // 添加批量的获取焦点事件
        for (var i = 0 ; i < txts.length ; i++) {
            // 排他思想:1.排除其他 2.保留自己         

            // 给每一个input标签添加获取焦点事件
            txts[i].onfocus = function () {
                // 排除其他的方法:将所有的项包含自己都设置为默认样式
                // 遍历数组,让所有的样式恢复默认
                for (var j = 0 ; j < txts.length ; j++) {
                    txts[j].style.backgroundColor = "";
                }
                // 设置元素自己高亮显示
                // 保留自己的特殊样式
                // this 指代事件源自己
                this.style.backgroundColor = "yellow";
            };
        }
    </script>
</body>
</html>

元素属性操作基本应用案例四:设置元素的大小和位置案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div{
            width: 100px;
            height: 100px;
            background-color: pink;
        } 
        .new {
            position: absolute;
            width: 200px;
            height: 200px;
            left: 200px;
            top: 200px;
        }       
    </style>
</head>
<body>
    <input type="button" value="按钮" id="btn">
    <div id="box"></div>
    <script src="common.js"></script>
    <script>
        //获取元素
        var btn = my$("btn"); 
        var box = my$("box"); 
        // 添加事件
        btn.onclick = function () {
            // 修改类名
            // box.className = "new";
            // 修改 style 样式对象中的属性
            box.style.width = "200px";
            box.style.height = "200px";
            box.style.left = "200px";
            box.style.top = "200px";
            box.style.position = "absolute";
        };
    </script>
</body>
</html>

## 元素属性操作基本应用案例五:表格隔行变色和高亮显示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        td{
            width: 100px;
            height: 40px;
        }
    </style>
</head>
<body>
    <table border="1" style="border-collapse: collapse;">
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
        </tr>
    </table>
    <script>
        // 获取所有的行
        var trs = document.getElementsByTagName("tr");
        // 1.隔行变色
        for (var i = 0; i < trs.length ; i++) {
            // 下标为偶数的行显示粉色
            // 下标为奇数的行显示灰色
            if (i % 2 == 0) {
                trs[i].style.backgroundColor = "pink";
            } else {
                trs[i].style.backgroundColor = "lightgray";
            }
            // 2.鼠标移上高亮显示,鼠标离开恢复默认
            // 全局变量
            var bgc;
            // 鼠标移上高亮显示
            trs[i].onmouseover = function () {
                // 定义变量记录 tr 原来的颜色
                bgc = this.style.backgroundColor;
                this.style.backgroundColor = "skyblue";
            };
            // 鼠标离开恢复默认
            trs[i].onmouseout = function () {
                this.style.backgroundColor = bgc;
            };
        }
    </script>
</body>
</html>

元素属性操作基本应用案例六:tab选项卡切换


<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        * {margin:0; padding: 0;}
        ul {
            list-style-type: none;
        }
        .box {
            width: 400px;
            height: 300px;
            border: 1px solid #ccc;
            margin: 100px auto;
            overflow: hidden;
        }
        .hd {
            height: 45px;
        }
        .hd span {
            display:inline-block;
            width: 90px;
            background-color: pink;
            line-height: 45px;
            text-align: center;
            cursor: pointer;
        }
        .hd span.current {
            background-color: skyblue;
        }
        .bd div {
            height: 255px;
            background-color: skyblue;
            display: none;
        }
        .bd div.current {
            display: block;
        }
    </style>

</head>
<body>
    <div class="box">
        <div class="hd" id="hd">
            <span class="current">体育</span>
            <span>娱乐</span>
            <span>新闻</span>
            <span>综合</span>
        </div>
        <div class="bd" id="bd">
            <div class="current">我是体育模块</div>
            <div>我是娱乐模块</div>
            <div>我是新闻模块</div>
            <div>我是综合模块</div>
        </div>
    </div>
    <script src="common.js"></script>
    <script>
        // 获取元素
        var hd = my$("hd");
        var spans = hd.getElementsByTagName("span");
        var bd = my$("bd");
        var divs = bd.getElementsByTagName("div");
        // 鼠标移上某个 span 让它添加一个类名,其他的失去类名
        for (var i = 0 ; i < spans.length ; i++) {
            // 给每一个 span 元素添加一个新的属性,记录自己在数组中的下标
            spans[i].index = i;
            spans[i].onmouseover = function () {
                // console.dir(this);
                // 1.让 span 自己进行切换
                // 排他思想:
                // 排除其他
                for (var j = 0; j < spans.length ; j++) {
                    spans[j].className = "";
                    // 由于 divs 中数据个数与 spans 一样,所以可以再同一个遍历循环中,进行排他操作
                    divs[j].className = "";
                }
                // 保留自己
                this.className = "current";
                // console.log(this.index);
                // 2.让 bd 中的 div 也对应进行切换
                // 对应控制思想:有两组数据中存储了相同个数的元素对象,一组对象的变化,会引起另外一组的变化
                // 实现方法:找两个数据中的共同点,两个数组中元素对象的下标是一样的
                // 对应控制中也会涉及到排他的操作
                // 保留 div 自己的类名
                divs[this.index].className = "current";
            };
        }

    </script>
</body>
</html>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容