JS要点整理-10

102 阅读4分钟

DOM

  • DOM(Document Object Model): 文档对象模型
  • 其实就是操作 html 中的标签的一些能力
  • DOM 的核心对象就是 document 对象
  • DOM: 页面中的标签, 我们通过 JS 获取到以后, 就把这个对象叫做 DOM 对象

获取常规元素

通过 JS 代码来获取页面中的标签, 获取后我们就可以操作这些标签

querySelector

  • 语法: document.querySelector('像写CSS选择器一样书写标签')
  • 返回值: 符合条件的第一个标签
console.log(document.querySelector('div'))  // 获取页面中第一个 div 元素
console.log(document.querySelector('.box'))  // 获取页面中第一个 有 box 类名的元素
console.log(document.querySelector('#box'))  // 获取页面中第一个 id 名为 box 的元素

querySelectorAll

  • 语法: document.querySelectorAll('像写CSS选择器一样书写标签')
  • 返回值: 返回一个符合条件的标签组成的 伪数组
  • 需要用索引来获取到准确的每一个 DOM 元素
        var mySpan = document.querySelectorAll('.spanel')
        console.log(mySpan)
        // console.log(mySpan[0])

获取样式

元素/标签.style

  • 能够拿到 行内 样式, 或者给添加一个行内样式
        var oDiv = document.querySelector('div')
        console.log(oDiv.style.background-color)   // color is not defined,点语法判定-为减号
        console.log(oDiv.style.'background-color')   // 语法不支持
        console.log(oDiv.style['background-color'])  // 中括号语法 能够获取 但是稍微有点麻烦
        console.log(oDiv.style.backgroundColor) // 推荐写法  
        oDiv.style.width = '200px'
         
        var btn = document.querySelector('#btn')
        var body = document.querySelector('body')

        /**
         *  添加事件
         * 
         *      1. 声明一个数组, 数组内部存放各种各样的颜色
         *      2. 点击事件触发的时候, 随机从数组内拿到一个颜色
         *      3. 赋值给 body 的背景色
        */
        var arr = ['#000000', '#ffffff', '#ff0000', '#00ff00', '#0000ff', '#ffff00', '#800080', '#ffa500']
        btn.onclick = function () {
        var num = Math.floor(Math.random() * arr.length)
        body.style.backgroundColor = arr[num]
        }

getComputedStyle('要查询样式的标签').要查询的样式名

  • 能够获取到元素的样式 (行内和非行内都可以)
  • 但是获取到的内容是只读的, 只允许查询, 不允许修改
        console.log(getComputedStyle(newDiv).width);
        console.log(getComputedStyle(newDiv).backgroundColor);

操作元素类名

元素/标签.className

能够得到元素目前拥有的类名,还可以给这个属性重新赋值, 然后修改当前标签的类名

元素/标签.classList

  • 返回值 是一个伪数组
  • 数组内下表对应的是我们的每一个类名
  • value 属性对应的是我们完整类名的字符串
        console.log(box.className)
        box.className = 'box2'   // 当前方式 不管之前有多少类名, 全都重新覆盖掉
        box.className = box.className + ' box2'
        box.className += ' box2'    // 类名之间一定要加 空格
        box.className = ''  // 相当于清空之前的所有类名
        
        console.log(box.classList)
        box.classList.add('box2')   // 向这个标签上在追加一个类名, 原本的类名不受影响
        box.classList.remove('qwe') // 删除指定类名 
        
                var btn = document.querySelector('button')
        var out1 = document.querySelector('div')
        var btn1 = document.querySelector('.btn1')
        btn.onclick = function () {
            out1.classList.remove('close')
            out1.classList.add('show')
        }
        btn1.onclick = function () {
            out1.classList.remove('show')
            out1.classList.add('close')
        }

操作元素属性

        // 1. 获取标签属性
        console.log(box.getAttribute('class'))
        var res = box.getAttribute('qwe')
        console.log(res)
        
        // 2. 设置标签属性
        box.setAttribute('my_qwe', '这是通过 JS 添加的一个自定义属性')
        box.setAttribute('class', 'qf001')
        box.setAttribute('qwe', '通过 JS 将 qwe 的属性值 进行了一个修改')        

H5 自定义属性

  • 在 H5 自定义属性中 data- 表示该属性是一个自定义属性
  • data- 以后的内容才是属性名
  • = 后面的内容才叫做属性值
  • 每一个元素身上天生自带一个属性, 叫做 dataset, 是一个类似对象的数据结构
  • 内部记录的是该元素身上所有 data- 开头的自定义属性
  • 对于该元素 H5 自定义属性的操作, 就是对这个数据结构的操作(对象操作语法)
  • data-属性名=属性值
  • 获取:元素/标签.dataset.属性名(属性名不要带data-)
<div data-a="100" class="box"></div>

var oDiv = document.querySelector('div')
// 增
oDiv.dataset.age = 18
// 删
delete oDiv.dataset.a
// 查
console.log(oDiv.dataset.age)
//密码框(显示/隐藏)
        var inp = document.querySelector('input')
        var btn = document.querySelector('button')
        btn.onclick = function () {
            //inp.type
            inp.getAttribute('type') === 'password' ? inp.setAttribute('type', 'text') : inp.setAttribute('type', 'password')
        }
//全选
    全选:<input type="checkbox" checked>
    <hr>
    <input type="checkbox" class="inp">选项一
    <input type="checkbox" class="inp">选项二
    <input type="checkbox" class="inp">选项三
    <script>
        var inp1 = document.querySelector('input')
        var inp2 = document.querySelectorAll('.inp')
        console.dir(inp1)
        inp1.onclick = function () {
            for (i = 0; i < inp2.length; i++) {
                inp2[i].checked = inp1.checked
            }
        }
        for(j = 0; j < inp2.length; j++) {
            inp2[j].onclick = fn
        }
        function fn() {
            var num = 0
            for (k = 0; k < inp2.length; k++) {
                inp2[k].checked && num++
            }
            inp1.checked = num === 3 
        }

操作元素文本

  • innerHTML/innerText/value
    • innerHTML/innerText 能够给 输入框之外的标签 添加展示文本
    • value 是专门给 输入框添加展示文本
    • innerHTML 认识字符串中的 标签, 能够将字符串中的标签转换成真正的标签进行渲染
    • innerText 不认识字符串中的标签,能够防止用户注入恶意代码
        var p1 = document.querySelector('#p1')
        var div2 = document.querySelector('#div2')
        var inp = document.querySelector('#inp')
        var script = document.querySelector('script')
        //其他
        console.log(div2.innerHTML);
        console.log(div2.innerText);
        //inp
        inp.value = '12'
        console.log(script.innerHTML);