一些JS超级基础的知识梳理(四)

操作DOM

DOM:document object model 文档对象模型,提供一些属性和方法供我们操作页面中的元素

获取DOM元素的方法

• document.getElementById() 指定在文档中,基于元素的 ID 或者这个元素对象
• [context].getElementsByTagName() 在指定上下文(容器)中,通过标签名获取一组元素集合
• [context].getElementsByClassName() 在指定上下文中,通过样式类名获取一组元素集合 (不兼容IE6~8)
• document.getElementsByName() 在整个文档中,通过标签的 NAME 属性值获取一组节点集合 (在 IE 中只有表单元素的 NAME 才能识别,所以我们一般只应用于表单元素的处理)
• document.head / document.body / document.documentElement 获取页面中的 HEAD / BODY / HTML 三个元素
• [context].querySelector([selector]) 在指定上下文中,通过选择器获取到指定的元素对象
• [context].querySelectorAll([selector]) 在指定上下文中,通过选择器获取到指定的元素集合

创建:
document.write (会导致页面重绘的问题)
innerHTML(不使用拼接字符串,用数组拼接的话。效率比createElement高)
由于字符有不可变性,每次字符串拼接都会开辟新的内存,所以会导致效率很低。
createElement
新增:
appendChild
insertBefore
删除:
removeChild
针对于自定义属性:
setAttribute
getAttribute
removeAttribute

 <!-- <div id="haha">哈哈</div> -->
  <div class="box">
    <span>嘻嘻1</span>
  </div>

   let box1 = document.querySelector('.box');
    // 克隆第一份(深克隆)
    let box2 = box1.cloneNode(true);
    box2.querySelector('span').innerText = '嘻嘻2';
    // 克隆第二份(浅克隆)
    let box3 = box1.cloneNode(false);
    box3.innerHTML = "<span>嘻嘻3</span>";

    document.body.appendChild(box2);
    document.body.appendChild(box3);

    //===========
    // 容器.removeChild(元素)
    document.body.removeChild(box2);

// 动态创建一个DIV元素对象,把其赋给BOX
    let box = document.createElement('div');
    box.id = 'boxActive';
    box.style.width = '200px';
    box.style.height = '200px';
    box.className = 'RED';

    // 动态创建一个文本
    let text = document.createTextNode('嘻嘻');

    // 添加:容器.appendChild(元素)
    box.appendChild(text);
    // document.body.appendChild(box);

    // 放到指定元素前:容器.insertBefore([新增元素],[指定元素])
    let haha = document.getElementById('haha');
    // haha.parentNode.insertBefore(...)
    document.body.insertBefore(box, haha); 

节点

JS中的节点和描述节点之间关系的属性
节点 : Node (页面中所有的东西都是节点)
节点集合:NodeList (getElementsByName / querySelectorAll 获取的都是节点集合)

• 元素节点 (元素标签)
• nodeType:1
• nodeName : 大写的标签名
• nodeValue :null
• 文本节点
• nodeType:3
• nodeName : ‘#text’
• nodeValue :文本内容
• 注释节点
• nodeType:8
• nodeName : ‘#commen’
• nodeValue :注释内容
• 文档节点 document
• nodeType:9
• nodeName : ‘#document’
• nodeValue :null

描述这些节点之家关系的属性

• childNodes :获取所有的子节点
• children:获取所有的元素子节点(子元素标签集合)
• parent:获取父亲节点
• firstChild:获取第一个子节点
• lastChild:获取最后一个子节点
• firstElementChild / lastElementChild :获取第一个和最后一个元素子节点 (不兼容IE6~8)
• previousSibling:获取上一个哥哥节点
• nextSibling:获取下一个弟弟节点
• previousElementSibling / nextElementSibling :获取哥哥和弟弟元素节点(不兼容IE6~8)

定时器

setTimeout

// 1. setTimeout(function () {}, 时间毫秒数) 等时间到了,执行一次回调函数。返回定时器 ID;
var timerId = setTimeout(function () {
  // 这个回调函数中写你想时间到了做的事情
  console.log('没时间了');
}, 3000);
var timerId2 = setTimeout(function () {
  console.log('timer 2');
}, 4000);

console.log(timerId);
console.log(timerId2);

setInterval

// 2. setInterval(function () {}, 时间间隔毫秒数); 每隔时间间隔都执行一次回调函数;返回值也是定时 器 id;

var timerId3 = setInterval(function () {
  console.log('inteval的时间到了');
}, 1000);
console.log(timerId3);

// 定时器清除:想让定时器停止,就是清除定时器。清除定时器也有两种办法:
// 1. clearTimeout(定时器 ID) 清除 setTimeout() 设置的定时器
  clearTimeout(timerId);

// 2. clearInterval(定时器 id);清除 setInterval() 设置的定时器
  clearInterval(timerId3);

定时器都是异步编程的

写个倒计时

<style>
    #timeBox {
      margin: 20px auto;
      height: 100px;
      width: 300px;
      line-height: 100px;
      font-size: 25px;
      text-align: center;
    }
  </style>
<div id="timeBox">--:--:--</div>
var timeBox = document.getElementById('timeBox');

function countDown() {
  // 1. 计算当前时间距离目标时间的毫秒时间差
  var curDate = new Date(); // 获取当前时间
  var curStamp = curDate.getTime(); // 获取当前时间的时间戳
  var targetDate = new Date('2019-05-23 14:00:00'); // new Date() 可以把时间格式的字符串转换成标准时间格式对象。因为只有标准时间格式的对象才能调用 getTime()
  var targetStamp = targetDate.getTime(); // 获取目标时间的时间戳
  var spanStamp = targetStamp - curStamp;  // 目标时间减去当前时间的毫秒差

  // spanStamp 小于等于0,表示已经到达或者超过目标时间了,此时应该停止倒计时。
  if (spanStamp <= 0) {
    // 停止倒计时,并且页面中的倒计时更新成 '00:00:00',终止后面的代码执行
    clearInterval(timerId);
    timeBox.innerHTML = '00:00:00';
    return;
  }

  // 2. 把毫秒差换算成小时、分钟、秒
  // 2.1 小时
  var hours = Math.floor(spanStamp / (60 * 60 * 1000)); // 用毫秒时间差 除以 一个小时的毫秒数

  // 2.2 分钟
  var hMs = hours * 60 * 60 * 1000; // 小时占用的毫秒数
  var mins = Math.floor((spanStamp - hMs) / (1000 * 60)); // 用总毫秒时间差 - 小时占用的毫秒数再除以 一分钟的毫秒数

  // 2.3 秒数
  var minsMs = mins * 1000 * 60; // 计算分钟数占用的毫秒数
  var secs = Math.floor((spanStamp - hMs - minsMs) / 1000);

  // 3 判断时分秒是否是各位数字,如果是个位数就需要补零;
  // hours = hours < 10 ? '0' + hours : hours;
  // mins = mins < 10 ? '0' + mins : mins;
  // secs = secs < 10 ? '0' + secs : secs; 当重复代码过多时,就需要封装成一个函数
  hours = addZero(hours);
  mins = addZero(mins);
  secs = addZero(secs);
  timeBox.innerHTML = `${hours}:${mins}:${secs}`;
  // timeBox.innerHTML =  hours + ':' + mins + ':' + secs;
}
function addZero(num) {
  return num < 10 ? '0' + num : num;
}
countDown();

var timerId = setInterval(countDown, 1000);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值