# 排它思想

排它思想:排除所有人(包括自己),然后设置自己。在很多地方都有运用到排他思想。

# - 第一个按钮背景颜色为红色

  • 效果:

  • 代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>第一个按钮背景颜色为红色-前端猫</title>
      <style>
        *{
          padding:0;
          margin:0;
        }
        button{
          padding:5px;
          margin:5px;
        }
        button.active{
          background: red;
        }
      </style>
    </head>
    <body>
    <div>
      <button>体育新闻</button>
      <button>娱乐新闻</button>
      <button>财经新闻</button>
    </div>
    </body>
    <script>
      var btn = document.querySelector("button");
      btn.onclick = function(){
        btn.classList.add("active");
      }
    </script>
    </html>
    

# - 点击任一按钮,所有为红色

  • 效果:

  • 代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>点击任一按钮,所有为红色 - 前端猫</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        button {
            padding: 5px;
            margin: 5px;
        }

        button.active {
            background: red;
        }
    </style>
</head>
<body>
<div>
    <button>体育新闻</button>
    <button>娱乐新闻</button>
    <button>财经新闻</button>
</div>
</body>
<script>
    // 方案1 - 依次为按钮增加事件
    // var btns = document.querySelectorAll("button");
    // btns[0].onclick = function(){
    //     btns.forEach(function (item){
    //       item.className = "active";
    //     })
    // }
    // btns[1].onclick = function(){
    //   btns.forEach(function (item){
    //     item.className = "active";
    //   })
    // }
    // btns[2].onclick = function(){
    //   btns.forEach(function (item){
    //     item.className = "active";
    //   })
    // }

    // 方案2- 通过forEach为按钮增加事件
    // var btns = document.querySelectorAll("button");
    // btns.forEach(function (item){
    //    item.onclick = function(){
    //       // 将所有的按钮增加上active
    //      btns.forEach(function (item){
    //          item.className = "active";
    //      })
    //    }
    // })

    // 方案3- 通过for为按钮增加事件
    var btns = document.querySelectorAll("button");
    for (var i = 0; i < btns.length; i++) {
      // 增加事件
      btns[i].onclick = function () {
        for (var j = 0; j < btns.length; j++) {
          btns[j].className = "active";
        }
      }
    }
</script>
</html>

# - 点击按钮为红色,清除其它

  • 效果

  • 代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>只让点击的按钮为红色,其它按钮没有背景颜色 - 前端猫</title>
        <style>
            *{
                padding:0;
                margin:0;
            }
            button{
                padding:5px;
                margin:5px;
            }
            button.active{
                background: red;
            }
        </style>
    </head>
    <body>
    <div>
        <button>体育新闻</button>
        <button>娱乐新闻</button>
        <button>财经新闻</button>
    </div>
    </body>
    <script>
        // 1-forEach  -->this保留自己
        // // 获得所有按钮
        // var btns = document.querySelectorAll("button");
        // // 为所有按钮增加上单击事件
        // btns.forEach(function (item){
        //     item.onclick = function(){
        //         // 将当前点击的按钮背景颜色变为红色(增加class,属性值为active)
        //         // 将其余的按钮背景颜色移除掉。
        //         // console.log(this);// this代表当前点击的按钮。
        //         btns.forEach(function (item){
        //             item.className = null;// 将所有按钮的背景去掉。
        //         })
        //         this.className = "active";// 保留当前点击按钮的背景
        //     }
        // })
        
        // 排它思想:干掉其它,保留自己
        // 2- forEach
        var btns = document.querySelectorAll("button");
        btns.forEach(function (item,index){
            item.onclick = function(){
                btns.forEach(function (item){
                    item.className = null;
                })
                // item.className="active";//保留自己
                // console.log(index);//
                // btns[index].className = "active";// 保留自己
            }
        })  
    </script>
    </html>
    

# - 借助中间值完成功能

  • 效果

  • 代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>排它思想优化-前端猫</title>
        <style>
            *{
                padding:0;
                margin:0;
            }
            button{
                padding:5px;
                margin:5px;
            }
            button.active{
                background: red;
            }
        </style>
    </head>
    <body>
    <div>
        <button>体育新闻</button>
        <button>娱乐新闻</button>
        <button>财经新闻</button>
    </div>
    </body>
    <script>
        // // 方案1-for
        // var btns = document.querySelectorAll("button");
        // // 将选中的按钮的下标进行记录。
        // var activeIndex = -1;// -1说明未点击过任何按钮。
        // // 为按钮增加单击事件
        // for(var i=0;i<btns.length;i++){
        //     btns[i].dataset.index = i;
        //     btns[i].onclick = function(){
        //         // 将当前选择的按钮背景颜色设置为null
        //         if(activeIndex>-1) btns[activeIndex].className =null;
        //
        //         // 将当前点击的按钮的下标作为activeIndex的值。
        //         activeIndex = this.dataset.index/1;
        //         btns[activeIndex].className = "active";
        //     }
        // }
    
        // 方案2-forEach
        var btns = document.querySelectorAll("button");
        var activeIndex = -1;
        btns.forEach(function (item,index){
            item.onclick = function(){
                if(activeIndex>-1) btns[activeIndex].className = null;
                activeIndex = index;// 更改为点击按钮的下标
                btns[activeIndex].className = "active";
            }
        })
    </script>
    </html>
    

# - 完成切换功能

# - 乞丐版切换功能

  • 效果

  • 代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>乞丐版切换-前端猫</title>
        <style>
            *{
                padding:0;
                margin:0;
            }
            #root {
                width: 500px;
                margin:0px auto;
            }
            #root button{
                padding:5px;
                margin:5px;
            }
            #root div{
                width: 500px;
                height: 200px;
                border:1px solid yellow;
            }
    
        </style>
    </head>
    <body>
    <div id="root">
        <button>娱乐新闻</button>
        <button>体育新闻</button>
        <button>财经新闻</button>
        <div>娱乐新闻列表</div>
        <div>体育新闻列表</div>
        <div>财经新闻列表</div>
    </div>
    </body>
    <script>
        var btns = document.querySelectorAll("#root button");
        var divs = document.querySelectorAll("#root div");
        // 当前选中的下标
        var activeIndex = 0;
        // 1 让按钮当中的娱乐新闻背景为红色
        // 2 让除了娱乐新闻以外的div隐藏
        // 3 为按钮增加事件
        divs.forEach(function (item,index){
            item.style.display = "none";
            btns[index].onclick = function(){
                // 将当前选中的下标对应的按钮移除背景色
                btns[activeIndex].style.background = null;
                divs[activeIndex].style.display = "none";
                // 将当前点击按钮的下标更新至activeIndex
                activeIndex = index;
                // 更新当前按钮的颜色
                btns[activeIndex].style.background = "red";
                divs[activeIndex].style.display = "block"
            }
        })
        btns[activeIndex].style.background = "red";
        divs[activeIndex].style.display = "block";
    </script>
    </html>
    

# - 乞丐版切换优化

  • 效果

  • 代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>乞丐版切换优化-前端猫</title>
        <style>
            *{
                padding:0;
                margin:0;
            }
            #root {
                width: 500px;
                margin:0px auto;
            }
            #root button{
                padding:5px;
                margin:5px;
            }
            #root div{
                width: 500px;
                height: 200px;
                border:1px solid yellow;
            }
        </style>
    </head>
    <body>
    <div id="root">
        <button>娱乐新闻</button>
        <button>体育新闻</button>
        <button>财经新闻</button>
        <div>娱乐新闻列表</div>
        <div>体育新闻列表</div>
        <div>财经新闻列表</div>
    </div>
    </body>
    <script>
        var btns = document.querySelectorAll("#root button");
        var divs = document.querySelectorAll("#root div");
        // 当前选中的下标
        var activeIndex = 0;
        // 1 让按钮当中的娱乐新闻背景为红色
        // 2 让除了娱乐新闻以外的div隐藏
        // 3 为按钮增加事件
        divs.forEach(function (item,index){
            hide(index);// 调用hide函数
            btns[index].onclick = function(){
                // 将当前选中的下标对应的按钮移除背景色
                hide();
                // 将当前点击按钮的下标更新至activeIndex
                activeIndex = index;
                // 更新当前按钮的颜色
                show();
            }
        })
        show();
        function show(){
            // 显示DIV,添加按钮背景颜色
            btns[activeIndex].style.background = "red";
            divs[activeIndex].style.display = "block"
        }
        function hide(index=activeIndex){
            // 隐藏DIV,去除按钮背景颜色
            btns[index].style.background = null;
            divs[index].style.display = "none";
        }
    </script>
    </html>
    

# - 增加不同背景颜色

  • 效果

  • 代码

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>为不同的新闻增加不同的背景颜色-前端猫</title>
        <style>
            * {
                padding: 0;
                margin: 0;
            }
    
            #root {
                width: 500px;
                margin: 0 auto;
            }
    
            #root button {
                padding: 5px;
                margin: 5px;
            }
    
            #root div {
                width: 500px;
                height: 200px;
                border: 1px solid yellow;
            }
        </style>
    </head>
    <body>
    <div id="root">
        <button>娱乐新闻</button>
        <button>体育新闻</button>
        <button>财经新闻</button>
        <div>娱乐新闻列表</div>
        <div>体育新闻列表</div>
        <div>财经新闻列表</div>
    </div>
    </body>
    <script>
        var btns = document.querySelectorAll("#root button");
        var divs = document.querySelectorAll("#root div");
        // 1- 设置数组保存颜色
        var arrColor = ["red", "green", "blue"]
        var activeIndex = 0;// 当前选中的下标
        divs.forEach(function (item, index) {
            hide(index);
            btns[index].onclick = function () {
                hide();
                activeIndex = index;
                show();
            }
        })
        show();
    
        function show() {
            // 2-以上两行代码可以写成如下一行:
            btns[activeIndex].style.background = divs[activeIndex].style.background = arrColor[activeIndex];
            divs[activeIndex].style.display = "block"
        }
    
        function hide(index = activeIndex) {
            btns[index].style.background = null;
            divs[index].style.display = "none";
        }
    </script>
    </html>
    

# - 增加数据

  • 效果

  • 代码

    • data/index.js

      var data = [
          {
              typeTitle:"娱乐新闻",
              newsList:[
                  {
                      newsTitle:"《知否》女演员施诗与一男子同回公寓 疑恋情曝光",
                      newsHref:"https://www.163.com/ent/article/H3IE1RMG00038FO9.html"
                  },
                  {
                      newsTitle:"任达华女儿坐游艇穿短裙秀身材,曾华倩儿子点赞",
                      newsHref:"https://www.163.com/dy/article/H3G6Q59Q0552L9ZC.html"
                  }
              ]
          },{
              typeTitle: "体育新闻",
              newsList:[
                  {
                      newsTitle:"湖人遭鹈鹕23分逆转 欧文主场首秀篮网负黄蜂",
                      newsHref:"https://sports.163.com/nba/"
                  },
                  {
                      newsTitle:"詹皇39+9+5关键时刻却4中0 23分优势全被浪费",
                      newsHref:"https://www.163.com/sports/article/H3HMF61K0005877U.html"
                  }
              ]
          },{
              typeTitle: "财经新闻",
              newsList:[
                  {
                      newsTitle:"中国老年人婚恋:相亲积极 但再婚之路不那么平坦",
                      newsHref:"https://www.163.com/dy/article/H3HGOGTA0514R9OJ.html"
                  },
                  {
                      newsTitle:"近千亿巨头董事长:80%中国燃油车品牌将关停并转",
                      newsHref:"https://www.163.com/dy/article/H3HBCESV0519D3V1.html"
                  }
              ]
          }
      ]
      
    • html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>增加数据-前端猫</title>
          <style>
              * {
                  padding: 0;
                  margin: 0;
              }
      
              #root {
                  width: 500px;
                  margin: 0 auto;
              }
      
              #root button {
                  padding: 5px;
                  margin: 5px;
              }
      
              #root div {
                  width: 500px;
                  height: 300px;
                  border: 1px solid yellow;
              }
      
          </style>
      </head>
      <body>
      <div id="root">
      
      </div>
      </body>
      <script src="data/index.js"></script>
      <script>
          var root = document.querySelector("#root");
          // 初始化按钮
          root.innerHTML = data.map(function (item) {
              return `
                  <button>${item.typeTitle}</button>
              `
          }).join("");
      
          // 初始化DIV
          root.innerHTML += data.map(function (item) {
              var str = item.newsList.map(function (info) {
                  return `
                      <p><a href="${info.newsHref}">${info.newsTitle}</a></p>
                  `
              }).join("");
              return `
                  <div>${str}</div>
              `
          }).join("");
      
      
          var btns = document.querySelectorAll("#root button");
          var divs = document.querySelectorAll("#root div");
          var arrColor = ["red", "green", "skyblue"]
          var activeIndex = 0;// 当前选中的下标
          divs.forEach(function (item, index) {
              hide(index);
              btns[index].onclick = function () {
                  hide();
                  activeIndex = index;
                  show();
              }
          })
          show();
      
          function show() {
              btns[activeIndex].style.background = divs[activeIndex].style.background = arrColor[activeIndex];
              divs[activeIndex].style.display = "block"
          }
      
          function hide(index = activeIndex) {
              btns[index].style.background = null;
              divs[index].style.display = "none";
          }
      </script>
      </html>
      

# - 构造函数版

  • 效果

  • 代码

    • lib/Tag.js

      function Tag(options={}){
          this.btns = document.querySelectorAll("#"+(options.el || "root")+" button");
          this.divs = document.querySelectorAll("#"+(options.el || "root")+" div");
          this.arrColor =options.arrColor || ["red","green","blue"];
          this.activeIndex = options.activeIndex || 0;// 当前选中的下标
          this.init();
      }
      Tag.prototype.init = function(){
          this.divs.forEach(function (item,index){
              this.hide(index);
              this.btns[index].onclick = function(){
                  this.hide();
                  this.activeIndex = index;
                  this.show();
              }.bind(this)
          }.bind(this))
          this.show();
      }
      Tag.prototype.show = function(){
          this.btns[this.activeIndex].style.background = this.divs[this.activeIndex].style.background =this.arrColor[this.activeIndex];
          this.divs[this.activeIndex].style.display = "block"
      }
      Tag.prototype.hide = function(index=this.activeIndex){
          this.btns[index].style.background = null;
          this.divs[index].style.display = "none";
      }
      
    • html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>构造函数版切换-前端猫</title>
          <style>
              *{
                  padding:0;
                  margin:0;
              }
              #root,#one {
                  width: 500px;
                  margin:0px auto;
              }
              #root button,#one button{
                  padding:5px;
                  margin:5px;
              }
              #root div,#one div{
                  width: 500px;
                  height: 200px;
                  border:1px solid yellow;
              }
      
          </style>
      </head>
      <body>
      <div id="root">
          <button>娱乐新闻</button>
          <button>体育新闻</button>
          <button>财经新闻</button>
          <div>娱乐新闻列表</div>
          <div>体育新闻列表</div>
          <div>财经新闻列表</div>
      </div>
      <hr/>
      <div id="one">
          <button>中国新闻</button>
          <button>日本新闻</button>
          <button>韩国新闻</button>
          <div>中国新闻列表</div>
          <div>日本新闻列表</div>
          <div>韩国新闻列表</div>
      </div>
      </body>
      <script src="lib/Tag.js"></script>
      <script>
          // 构造函数:通过构造函数可以实例化对象。
          // 1- 将面向过程的变量作为构造函数的实例属性
          // 2- 将面向过程的函数作为构造函数的原型方法。
          new Tag({
              activeIndex:1,
          });
      
          new Tag({
              el:"one",
              arrColor:["gold","pink","yellow"]
          })
      </script>
      </html>