10、DOM

89 阅读3分钟

1、DOM

 文档对象模型 document  Object Model
 提供操作html文档,html标签元素的能力

    document文档对象
       window.document

    属性和方法
     方法
       1. 获取标签元素的方法(兼容性更好)
           getElementById('title')
              唯一元素       
           getElementsByClassName()
              => 类数组(伪数组)
                类数组 和 数组Array区别
                  1. 类数组不能使用Array的常用方法
                       push   pop  
                  2. 类数组可以遍历,可使用[]访问元素
            getElementsByTagName()
                标签名
            getElementsByName

        2. querySelector 和 querySelectorAll (推荐使用,兼容问题现很少)
           
            querySelector()
              css选择器
              2.1 基本选择器 
                  id  class 标签
              2.2 层级选择器
                  子代选择器  后代选择器
                  M > N   M N
                  兄弟选择器
                  M ~ N  M + n
              2.3 伪类选择器
                  M N:nth-child(n)
              2.4 属性选择器
                   input[name]
                   input[name='username']
           
 // 法一
     function test(){
        var h2Ele=document.getElementById('title')   //通过id名,唯一获取对应标签内容 
        console.log(h2Ele) 
        var divEles=document.getElementsByClassName('d1')     //通过类名获取对应标签内容,形成类数组(伪数组)
        console.log(divEles);
        for(var i=0;i<divEles.length;i++){
            console.log(divEles[i]);
        }
        var inputEles=document.getElementsByTagName('input')    //通过标签名获取对应标签内容
        console.log(inputEles);
        for(var i=0;i<inputEles.length;i++){
            console.log(inputEles[i].name);
        }
    }
    test()
 // 法二  querySelector 和 querySelectorAll 可用于层级选择器
    function test1(){
        var h2Ele=document.querySelector('h2')
        console.log(h2Ele)
        var divEles=document.querySelector('.d1')
        console.log(divEles)
        var inputEles=document.querySelectorAll('input')
        for(var i=0;i<inputEles.length;i++){
                console.log(inputEles[i].name);
        }
        }

2、DOM 操作元素内容

1. 作用
       2. 获取标签元素
            getElement系列
                getElementById
                getElementsByClassName
                getElementsByTagName
                getElementsByName

            querySelector系列
                querySelector  
                   只返回一个元素
                querySelectorAll 
                   返回所有元素存储在类数组里面
        3. 类数组和数组Array区别
           
        4. 操作内容  操作样式  操作属性  操作事件

            操作内容
               var h2Ele = document.querySelector('#title')
               h2Ele.innerHTML  // 获取内容
               h2Ele.innerHTML = '新内容'  // 设置内容

               innerText 获取内容

               innerText 和 innerHTML 区别:
                 1. innerText 以纯文本形式显示
                      <h3>innerText设置的内容</h3>
                 2. innerHTML 
               
               value  表单元素内容
               <input type="text"/>

               操作非表单元素 innerText 和 innerHTML 
               操作表单元素  value
               
               
    function test1(){
        var h2Ele = document.querySelector('#title')
        h2Ele.innerHTML = '<h3>innerText设置的内容</h3>'      //引号内的标签就是html中的标签效果显示在页面上
        // h2Ele.innerText = '<h3>innerText设置的内容</h3>'    //引号内内容全部显示在页面上
    }
    // test1()
    function test2(){
        var inputEle = document.querySelector('input[name="message"]')    //获取标签内的元素,引号为单双混合,外单则内双,内双则外单
        inputEle.value = 'jack'
        console.log( inputEle.value )
    }
    test2()

3、dom操作样式

 使用js代码动态操作样式
      1. 行间样式 style
      
          ele.style.样式名
             =>样式值
          ele.style.样式名 = 样式值   
          //js中样式值为字符串,需加引号  操作样式名需用驼峰命令 如 font-size  -> fontSize

      2. 类样式
           ele.className=类名
              注: 后面的类名会覆盖前面的类名
           赋多个类名用
           ele.className= '类名1 类名2 '  
           或
           ele.classList.add(类名1)
           ele.classList.add(类名2)
            即为  '类名1 类名2 '

           获取非行间样式
              window.getComputedStyle(元素).样式名
                 =>样式值
  练习
      function getClasss(){
             //获取h3的非行间样式
            var h3Ele=document.querySelector('h3')
            var h3w=window.getComputedStyle(h3Ele).width
            console.log('w:',h3w);     
             //添加类名d1,d2     
            var divEle=document.querySelector('div')
            // divEle.classList.add('.d1')
            // divEle.classList.add('.d2')     
            divEle.className='.d1 .d2'
            //获取h2标签的行内样式
            var h2Ele=document.querySelector('h2')
            var colorValue=h2Ele.style.color  //行内式
            var pEle=document.querySelector('p')
            pEle.innerHTML=colorValue
            // 更改h2字体大小为24px 
            h2Ele.style.fontSize='44px'     // js代码操作样式名, 样式名用驼峰命令 font-size  -> fontSize
            h2Ele.style.background='skyblue'
        }
        getClasss()

4、dom操作样属性

操作属性
       js代码动态获取属性值或设置属性
    1. 获取属性值
         ele.getAttribute(属性名)
           => 属性值
        ele.属性   必须是本身拥有的属性 不能是自己随便设的a,b等属性
           =>属性值
   2. 设置属性
        ele.setAttribute(属性名,属性值)    / 添加几个设置几次
        ele.属性名 = 属性值
   3. 删除属性
        ele.removeAttribute(属性名)
   4. data-属性名
         ele.dataset.属性名 
 练习
   function Attr(){
        //获取h4中自定义属性score
        var h4Ele=document.querySelector('h4')
        var index=h4Ele.dataset.score
        console.log(index);
        //删除h2中的a属性
        var h2Ele=document.querySelector('h2')
        h2Ele.removeAttribute('a')
        //在h3中添加 id="title" class="d1" 只能分次设置
        var h3Ele=document.querySelector('h3')
        h3Ele.setAttribute('id','title')
        h3Ele.setAttribute('class','d1')
        //将图片2地址设置为06练习岛上书店的地址
        //html中html有多个,获取元素表现为类数组,,取第几个在后面加索引下标即可
        var imgEle=document.querySelectorAll('img')[1]  
        // imgEle.setAttribute('src','./06练习岛上书店/images/11239.png')  
        imgEle.src='./06练习岛上书店/images/11239.png'
    }
    Attr()

4、dom操作事件

 操作事件
    给元素绑定点击事件
    直接给元素添加onclick属性实现
 绑定事件
    1. 属性事件
    2. 元素和事件行为分离
 示例
   //点击button出现弹框
   var btn=document.querySelector('button')
   btn.onclick=function(){
       alert('绑定事件')
   }
   //点击div更改页面内容
   var divEle=document.querySelector('div')
   divEle.onclick=function(){
   divEle.innerHTML='今天是周六'
   }

5、dom练习

 1、练习岛上书店
  /*  1、点击换换名称按钮,更换书名
          1. 绑定点击事件
          2. 更改名内容 */
    function onUpdateBookName(){
        var divEle=document.querySelector('#book')
        divEle.innerHTML='书名:更名内容'
    }
     /* 2、点击input内容按钮,将所有input按钮内容值拼接成字符串设置给p标签作为内容显示
          1. input内容按钮点击事件
          2. 将所有input标签内容值拼接成字符串
          3. 操作p标签内容 */
    function onShowInput(){
       var inputEles=document.querySelectorAll('input')
       var str=''   //再次点击可清空前面的str
       for(var i=0;i<inputEles.length;i++){
        str+=inputEles[i].value+' '
       }
       var pEle=document.querySelector('#replace')
       pEle.innerHTML=str
    }
      /* 3、 点击四季名称按钮,拼接四季名称显示 */ 
     function onSeason() {
      var seasonEle=document.querySelector('#replace')
      var inputSeasonEle=document.querySelectorAll('input[name="season"]')
      var str=''
      for(var i=0;i<inputSeasonEle.length;i++){
        str+=inputSeasonEle[i].value+' '
      }
      seasonEle.innerHTML=str
    }
      /* 4、清空页面内容  */
    function onClear() {
        document.write('')
    }

2、实现下图效果

image.png

   <style>
    *{
         padding:0;
         margin:0;
     }
     .container{
         margin: 100px;
         width: 303px;
         height: 300px;
     }
     .top{
         display: flex;
     }
    .top>div{
         width: 100px;
         height: 100px;
         background: skyblue;
         border-right: 1px solid pink;
         text-align: center;
         line-height: 100px;
         color: white;
         font-size: 40px;
     }
     div:hover{
          cursor: pointer;
     }
     .container .active{
         background: orange;
     }
     .bottom{
         width: 303px;
         height: 200px;
         background: purple;
         text-align: center;
         line-height: 200px;
         color: white;
         font-size: 80px;
     }
 </style>
 </head>
 <body>
 <div class="container">
     <div class="top">
         <div>1</div>
         <div>2</div>
         <div>3</div>
     </div>
     <div class="bottom">1</div>
 </div>
 <script>
   /* 1. 确定选中的选项
        1.1 属性事件,传参,参数是选中选项下标
        2. 清除原来选中效果
           for(var i = 0; i < div.length; i++){
              div[i].className = ''
             }
        3. 设置当前选项选中效果  
            currentDiv.className = 'active' */
     var divEles=document.querySelectorAll('.top>div')
     var divElesb=document.querySelector('.bottom')
     //
     for(let i=0;i<divEles.length;i++){
        //选项i循环完后会固定是3,要表示当前点击的选项元素
        //将 var i换成let i或者将下面的divEles[i]换成this解决这一问题
         divEles[i].onclick=function(){
             for(let j=0;j<divEles.length;j++){
                 divEles[j].className=''
             }
             divEles[i].className='active'
             divElesb.innerHTML=i+1
         }
     }
 </script>