• js day09 数组的迭代方法 DOM 节点的操作(获取,创建,删除等)


    一, 数组的迭代方法

    1, forEach()

    用来循环遍历数组,和for循环是一样的

    // 语法:
    //     数组.array.forEach(function(数组元素,下标,原数组){
    //         // 循环遍历的代码块
    //     });
    
    arr.forEach(function (value, index, arr) {
        // console.log(value);
        // console.log(index);
        // console.log(arr);
    })
    

    2, some

    针对数组的元素做一个检测,只有有一个元素结果为true,返回就是true

    语法:

    // 语法:
    //     数组.array.some(function(数组元素,下标,原数组){
    //         // 循环遍历的代码块
    //     });
    
    var arr = [2, 3, 4, 5];
    
    var n = arr.some(function(value,index,arr){
        return value > 30;
    })
    console.log(n); // 结果是一个布尔值  
    

    3, every

    针对数组的元素做一个检测,只有有一个元素结果为false,返回就是false

    // 语法:
    //     数组.array.every(function(数组元素,下标,原数组){
    //         // 循环遍历的代码块
    //     });
    
    var m = arr.every(function(value,index,arr){
        return value > 1;
    })
    console.log(m);
    

    4, filter

    针对数组做一个检测,返回的是满足条件的,以数组的形式返回

    语法:

    // 语法:
    //     数组.array.filter(function(数组元素,下标,原数组){
    //         // 循环遍历的代码块
    //     });
    
    var h = arr.filter(function(value,index,arr){
        return value > 3
    })
    console.log(h);
    
    价格区间搜索 商品名搜索
    // 利用新增数组方法操作数据
    var data = [{
        id: 1,
        pname: '小米',
        price: 3999
    }, {
        id: 2,
        pname: 'oppo',
        price: 999
    }, {
        id: 3,
        pname: '荣耀',
        price: 1299
    }, {
        id: 4,
        pname: '华为',
        price: 1999
    },];
    
    // 获取元素
    var tbody = document.querySelector('tbody');
    var searchPrice = document.querySelector('.search-price'); // 搜索
    var start = document.querySelector('.start'); // 最低价格
    var end = document.querySelector('.end'); //  最高价格
    var searchPro = document.querySelector('.search-pro');
    var product = document.querySelector('.product')
    
    // 渲染数据
    setDate(data)
    function setDate(myData) {
        tbody.innerHTML = '';
        myData.forEach(function (value) { // value = {id:1,pname:'小米',price:2}
            tbody.innerHTML += '<tr><td>' + value.id + '</td><td>' + value.pname + '</td><td>' + value.price + '</td></tr>'
    
        })
    }
    // 根据价格区间搜索商品
    searchPrice.onclick = function () {
        var newDate = data.filter(function (value) {
            // value.price:数据价格 start.value:用户输入的最低价格  end.value:用户输入的最高价格 
            return value.price >= start.value && value.price <= end.value;
        })
        // 更新数据
        setDate(newDate)
    }
    
    // 根据商品名称查询商品
    // some  
    searchPro.onclick = function () {
        var arr = [];
        data.some(function (value) {
            if (value.pname === product.value) {
                arr.push(value);
            }
        })
        setDate(arr);
    }
    
    

    二, DOM

    dom 是w3c组织制定的可以处理可扩展的标记语言的一种标准的编程接口

    可以通过这些DOM接口,改变页面的结构或者内容以及样式,可以创建标签或者删除标签

    DOM树

    其实就是对节点进行操作

    节点:页面中的标签,文本,视屏都可以称为节点,节点用Node表示

    元素节点:用element表示元素节点

    节点获取

    节点名称:nodeName 返回值是一个大写的标签名

    节点属性:nodeValue 如果不是设置属性,返回值一般是null

    节点类型:nodeType (1 元素节点 2 属性节点 3 文本节点)

    var pt = document.querySelector('input').getAttributeNode('name');
    
    console.log(ul.nodeName); // UL  
    console.log(ul.nodeType); //  1
    console.log(ul.nodeValue); // null 
    
    console.log(pt.nodeName); // INPUT  
    console.log(pt.nodeType); // 1 
    console.log(pt.nodeValue); // username  
    
    父节点

    语法:parentNode

    可以获取元素的父节点(直接父节点),如果没有,返回null

    // 获取父节点
    var p = document.querySelector('p');
    // 获取直接的父节点
    // console.log(p.parentNode); // 常用 
    // 获取有定位属性的父节点,如果没有,那就是body
    console.log(p.offsetParent);
    
    子节点

    1、元素.childNodes 这个获取的是一个元素节点的集合(子元素节点,文本节点,属性节点)

     console.log(ul.childNodes[0].nodeType); // text
    

    2、元素.chidlren 获取到的是子节点,只能获取自己的子元素

     console.log(ul.children[0].nodeType); // li 
    

    但是childNodes是标准的,而chidlren是一个非标准的,但是所有浏览器已经支持了

    重点掌握的是chidlren,两个都是有下标的

    新浪菜单
    window.onload = function () {
    
    // 获取元素
    var nav = document.querySelector('.nav');
    var lis = nav.children; // 四个li 
    
    // 循环添加事件
    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';
        }
    }
    
    }
    

    其他节点

    获取第一个子元素节点

    // 只获取第一个子节点
    var ul = document.querySelector('ul');
    
    // firstChild:获取的是元素的第一个元素节点
    // 非标准的
    console.log(ul.firstChild); // text
    
    // firstElementChild:获取的是第一个子元素节点 
    // IE:undefined  标准浏览器
    console.log(ul.firstElementChild); // li
    ul.firstElementChild.style.background = 'red'
    
    // 兼容  可以获取到第一个子元素节点
    var firstElement = ul.firstElementChild || ul.firstChild;
    firstElement.style.background = 'red';
    console.log(firstElement);
    
    

    获取最后一个子元素节点

    // 获取最后一个子元素节点
    var ul = document.querySelector('ul');
    
    // 非标准
    console.log(ul.lastChild); // text
    // 标准
    console.log(ul.lastElementChild); // li 
    
    // 兼容
    var lastElement = ul.lastElementChild || ul.lastChild;
    
    lastElement.style.background = 'blue';
    

    获取下一个兄弟节点

    // 获取下一个兄弟节点
    var li = document.querySelector('li');
    
    // 非标准的  元素节点
    console.log(li.nextSibling); 
    // 标准的 子元素节点
    console.log(li.nextElementSibling);
    
    // 兼容
    var nextElement = li.nextElementSibling || li.nextSibling;
    

    获取上一个兄弟节点

    // 获取上一个兄弟节点
    var li = document.querySelector('li');
    
    // 非标准  元素节点
    console.log(li.previousSibling);
    // 标准的 子元素节点
    console.log(li.previousElementSibling);
    
    // 兼容
    var prElement = li.previousElementSibling || li.previousSibling;
    

    创建节点

    语法:document.createElement(标签名) 标签名需要使用引号引起来

    // 创建标签
    var li = document.createElement('li');
    
    // 推荐使用 给标签添加内容
    li.innerHTML = '内容';
    li.innerText = '文本内容';
    

    添加标签

    语法:父元素.appendChild(需要添加的元素)

    需要添加的元素:因为这个元素如果是创建的,说明是一个变量,所以不需要加引号

     ul.appendChild(li);
    

    添加多个元素

    // 获取父元素
    var ul = document.querySelector('ul');
    
    for (var i = 0; i < 4; i++) {
        // 创建li元素
        var li = document.createElement('li');
        li.innerText = '内容';
        // 添加元素
        ul.appendChild(li);
        console.log(1);
    }
    
    留言板
    /*   1、谁发生事件  button 
    2、发生什么事件  onclick 单击 
    3、干什么事  
        1、获取输入框的内容 
        2、创建li元素 
        3、把输入框的内容给创建出来的li  
        4、把li添加到ul   */
    
    // 获取元素
    var btn = document.querySelector('button'); 
    var pt = document.querySelector('input');
    var ul = document.querySelector('ul'); 
    
    // 添加事件
    btn.onclick = function(){
        // 获取输入框的内容
        var v1 = pt.value;
    
        // 创建li
        var li = document.createElement('li'); 
    
        // 赋值
        li.innerHTML = v1;
    
        // 把li给ul
       //  ul.appendChild(li);
      // 插入标签
        ul.insertBefore(li,ul.childNodes[0]);
        // 清空输入框内容
        pt.value = ''
    }
    

    插入节点

    在某一个元素后面插入一个元素

    语法:父元素.insertBefore(插入的元素,参考元素)

    var ul = document.querySelector('ul');
    
    // 创建li
    var li = document.createElement('li');
    // 添加元素
    ul.appendChild(li)
    
    // 插入元素 这是有参考标签的时候 
    ul.insertBefore(li,ul.children[0]);
    ul.insertBefore(li, ul.firstChild);
    
    // 如果没有参考标签
    ul.insertBefore(li,ul.childNodes[0]); 
    

    删除节点

    删除父元素的子元素

    // 语法:父元素.removeChild(子元素)
    
    // 获取元素
    var btn = document.querySelector('button');
    var ul = document.querySelector('ul');
    
    // 添加事件
    btn.onclick = function () {
    
        if (ul.children.length <= 0) {
            btn.disabled = true;
        } else {
            ul.removeChild(ul.children[0]);
        }
            }
    
    留言板
    /*   1、谁发生事件  button 
      2、发生什么事件  onclick 单击 
      3、干什么事  
          1、获取输入框的内容 
          2、创建li元素 
          3、把输入框的内容给创建出来的li  
          4、把li添加到ul   */
    
    // 获取元素
    var btn = document.querySelector('button');
    var pt = document.querySelector('input');
    var ul = document.querySelector('ul');
    
    // 添加事件
    btn.onclick = function () {
        if (pt.value == '') {
            alert('请输入内容,要不你就走人~~~~');
            return false;
        }
        // 获取输入框的内容
        var v1 = pt.value;
    
        // 创建li
        var li = document.createElement('li');
        // 创建a超链接
        var a = document.createElement('a');
        a.href = 'javascript:;';
        a.innerHTML = '删除';
    
        // 赋值
        li.innerHTML = v1;
    
        // 把超链接放到li标签里面
        li.appendChild(a);
        // 把li给ul
        // ul.appendChild(li);
        // 插入标签
        ul.insertBefore(li, ul.childNodes[0]);
    
        // 获取超链接 添加事件
        var as = document.querySelectorAll('a');
        // 添加事件
        for (var i = 0; i < as.length; i++) {
            as[i].onclick = function () {
                ul.removeChild(this.parentNode);
            }
        }
    
        // 清空输入框内容
        pt.value = '';
    }
    
    

    替换节点

    语法:父元素.replaceChild(替换节点,被替换的节点)

    <ul>
    <p></p>
    <li></li>
    </ul>
    
    <script>
    
    // 替换节点
    // 语法:父元素.replaceChild(替换节点,被替换的节点)
    
    var ul = document.querySelector('ul');
    
    var a = document.createElement('a');
    
    ul.replaceChild(a,ul.children[1]);
    
    
    

    克隆节点

    语法:cloneNode()

    如果没有参数,值复制元素,如果有参数true 可以复制标签和内容

    var p = document.querySelector('p');
    
    // document.body.appendChild(p.cloneNode()); 
    
    document.body.appendChild(p.cloneNode(true)); 
    
    

    属性操作

    // 属性操作
    var box = document.querySelector('div');
    
    // 只能获取原有的属性
    // console.log(box.id, box.title,box.abc);
    
    // 获取自定义属性
    console.log(box.getAttribute('abc'));
    console.log(box.getAttribute('title'));
    
    // 设置属性
    
    box.setAttribute('title','我不是标题');
    box.setAttribute('abc','我不是标题');
    
    // 删除属性
    
    box.removeAttribute('id');
    box.removeAttribute('abc')
    
  • 相关阅读:
    IE Only的userData 简单
    IE userdata 原理 应用 详解 简单
    shell命令执行顺序 简单
    Linux split命令实例 简单
    PHP中调用系统命令的system(),exec(),passthr 简单
    HTML5 LocalStorage 本地存储 简单
    linux 下查看机器配置命令 简单
    《高效能人士的七个习惯》读书笔记 简单
    poj 1042(贪心)
    poj 2485 Highways (prim)
  • 原文地址:https://www.cnblogs.com/bnzw/p/13725722.html
Copyright © 2020-2023  润新知