js基础第五天

01-获取孩子节点

  • childNodes 获取的包括文本

  • nodeType 为1是标签 为2是属性 为3是文本

      var box = document.getElementById('box');
      var btns = box.childNodes;
      //    console.log(btns);
    
      var arrNode = [];
      for (var i = 0; i<btns.length; i++){
          if (btns[i].nodeType == 1){
              // 标签元素
              arrNode.push(btns[i]);
          }
      }
      console.log(arrNode);
    
  • children 直接可以获取到元素节点

02-获取兄弟节点

  • nextElementSibling 在IE9以上用这个
  • nextSibling IE9一下用这个
  • 兼容写法 var next3 = btn.nextElementSibling || btn.nextSibling;

03-获取父亲节点

 // 获取父亲节点
console.log(btn.parentNode);

03-通过类名获取标签的封装

  • getElementsByClassName() 在IE9以下无效

  • 兼容写法

      // 兼容写法
      function getEleClassName(dom,className) {
          if (dom.getElementsByClassName){
              // 此方法可以识别
              return dom.getElementsByClassName(className);
          }else {
              // 方法不能识别 *通配符选择器,可以获取dom下面的所有标签
              var eles = dom.getElementsByTagName('*');
              // 存放标签
              var tempArr = [];
              for(var i = 0; i<eles.length; i++){
                  if (eles[i].className == className){
                      tempArr.push(eles[i]);
                  }
              }
              return tempArr;
          }
      }
    

04-节点的使用&九宫格动态创建

// 1.获取标签
var btns = document.getElementById('box').getElementsByTagName('button');
var bottom = document.getElementById('bottom');
// 2.添加节点
// 用来存放节点
var array = [];
// 总列数
var count = 3;
// 当前行号
var row = 0;
// 当前列号
var col = 0;
// 间距
var margin = 10;
// 添加节点
btns[0].onclick = function () {
    // 2.1 创建节点
    var div = document.createElement('div');
    bottom.appendChild(div);
    div.className = 'curr';
    // 添加到数组
    array.push(div);
    // 遍历
    for (var i = 0; i < array.length; i++) {
        row = parseInt(i / count);
        col = i % count;
        array[i].style.left = col * (100 + margin) + 'px';
        array[i].style.top = row * (100 + margin) + 'px';
    }
};
// 删除节点
btns[1].onclick = function () {
    // 删除节点
    bottom.removeChild(array.pop());
}

05-发微博

// 1.获取标签
var box = document.getElementById('box');
var textA = box.children[0];
var btn = box.children[1];
var oul = box.children[2];

// 2.添加点击事件
btn.onclick = function () {
    var content = textA.value;
    if (content == ''){
        // 判断有没有内容,如果没有内容直接返回
        alert('请输入内容');
        return;
    }

    // 1.创建li
    var oli = document.createElement('li');
    var oa = document.createElement('a');
    oa.innerHTML = '删除';
    oli.innerHTML = textA.value;
    oli.appendChild(oa);

    // 清空内容
    textA.value = '';
    oul.insertBefore(oli,oul.children[0]);
//        if(oul.children.length > 0){

//        }else {
//            // 第一次添加到头部
//            oul.appendChild(oli);
//        }
    // 给a标签绑定事件
    oa.onclick = function () {
        oul.removeChild(this.parentNode);
    }
}

06-日期对象的认识

  • getFullYear() 从 Date 对象以四位数字返回年份。
  • getMonth() 从 Date 对象返回月份 (0 ~ 11)。
  • getDate() 从 Date 对象返回一个月中的某一天 (1 ~ 31)。
  • getHours() 返回 Date 对象的小时 (0 ~ 23)。
  • getMinutes() 返回 Date 对象的分钟 (0 ~ 59)。
  • getSeconds() 返回 Date 对象的秒数 (0 ~ 59)。
  • getMilliseconds() 返回 Date 对象的毫秒(0 ~ 999)。
  • getTime() 返回 1970 年 1 月 1 日至今的毫秒数。 时间戳
  • valueOf() 返回 Date 对象的原始值。 时间戳

1969年8月,贝尔实验室的程序员肯汤普逊利用B编译语言,创造了C语言.
最初计算机操作系统是32位,而时间也是用32位表示。也就是说32位能表示的最长时间是68年,而实际上到2038年01月19日03时14分07秒,便会到达最大时间,过了这个时间点,所有32位操作系统时间便会变为10000000 00000000 00000000 00000000,也就是1901年12月13日20时45分52秒,这样便会出现时间回归的现象,很多软件便会运行异常了。

到这里,我想问题的答案已经出来了:因为用32位来表示时间的最大间隔是68年,而最早出现的UNIX操作系统考虑到计算机产生的年代和应用的时限综合取了1970年1月1日作为UNIX TIME的纪元时间(开始时间),至于时间回归的现象相信随着64为操作系统的产生逐渐得到解决,因为用64位操作系统可以表示到292,277,026,596年12月4日15时30分08秒,相信我们的N代子孙,哪怕地球毁灭那天都不用愁不够用了,因为这个时间已经是千亿年以后了。

07-自定义时间

  • 如果括号里面没有写日期,就是代表默认获取当前的时间,如果写了就是自定义的时间

       // 1.自定义时间
      // 如果括号里面没有写日期,就是代表默认获取当前的时间,如果写了就是自定义的时间
      var date = new Date('2018/2/23 10:10:10');
      console.log(date.getFullYear());
      console.log(date.getMonth());
      console.log(date.getDate());
      var mins = date.getTime();
    
      // 计算事件差
      var nowDate = new Date();
      // 获取当前的毫秒数
      var nowMins = nowDate.getTime();
    
      console.log(mins);
      console.log(nowMins);
      console.log(mins - nowMins);
    

08-钟表案例

// 1.获取标签
var h = document.getElementById('hour');
var m = document.getElementById('minute');
var s = document.getElementById('second');

// 2.获取当前的时分秒
setInterval(function () {
    var date = new Date();
    // 获取毫秒
//        var minSecond = date.getMilliseconds();

    // 秒针
    var second = date.getSeconds();
    // 分针
    var minute = date.getMinutes();
    // 时针
    var hour = date.getHours()%12 + minute/60;

    // 2.2旋转
    // 秒针
    s.style.transform = 'rotate('+ second*6 +'deg)';
    m.style.transform = 'rotate('+ minute*6 +'deg)';
    h.style.transform = 'rotate('+ hour*30 +'deg)';
},100)

01.设置字符翻转以及移动到不同行上显示不同的颜色

!important 提升优先级

02.九宫格算法的分析

03.九宫格算法的分析以及实现

    // 遍历
    // 总列数
    var count = 3;
    // 当前列号
    var col = 0;
    // 当前行号
    var row = 0;
    // 间距
    var margin = 10;
    for(var i = 0; i<list.length; i++){
        // 计算当前的行号
        col = i % count;
        // 计算当前的列号
        row = parseInt(i / count);
        list[i].style.left = col * (100 + margin) + 'px';
        list[i].style.top = row * (100 + margin) + 'px';
        list[i].style.position = 'absolute';
    }

04.tab切换的实现

  • 通过这个案例主要讲解标签的属性可以自定义

      // 1.获取标签
      var btns = document.getElementById('top').getElementsByTagName('button');
      var divs = document.getElementById('bottom').getElementsByTagName('div');
    
      // 2.添加事件
      for(var i = 0; i < btns.length; i++){
    
          // 标签的属性可以自定义, 可以自己增加一个属性,在需要的时候取出来使用
          btns[i].index = i;
    
          btns[i].onclick = function () {
              // 2.1排他思想
              for(var i = 0; i < btns.length; i++){
                  btns[i].className = '';
              }
              this.className = 'curr';
    
              // 2.2 切换div
              // 设置所有的盒子为 none
              for (var i = 0; i < divs.length; i++){
                  divs[i].style.display = 'none';
              }
              // 设置当前点击对应的盒子为 block
              divs[this.index].style.display = 'block';
          }
      }
    

05.数组的常用方法

  • 1.concat() 连接两个或更多的数组,并返回结果。

  • 2.push() 向数组的末尾添加一个或更多元素,并返回新的长度。

  • 3.pop() 删除并返回数组的最后一个元素

  • 4.unshift()向数组的开头添加一个或更多元素,并返回新的长度。

  • 5.shift() 删除并返回数组的第一个元素

  • 6.slice() 第一个参数代表从数组的那个索引开始截取, 第二个参数代表截取到那个索引停止 会返回一个截取后新的数组,而原始数组不会发生改变

  • 7.splice() 删除元素,并向数组添加新元素。

    • 第一个参数 index 代表要从数组的那个位置开始删除

    • 第二个参数 howmany 代表要删除元素的个数

    • item1, ..., itemX 可选。向数组添加的新项目。 在删除的位置添加新的选项可以添加多个

        console.log(arr.splice(1, 2,'隔壁老王'));
        console.log(arr);
      
  • 8.join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。

    • 用来切割数组,将其转换为字符串, 默认用逗号隔开 原数组不变

        console.log(arr.join('*'));
        张三*李四*王五*3*刘二麻子
      
  • 9.sort() 对数组的元素进行排序 会改变元数组

      a>b 为升序 
      a<b 为降序
      var arr1= [0, 3, 2, 5,7];
      arr1.sort(function (a,b) {
          return a>b;
      });
      console.log(arr1);
    

06.字符串的常用方法

  • 1.字符串截取保留2为小数

  • 2.indexOf() 检索字符串。返回指定的索引 从前面查找

  • 3.lastIndexOf() 从后向前搜索字符串。

  • 4.charAt() 返回在指定位置的字符。

  • 5.charCodeAt()返回在指定的位置的字符的 Unicode 编码。

  • 6.slice() 提取字符串的片断,并在新的字符串中返回被提取的部分。

      如果传入一个参数会从这个位置截取到最后
    
  • 7.split() 把字符串分割为字符串数组。

  • 8.toLowerCase() 把字符串转换为小写。

  • 9.toUpperCase() 把字符串转换为大写。

07.判断文件的格式是否正确

// 1.获取标签
var oinput = document.getElementById('oinput');
// 2.添加事件
oinput.onchange = function () {
//        alert(oinput.value);
    // 2.1截取
    var text = oinput.value;
    var index = text.lastIndexOf('.');
    // 转换为小写
    var lastName = text.slice(index+1).toLowerCase();
    if(lastName == 'png' || lastName == 'jpg'){
        alert('格式正确');
    }else {
        alert('格式不正确,请上传格式为png或者jpg的图片');
    }
}

08.定时器

  • 1.多次定时器

  • 定时器注意点: 如果定时器不用的话一定要清空,否则会造成内存泄漏

    • setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。

    • setInterval() 方法会不停地调用函数,直到 clearInterva() 被调用或窗口被关闭

        /*
        * setInterval()
        * 多次定时器 可以间隔固定的时间执行某段代码
        * 第一个参数 要执行的代码块, 函数名
        * 第二个参数 间隔时间  单位ms 毫秒
        * */
        var timer = null;
        timer = setInterval(fn,1000);
        function fn() {
            alert('我是多次定时器');
        }
        // 清空多次定时器
        clearInterval(timer);
      
    1. 一次定时器
    • setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。

        /*一次定时器 延迟多少秒执行
         setTimeout(fn,1000);
         第一个参数 要执行的代码块, 函数名
         第二个参数 间隔时间  单位ms 毫秒
        * */
        var timer = null;
        timer = setTimeout(fn,1000);
        function fn() {
            alert('我是一次定时器');
        }
        // 清空一次定时器
        clearTimeout(timer);
      

09.定时器匀速动画

// 1.获取标签
    var btn = document.getElementById('btn');
    var box = document.getElementById('box');

    // 2.添加事件
    btn.onclick = function () {
        linear(box,0,4,800);
    };

    // 抽取函数
    /**
     * 匀速动画
     * @param begin 初始值
     * @param speed 速度
     * @param target 目标值
     */
    function linear(dom,begin,speed,target) {
        // 1.清空上次定时器
        clearInterval(dom.timer);
        // 2.开启定时器
        dom.timer = setInterval(function () {
            begin += speed;
            // 判断终止条件
            if (begin >= target) {
                clearInterval(dom.timer);
                begin = target;
            }
            dom.style.left = begin + 'px';
        }, 10);
    }

10.定时器缓动动画

// 1.获取标签
var btn = document.getElementById('btn');
var box = document.getElementById('box');
// 定时器
var timer = null;
// 目标值
var target = 800;
// 初始值
var begin = 0;
// 速度
var speed = 0;

// 2.添加事件
btn.onclick = function () {
    // 2.1 清除定时器
    clearInterval(timer);

    timer = setInterval(function () {
        speed = (target - begin) / 10;
        begin += speed;
        // 四舍五入函数 round()
        if (Math.round(begin) >= target) {
            clearInterval(timer);
//                alert('定时器清空');
            begin = target;
        }
        console.log(begin);
        box.style.left = begin + 'px';
    }, 50)
}
4256-106.jpg

01.点名册案例

// 1.获取标签
var btns = document.getElementById('box').getElementsByTagName('button');
var oh1 = document.getElementById('oh1');
// 2.添加事件
// 开始
var timer = null;
var arr = ['张三','李四','王五','刘二麻子','二狗','小明','隔壁老王'];
btns[0].onclick = function () {
    // 清空定时器
    clearInterval(timer);
    timer = setInterval(function () {
        // 1.生成随机数 生成 0-1的随机数,但是不能取到1
        var randomNum = parseInt(Math.random() * arr.length);

        // 2.从数组中取出值
        oh1.innerHTML = arr[randomNum];
    },10);
};
// 停止
btns[1].onclick = function () {
    clearInterval(timer);
}

02.长图展示

// 1.获取标签
var spans = document.getElementById('box').getElementsByTagName('span');
var pic = document.getElementById('pic');

// 2.添加事件
var timer = null;
var begin = 0;
var speed = 4;
spans[0].onmouseover = function () {
    clearInterval(timer);
    timer = setInterval(function () {
        begin -= speed;
        if (begin <= -505){
            clearInterval(timer);
            begin = -505;
        }
        pic.style.top = begin + 'px';
    },10)
};
spans[1].onmouseover = function () {
    clearInterval(timer);
    timer = setInterval(function () {
        begin += speed;
        if (begin >= 0){
            clearInterval(timer);
            begin = 0;
        }
        pic.style.top = begin + 'px';
    },10)
}

03.展示阴影

<div id="box">
    <span id="cover"></span>
</div>

// 1.获取标签
var box = document.getElementById('box');
var cover = document.getElementById('cover');
// 2.添加点击事件
var timer = null;
var begin = 150;
box.onmouseover = function () {
    clearInterval(timer);
    timer = setInterval(function () {
        begin -= 3;
        if (begin <= 0){
            clearInterval(timer);
            begin = 0;
        }
        cover.style.top = begin + 'px';
    },10);
}

04.js定时器原理

  • 一次定时器 在指定时间内, 将任务放入事件队列,等待js引擎空闲后被执行.
  • setInterval(fn, 100)容易产生误区:并不是上一次fn执行完了之后再过100ms才开始执行下一次fn。 事实上,setInterval并不管上一次fn的执行结果,而是每隔100ms就将fn放入主线程队列,而两次fn之间具体间隔多久就不一定了。
  • 定时器的用处, 如果有很多节点渲染,可以将多个节点放入定时器中来执行,这样就不会阻塞线程,提高用户体验

05.一次定时器执行多次操作以及递归的认识

var box = document.getElementById('box');
    var timer = setTimeout(jump,1000);
    var count = 5;
    function jump() {
        // 每次进来先清空上一个定时器
        clearTimeout(timer);
        count--;
        box.innerHTML = '要在' + count + '秒后跳转';
        if (count <= 0){
            window.location.href = 'http://www.baidu.com';
        }else {
//            timer = setTimeout(jump,1000);
            timer = setTimeout(arguments.callee,1000);
            // 递归:自己搞自己, 自己调用自己
            // arguments.callee 在函数内部指的是函数本身
        }
    }

06.简单轮播图的认识

// 1.获取标签
var oul = document.getElementById('oul');

// 2.图片轮播
// 初始值
var begin = 0;
setInterval(function () {
    begin -= 4;
    if (begin <= -1200){
        begin = 0;
    }
    oul.style.left = begin + 'px';
},20)

07.左右轮播图

// 1.获取标签
var spans = document.getElementById('box').getElementsByTagName('span');
var oul = document.getElementById('oul');

// 2.添加点击事件
// 点击右侧
var timer = null;
// 偏移量
var begin = 0;
// 索引
var loop = 0;
// 速度
var speed = 4;

// 记录标志
var flag = true;

spans[1].onclick = function () {
    if (flag == false) return;
    flag = false;
    // 页码自增1
    loop++;
    if (loop > 5){
        // 重置页码为1
        loop = 1;
        // 重置偏移量
        begin = 0;
    }
    timer = setInterval(function () {
        begin -= speed;
        if (begin <= loop * -640){
            clearInterval(timer);
            begin = -640 * loop;
            flag = true;
        }
        oul.style.left = begin + 'px';
    },10)
};
// 左边
spans[0].onclick = function () {
    if (flag == false) return;
    flag = false;
    loop--;
    if (loop < 0){
        loop = 4;
        begin = 5 * -640;
    }
    timer = setInterval(function () {
        begin += speed;
        if (begin >= loop * -640){
            clearInterval(timer);
            begin = -640 *loop;
            flag = true;
        }
        oul.style.left = begin + 'px';
    },10);
}

08.发送验证码

// 1.获取标签
var btn = document.getElementById('btn');
// 2.添加事件
var timer = null;
// 剩余的秒数
var count = 5;
btn.onclick = function () {
    // 2.1 禁止按钮点击
    this.disabled = true;

    // this 在定时器中指向窗口,因为开启定时期的时候本身就是window.setInterval()
    // 备份指针
    var that = this;

    // 2.2 倒计时
    timer = window.setInterval(function () {
        count--;
        if(count < 0){
            clearInterval(timer);
            count = 5;
            that.disabled = false;
            that.innerHTML = '重新发送验证码';
        }else {
            that.innerHTML = '剩余' + count + '秒';
        }
    },1000)
}

09.节点操作

// 1.创建节点
var h1 = document.createElement('h1');
h1.innerHTML = '我是标题'; 
// 2.添加节点
// appendChild 在节点后面添加
// document.body.appendChild(h1);
var box = document.getElementById('box');
// insertBefore 第一个参数是要插入的节点, 第二个参数是要插入到那个节点前面 如果为null则插入到最后面
document.body.insertBefore(h1,box);

// 创建节点
var div = document.createElement('div');
div.style.width = '200px';
div.style.height = '200px';
div.style.background = 'red';
document.body.appendChild(div);

// 3.删除节点 要删除的节点
document.body.removeChild(box);
// 4.克隆节点
// cloneNode 如果为true就会复制节点里面的所有孩子节点,包括样式
// 如果为false 就只是赋值自己
var ele = box.cloneNode(false);
console.log(ele);
ele.style.marginTop = '10px';

// 添加节点
document.body.appendChild(ele);

// 替换节点
var box = document.getElementById('box');
var h1 = document.createElement('h1');
h1.innerHTML = '我是标题';
document.body.replaceChild(h1,box);
198750-106.jpg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,718评论 2 17
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,056评论 1 10
  • 一、数组 数组是一个有序列表,所以有下标. 并且数组在js中可以存在任意类型的数据.并且同一个数组中可以存放不同的...
    空谷悠阅读 504评论 0 1
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,073评论 0 7
  • 一、JavaScript基础知识回顾 1.1 JavaScript 1.1.1 javascript是什么? Ja...
    福尔摩鸡阅读 1,235评论 0 7