12前端学习之WebAPI(二):排他思想、自定义属性操作、节点操作

1. 排他思想:

在这里插入图片描述
如果有同一组元素,想要某一个元素实现某种样式, 需要用到循环的排他思想算法:

  • 所有元素全部清除样式(干掉其他人)
  • 给当前元素设置样式 (留下我自己)
  • 注意顺序不能颠倒,首先干掉其他人,再设置自己
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>
<script>
    // 1. 获取所有按钮元素
    var btns = document.getElementsByTagName('button');
    // btns得到的是伪数组  里面的每一个元素 btns[i]
    for (var i = 0; i < btns.length; i++) {
        btns[i].onclick = function() {
            // (1) 先把所有的按钮背景颜色去掉  干掉所有人
            for (var i = 0; i < btns.length; i++) {
                btns[i].style.backgroundColor = '';
            }
            // (2) 然后才让当前的元素背景颜色为pink 留下我自己
            this.style.backgroundColor = 'pink';
        }
    }
</script>

2. 案例:换肤:

在这里插入图片描述
案例分析:

  • 这个案例练习的事给一组元素注册事件;
  • 给4个小图片利用循环注册点击事件;
  • 当点击图片时, 让页面背景改为当前的图片
  • 核心算法: 把当前图片的src取过来, 给body作为背景

实现

<head>
    <title>01_背景换肤</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body {
            background: url(./images/1.jpg) no-repeat center top;
        }
        li {
            list-style: none;
        }
        .pifu {
            overflow: hidden;
            margin: 100px auto;
            background-color: #fff;
            width: 415px;
            padding-top: 3px;
        }
        .pifu li {
            float: left;
            margin: 0 1px;
            cursor: pointer;
        }
        .pifu img {
            width: 100px;
        }
        .active {
            border: 2px solid red;
        }
    </style>
    <script>
        window.onload = function() {
            // 1. 获取元素
            var imgs = document.querySelector('.pifu').querySelectorAll('img');
            //2. 循环注册事件
            for(var i = 0; i < imgs.length; i++){
                imgs[i].onclick = function() {
                    for(var j = 0; j < imgs.length; j++){
                        imgs[j].className = '';
                    }
                    this.className = "active";
                    document.body.style.backgroundImage = 'url('+ this.src +')';
                }
            }
        }

    </script>
</head>
<body>
    <ul class="pifu">
        <li><img src="./images/1.jpg" alt=""></li>
        <li><img src="./images/2.jpg" alt=""></li>
        <li><img src="./images/3.jpg" alt=""></li>
        <li><img src="./images/4.jpg" alt=""></li>
    </ul>
</body>

3. 案例:表格隔行变色

在这里插入图片描述

案例分析:

  • 用到新的鼠标事件: 鼠标经过: onmouseover; 鼠标离开:onmouseout
  • 核心思路:鼠标经过tr行, 当前行的背景颜色改变, 鼠标离开去掉当前背景颜色
  • 注意: 第一行(thead里面的行), 不需要变换颜色

实现:

<head>
    <title>02_表格变色</title>
    <style>
        table {
            width: 800px;
            margin: 100px auto;
            text-align: center;
            font-size: 14px;
            /* 合并边框 */
            border-collapse: collapse;  
        }
        thead tr {
            height: 30px;
            background-color: skyblue;
        }
        tbody tr {
            height: 30px;
        }
        tbody td {
            border-bottom: 1px solid #d7d7d7;
            font-size: 12px;
            color: blue;
        }
        .bg {
            background-color: pink;
        }
    </style>

    <script>
        window.onload = function() {
            // 1.获取元素 获取的是 tbody 里面所有的行
            var trs = document.querySelector('tbody').querySelectorAll('tr');
             // 2. 利用循环绑定注册事件
            for (var i = 0; i < trs.length; i++) {
                // 3. 鼠标经过事件 onmouseover
                trs[i].onmouseover = function() {
                        // console.log(11);
                        this.className = 'bg';
                    }
                    // 4. 鼠标离开事件 onmouseout
                trs[i].onmouseout = function() {
                    this.className = '';
                }
            }
        }
    </script>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th>代码</th>
                <th>名称</th>
                <th>最新公布净值</th>
                <th>累计净值</th>
                <th>前单位净值</th>
                <th>净值增长率</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
        </tbody>
    </table>
</body>

在这里插入图片描述

4 案例:全选:

案例需求:
在这里插入图片描述

  • 点击上面的全选复选框,下面所有的复选框都选中;
  • 再次点击全选复选框, 下面所有的复选框都不选中;
  • 如果下面的复选框全不选中,上面的全选框自动选中;
  • 如果下面的复选框有一个没有选中, 上面的全选框就不选中
  • 所有复选框在一开始默认都没有选中

案例分析:

  • 全选和取消全选的做法: 让下面的复选框的checked属性(选中状态)跟随全选按钮;
  • 下面复选框需要选中, 上面的全选才能选中的做法: 给下面的所有复选框绑定点击事件, 每次点击,都循环查看下面所有复选框的选中状态, 如果有一个没有选中, 上面的全选就不选中;
  • 可以设置一个变量,来控制全选选中;

实现:

<head>
    <title>03_全选</title>
    <style>
        * {
            margin: 0;
            padding: 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;
        }
        tbody tr{
            background-color: #f0f0f0;
        }
        tbody tr:hover {
            cursor: pointer;
            background-color: #fafafa;
        }
    </style>
    <script>
        window.onload = function() {
            // 1. 全选和取消全选做法:  让下面所有复选框的checked属性(选中状态) 跟随 全选按钮即可
            // 获取元素
            var j_cbAll = document.getElementById('j_cbAll'); // 全选按钮
            var j_tbs = document.getElementById('j_tb').getElementsByTagName('input'); // 下面所有的复选框
            // 注册事件
            j_cbAll.onclick = function() {
                    // this.checked 它可以得到当前复选框的选中状态如果是true 就是选中,如果是false 就是未选中
                    console.log(this.checked);
                    for (var i = 0; i < j_tbs.length; i++) {
                        j_tbs[i].checked = this.checked;
                    }
                }
                // 2. 下面复选框需要全部选中, 上面全选才能选中做法: 给下面所有复选框绑定点击事件,每次点击,都要循环查看下面所有的复选框是否有没选中的,如果有一个没选中的, 上面全选就不选中。
            for (var i = 0; i < j_tbs.length; i++) {
                j_tbs[i].onclick = function() {
                    // flag 控制全选按钮是否选中
                    var flag = true;
                    // 每次点击下面的复选框都要循环检查者4个小按钮是否全被选中
                    for (var i = 0; i < j_tbs.length; i++) {
                        if (!j_tbs[i].checked) {
                            flag = false;
                            break; // 退出for循环 这样可以提高执行效率 因为只要有一个没有选中,剩下的就无需循环判断了
                        }
                    }
                    j_cbAll.checked = flag;
                }
            }
        }
    </script>
</head>
<body>
    <div class="wrap">
        <table>
            <thead>
                <tr>
                    <th>
                        <input type="checkbox" id="j_cbAll" />
                    </th>
                    <th>商品</th>
                    <th>价钱</th>
                </tr>
            </thead>
            <tbody id="j_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>
    </div>
</body>

5. 自定义属性操作:

5.1 获取属性值:

  • element.属性: 获取属性值(元素本身自带的属性)
  • element.getAttribute(‘属性’); 主要是获取自定的属性(标准)
<div id="demo" index="1" class="nav"></div>
<script>
      var div = document.querySelector('div');
      // 1. 获取元素的属性值
      // (1) element.属性
      console.log(div.id);
      //(2) element.getAttribute('属性')  get得到获取 attribute 属性的意思 程序员自己添加的属性称为自定义属性 index
      console.log(div.getAttribute('id'));
      console.log(div.getAttribute('index'));
</script>

5.2 设置属性值:

  • element.属性 = 值; 主要设置内置属性
  • element.setAttribute(‘属性1’, ‘值1’); 主要是设置自定义属性
// 设置元素属性值
// (1) element.属性= '值'
 div.id = 'test';
 div.className = 'navs';
 // (2) element.setAttribute('属性', '值');  主要针对于自定义属性
 div.setAttribute('index', 2);
 div.setAttribute('class', 'footer'); // class 特殊  这里面写的就是

5.3. 移出属性:

  • element.remveAttribute(‘属性’);
//移除属性 removeAttribute(属性)    
div.removeAttribute('index');

5.4 案例: tab栏:

当鼠标点击上面相应的选项卡(tab),下面内容跟随变化;
在这里插入图片描述
案例分析:

  • tab栏切换有2个大的模块;
  • 上面的模式是选项卡, 点击某一个, 当前一个底色会是红色, 其余不变(排他思想), 修改类名的方式;
  • 下面的模块是内容, 会跟随上面的选项卡的变化,所以下面模块的变化写到点击事件中;
  • 规律: 下面的模块显示的呢日荣和上面选项卡一一对应
  • 核心思路: 给上面的tab_list里面的所有小li添加自定义属性, 属性值从0开始;
  • 当点击tab_list里面的小li时, 让tab_con里面对应的序号额度内容显示, 其余隐藏

实现:

<head>
    <title>04_tab栏</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        li {
            list-style: none;
        }
        .tab {
            width: 978px;
            margin: 100px auto;
        }
        .tab_list {
            height: 39px;
            border: 1px solid #ccc;
        }
        .tab_list li {
            float: left;
            height: 39px;
            line-height: 39px;
            padding: 0 20px;
            text-align: center;
            cursor: pointer;
        }
        .tab_list .current {
            background-color: #c81623;
            color: #fff;
        }
        .item_info {
            padding: 20px 0 0 20px;
        }
        .item {
            display: none;
        }
    </style>
    <script>
        window.onclick = function() {
            var tab_list = document.querySelector('.tab_list');
            var lis = tab_list.querySelectorAll('li');
            var items = document.querySelectorAll('.item');
            for(var i = 0; i < lis.length; i++){
                lis[i].setAttribute('index', i);
                lis[i].onclick = function(){
                    for (var j = 0; j < lis.length; j++){
                        lis[j].className = '';
                    }
                    this.className = "current";

                    var index = this.getAttribute('index');
                    // console.log(index);
                    for(var j = 0; j < items.length; j++){
                        items[j].style.display = 'none';
                    }
                    items[index].style.display = 'block';
                }
            }
        }
    </script>
</head>
<body>
    <div class="tab">
        <div class="tab_list">
            <ul>
                <li class="current">商品介绍</li>
                <li>规格与包装</li>
                <li>售后保障</li>
                <li>商品评价(50000)</li>
                <li>手机社区</li>
            </ul>
        </div>
        <div class="tab_con">
            <div class="item" style="display: block;">
                商品介绍模块内容
            </div>
            <div class="item">
                规格与包装模块内容
            </div>
            <div class="item">
                售后保障模块内容
            </div>
            <div class="item">
                商品评价(50000)模块内容
            </div>
            <div class="item">
                手机社区模块内容
            </div>
        </div>
    </div>
</body>

在这里插入图片描述

5.5. H5自定义属性:

自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。

自定义属性获取是通过getAttribute(‘属性’) 获取。

但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。

H5新增了自定义属性:

  • 设置H5自定义属性:
    H5规定自定义属性data-开头作为属性名并赋值;
例如: <div data-index="1"></div>
或者使用JS设置
element.setAttribute('data-index',2);
  • 获取H5自定义属性:
兼容性获取, element.getAttribute('data-index');
H5新增: element.dataset.index 或者 element.dataset['index'] 
 (ie11起支持)
<div getTime="20" data-index="2" data-list-name="andy"></div>
<script>
    var div = document.querySelector('div');
    // console.log(div.getTime);
    console.log(div.getAttribute('getTime'));
    div.setAttribute('data-time', 20);
    console.log(div.getAttribute('data-index'));
    console.log(div.getAttribute('data-list-name'));
    // h5新增的获取自定义属性的方法 它只能获取data-开头的
    // dataset 是一个集合里面存放了所有以data开头的自定义属性
    console.log(div.dataset);
    console.log(div.dataset.index);
    console.log(div.dataset['index']);
    // 如果自定义属性里面有多个-链接的单词,获取的时候采取 驼峰命名法
    console.log(div.dataset.listName);
    console.log(div.dataset['listName']);
</script>

6. 节点操作:

6.1. 节点概述

​网页中的所有内容都是节点(标签、属性、文本、注释等), 在DOM 中,节点使用 node 来表示
HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除

在这里插入图片描述
​ 一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性

  • 元素节点 nodeType 为 1;
  • 属性节点 nodeType 为 2;
  • 文本节点 nodeType 为 3 (文本节点包含文字、空格、换行等)

6.2. 节点层级

​ 利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系

在这里插入图片描述

6.3. 父级节点

node.parentNode
  • parentNode 属性可返回某节点的父节点 注意是最近的一个父节点;
  • 如果指定的节点没有父节点, 则返回null;
<div class="demo">
<div class="box">
       <span class="erweima">×</span>
   </div>
</div>
<script>
   // 1. 父节点 parentNode
   var erweima = document.querySelector('.erweima');
   // var box = document.querySelector('.box');
   // 得到的是离元素最近的父级节点(亲爸爸) 如果找不到父节点就返回为 null
   console.log(erweima.parentNode);
</script>

6.4. 子节点

所有子节点

parentNode.childNodes   (标准)

parentNode.childNodes返回包含指定节点的子节点的集合,该集合为即时更新的集合
注意:

  • 返回值里面包含了所有的自己诶单, 包括元素节点, 文本节点等;
  • 如果想要获取里面的元素节点, 则需要专门处理, 所以一般般不提倡使用childNodes
parentNode.children  (非标准)

parentNode.children 是一个只读属性, 返回所有子元素的阶段. 它只返回子元素节点, 其余节点不返回

虽然chilren是一个非标准, 但是得到了一个各个浏览器的支持, 因此可以放心使用

<ul>
	<li>我是li</li>
	<li>我是li</li>
 	<li>我是li</li>
 	<li>我是li</li>
</ul>
<script>
 	// DOM 提供的方法(API)获取
 	var ul = document.querySelector('ul');
 	var lis = ul.querySelectorAll('li');
 	// 1. 子节点  childNodes 所有的子节点 包含 元素节点 文本节点等等
 	console.log(ul.childNodes);
 	console.log(ul.childNodes[0].nodeType);
 	console.log(ul.childNodes[1].nodeType);
 	// 2. children 获取所有的子元素节点 也是实际开发常用的
 	console.log(ul.children);
</script>

第一次子节点:

parentNode.firstChild

firstChild返回第一个子节点, 找不到则返回null. 同样, 也是包含所有的节点

最后一个子节点

parentsNode.lastChild

lastChild返回最后一个子节点, 找不到则返回null, 同样,也是返回所有节点;

第1个元素节点:

parentNode.firstElementChild

firstElementChild返回第一个子元素节点, 找不到则返回null

最后一个元素节点

parentNode.lastElementChild

lastElementChild: 返回最后一个子元素节点, 找不到则返回null

注意:

  • 这两种方法有兼容性问题, IE9以上才支持

在实际开发中, firstChild和lastChild包含其他接地那,操作不方便, 而firstElementCHild和lastElementChild又有兼容问题, name如何获取第一个或最后一个子元素节点呢??
解决方案:

  • 如果想要第一个元素节点, 可以使用parentNode.children[0]
  • 如果想要最后一个元素节点, 可以使用parentNode.children[parentNode.children.length - 1]
<ol>
	<li>我是li1</li>
	<li>我是li2</li>
	<li>我是li3</li>
	<li>我是li4</li>
	<li>我是li5</li>
</ol>
<script>
	var ol = document.querySelector('ol');
	// 1. firstChild 第一个子节点 不管是文本节点还是元素节点
	console.log(ol.firstChild);
	console.log(ol.lastChild);
	// 2. firstElementChild 返回第一个子元素节点 ie9才支持
	console.log(ol.firstElementChild);
	console.log(ol.lastElementChild);
	// 3. 实际开发的写法  既没有兼容性问题又返回第一个子元素
	console.log(ol.children[0]);
	console.log(ol.children[ol.children.length - 1]);
</script>

6.5. 案例:新浪下拉菜单:

在这里插入图片描述
案例分析:

  • 导航栏里面的li都要有鼠标经过的效果, 所以需要循环注册鼠标事件
  • 核心原理: 当鼠标经过li里面的第二个人孩子ul显示, 当鼠标离开,则ul隐藏
    实现:
<head>
    <title>05下拉菜单</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        li {
            list-style: none;
        }
        a{
            text-decoration: none;
            font-size: 14px;
        }
        .nav {
            margin: 100px;
        }
        .nav>li {
            position: relative;
            float: left;
            width: 80px;
            height: 41px;
            text-align: center;
        }
        .nav li a {
            display: block;
            width: 100%;
            height: 100%;
            line-height: 41px;
            color: #333;
        }
        
        .nav>li>a:hover {
            background-color: #eee;
        }
        
        .nav ul {
            display: none;
            position: absolute;
            top: 41px;
            left: 0;
            width: 100%;
            border-left: 1px solid #FECC5B;
            border-right: 1px solid #FECC5B;
        }
        
        .nav ul li {
            border-bottom: 1px solid #FECC5B;
        }
        
        .nav ul li a:hover {
            background-color: #FFF5DA;
        }

    </style>
    <script>
        window.onload = function() {
            // 1. 获取元素
            var nav = document.querySelector('.nav');
            var lis = nav.children; // 得到4个小li

            // 2. 循环注册事件
            for(var i = 0; i < lis.length; i++) {
                lis[i].onmouseover = function() {
                    this.children[1].style.display = 'block';
                }
                lis[i].onmouseout = function() {
                    this.children[1].style.display = 'none';
                }
            }
        }
    </script>
</head>
<body>
    <ul class="nav">
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">评论</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">评论</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">评论</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
        <li>
            <a href="#">微博</a>
            <ul>
                <li>
                    <a href="">私信</a>
                </li>
                <li>
                    <a href="">评论</a>
                </li>
                <li>
                    <a href="">@我</a>
                </li>
            </ul>
        </li>
    </ul>
</body>

在这里插入图片描述

6.6. 兄弟节点

下一个兄弟节点

node.nextSibling

nextSibling返回当前元素的下一个兄弟节点, 找不到返回null

上一个兄弟节点

node.previousSibling

previousSibling 返回当前元素的上一个兄弟节点, 找不到返回null

<div>我是div</div>
<span>我是span</span>
<script>
    var div = document.querySelector('div');
    // 1.nextSibling 下一个兄弟节点 包含元素节点或者 文本节点等等
    console.log(div.nextSibling);
    console.log(div.previousSibling);
    // 2. nextElementSibling 得到下一个兄弟元素节点
    console.log(div.nextElementSibling);
    console.log(div.previousElementSibling);
</script>

下一个兄弟元素节点

node.nextElementSibling

nexElementtSibling返回当前元素的下一个兄弟元素节点, 找不到返回null

上一个兄弟元素节点

node.previousElementSibling

previousElementSibling 返回当前元素的上一个兄弟元素节点, 找不到返回null

注意:

  • nextElementSibling和previousElementSibling有兼容问题, IE9以上才支持

如何解决?
自己封装一个兼容性函数

function getNextElementSibling(element) {
	var el = element;
	while (el = el.nextSibling) {
	  if (el.nodeType === 1) {
	       return el;
	   }
	 }
	 return null;
}  

6.7. 创建节点:

document.createElement('tagName')

document.createElement(‘tagName’)方法创建有tagName指定HTML元素, 因为这些元素原先不存在,是根据需求动态生成的, 所有称之为动态创建元素节点.

6.8. 添加节点:

node.appendChile(child)

node.appendChile(child)方法将一个节点添加到指定父节点的子节点的末尾. 类似于css中的after伪元素.

node.insertBefore(child, 指定元素)

node.insertBefore(child, 指定元素)方法将一个节点添加到父节点的指定子节点的前面.类似于css的before伪元素

<ul>
   <li>123</li>
</ul>
<script>
    // 1. 创建节点元素节点
    var li = document.createElement('li');
    // 2. 添加节点 node.appendChild(child)  node 父级  child 是子级 后面追加元素
    var ul = document.querySelector('ul');
    ul.appendChild(li);
    // 3. 添加节点 node.insertBefore(child, 指定元素);
    var lili = document.createElement('li');
    ul.insertBefore(lili, ul.children[0]);
    // 4. 想要页面添加一个新的元素 : 1. 创建元素 2. 添加元素
</script>

6.9. 案例:简单版发布留言:

案例分析:

  • 核心思路: 点击按钮之后, 就动态的创建一个li, 添加到ul里面
  • 创建li的同时, 把文本域里面的值通过li.innerHTML赋值给li
  • 如果想要新的留言显示在后面就用appendChile,如果想要显示在前面就用insertBefore;

实现:

<head>
    <title>06_创建与添加节点</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        body {
            padding: 100px;
        }
        
        textarea {
            width: 200px;
            height: 100px;
            border: 1px solid pink;
            outline: none;
            resize: none;
        }
        
        ul {
            margin-top: 50px;
        }
        
        li {
            width: 300px;
            padding: 5px;
            background-color: rgb(245, 209, 243);
            color: red;
            font-size: 14px;
            margin: 15px 0;
        }
    </style>
    <script>
        window.onload = function() {
            // 1. 获取元素
            var btn = document.querySelector('button');
            var text = document.querySelector('textarea');
            var ul = document.querySelector('ul');

            // 2. 注册事件
            btn.onclick = function() {
                if (text.value == '') {
                    alert('您没有输入内容');
                    return false;
                } else {
                    // 创建元素
                    var li = document.createElement('li');
                    li.innerHTML = text.value;             

                    // 添加元素
                    // ul.appendChild(li);
                    ul.insertBefore(li, ul.children[0]);
                }
            }
        }
    </script>
</head>
<body>
    <textarea name="" id=""></textarea>
    <button>发布</button>
    <ul>

    </ul>
</body>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅弋、璃鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值