JavaScript基础语法-dom/bom-es6-jQuery-数据可视化echarts(2)

编程知识 更新时间:2023-05-03 02:41:39

DOM、BOM

  • Web APIs
    • Web APIs和JS基础关联性
    • API和Web API
    • DOM
      • DOM树
      • 获取元素
      • 事件基础
      • 操作元素
        • 改变元素内容
        • 修改元素属性
        • 表单属性设置
          • 案例,password可见隐藏,多次改变恢复的方法
        • 修改样式属性
        • 循环精灵图
        • 表单onfocus/onblur/显示隐藏文本框内容
        • className更改元素样式
        • 排他思想
        • 表格隔行变色
        • 自定义属性操作
        • H5自定义属性
      • 节点操作
        • 节点层级
          • 父节点 子节点
          • 兄弟节点
        • 创建和添加节点
        • 删除节点
        • 阻止链接跳转
        • 复制节点
        • 三种创建元素的方式
      • 事件高级
        • 注册事件(绑定事件)
        • 删除事件(解绑)
        • DOM事件流
        • 事件对象
        • 常见的事件对象属性和方法
        • 事件委托
        • 常见的鼠标事件
        • 鼠标事件对象
        • 键盘事件
        • 键盘事件对象
    • BOM
      • 常见事件
        • 页面加载事件
        • 调整窗口大小事件
      • 定时器
      • this指向谁
      • JS执行机制
      • location对象
        • url
      • navigator对象
      • history对象
    • PC端网页特效
      • offset系列属性
      • offset和style的区别
      • 如何获取鼠标在盒子内的距离
      • 元素可视区client系列
      • flexible.js解析
      • scroll系列
    • mouseover和mousenter事件
    • 动画函数封装
      • 缓动动画
      • 轮播图

Web APIs

Web APIs和JS基础关联性

API和Web API

API:应用程序编程接口
Web API:浏览器提供的一套操作浏览器功能和页面元素的API(BOM DOM)

DOM

DOM即文档对象模型,处理HTML或XML的标准编程接口。通过DOM接口可以改变样式内容结构。如可以做轮播图、倒计时…

DOM树


DOM把以上内容都看作对象。

获取元素

ID、标签名、H5新方法、特殊

getElementByld()返回一个匹配的ID元素
getElementsByTagName() 返回标签的集合

<ol id="ol">
    <li>hi</li>
    <li>hi</li>
</ol>
<ul>
    <li>你好呀</li>
    <li>你好呀</li>
    <li>你好呀</li>
    <li>你好呀</li>
    <li>你好呀</li>
</ul>
<div id="time">2019-9-9</div>
<script>
    // 因为文档页面从上往下加载,所以现有标签
    // 驼峰命名法
    //id是字符串 ()里面是字符串
    // 返回的timer类型是对象
    var timer = document.getElementById('time');
    console.log(timer);//2019-9-9
    console.dir(timer);//可以查看各种属性

    var lis = document.getElementsByTagName('li')
    console.log(lis);//返回的是 获取过来元素对象的集合 以伪数组的形式储存 
    console.log(typeof lis);//object
    console.log(lis[0]);
    // 依次打印
    for (var i = 0; i < lis.length; i++) {
        console.log(lis[i]);
    }
    // 如果页面中仅有一个li返回的还是伪数组的形式
    // 如果页面中没有li返回的是空的伪数组的形式
    // element.getElementsByTagName('标签名')父元素必须是指定的单个元素
    var ol = document.getElementById('ol')
    var lis = ol.getElementsByTagName('li')
    console.log(lis);

getElementsByClassName和H5新方法:

<div class="box">盒子1</div>
<div class="box">盒子2</div>
<ul id="name">
    <li>1</li>
    <li>3</li>
    <li>4</li>
</ul>
<script>
    var boxs = document.getElementsByClassName('box')//根据类名返回元素对象集合 伪数组形式存储
    console.log(boxs);
    console.log(document.querySelector('.box'));//返回指定选择器的第一个元素对象 里面要加符号
    console.log(document.querySelector('#name'));//返回ul
    console.log(document.querySelector('li'));
    var allBoxs = document.querySelectorAll('.box')//返回指定选择器的所有元素对象的集合 为数组形式储存
    console.log(allBoxs);
</script>

获取特殊元素对象:

<script>
    var bodyEle = document.body;
    console.dir(bodyEle);
    var htmlEle = document.documentElement;
    console.dir(htmlEle);
</script>

事件基础

事件三要素和执行步骤:


1.获取事件源 2.注册事件 3.事件处理程序

操作元素

js的DOM操作可以改变网页的内容、结构和样式,我们可以利用DOM操作元素改变元素里面的内容、属性等,注意以下都是属性。

改变元素内容

<button>显示当前系统时间</button>
<div>某个时间</div>
<p>123</p>
<script>
    //获取元素
    var btn = document.querySelector('button');
    var div = document.querySelector('div');
    //注册事件
    btn.onclick = function fn() {
        div.innerText = getDate();
    }
    function getDate() {
        //格式化日期 年月日
        var date = new Date();
        var year = date.getFullYear();//返回当前日期的年
        var month = date.getMonth() + 1;//返回的要少一
        var dates = date.getDate();//返回几号
        var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
        var day = date.getDay();
        return '今天是:' + year + '年' + month + '月' + dates + '日' + arr[day];
    }
    //我们元素可以不用添加事件,这叫做操作DOM
    var p = document.querySelector('p');
    p.innerText = getDate();
</script>

innerText和innerHTML的区别:
1.innerText不识别html标签 非标准 去除空格和换行
1.innerHTML识别html标签 W3C标准 保留空格和换行
两者都可以读写:

<div></div>
<p>你好
    <span>我是刘德华</span>
</p>
<script>
    var p = document.querySelector('p');
    var div = document.querySelector('div')
    console.log(p.innerHTML);
    console.log(p.innerText);
    div.innerText = '<em>今天</em>';//无法识别em会直接显示出来
    // div.innerHTML = '<em>今天</em>';//会把今天变成斜体
</script>

修改元素属性

实例为修改图片的src属性

表单属性设置

案例,password可见隐藏,多次改变恢复的方法
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            position: relative;
            width: 400px;
            border-bottom: 1px solid #ccc;
            margin: 100px auto;
        }

        .box input {
            width: 370px;
            height: 30px;
            border: 0;
            outline: none;
        }

        .box img {
            position: absolute;
            right: 2px;
            top: 2px;
            width: 24px;
        }
    </style>
</head>

<body>
    <div class="box">
        <label for="">
            <img src="images/close.png" alt="" id="eye">
        </label>
        <input type="password" id="pwd">
    </div>
    <script>
        //获取元素
        var eye = document.getElementById('eye');
        var pwd = document.getElementById('pwd');
        //注册事件 处理程序
        var flag = 0;
        eye.onclick = function () {
            if (flag == 0) {
                pwd.type = 'text';
                eye.src = 'images/open.png';
                flag = 1;
            } else {
                pwd.type = 'password';
                eye.src = 'images/close.png';
                flag = 0;
            }
        }
    </script>
</body>

</html>

修改样式属性

    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
        }
    </style>
</head>

<body>
    <div></div>
    <script>
        var box = document.querySelector('div');
        box.onclick = function () {
            //注意style里的属性和css里的写法不一样,是驼峰命名法
            this.style.backgroundColor = 'blue';
            this.style.width = '250px';
        }
    </script>
</body>

修改完样式属性后新的样式是以行内样式插入的

循环精灵图

适用于精灵图中的小图标排列有规律的情况

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        li {
            list-style-type: none;
        }
        
        .box {
            width: 250px;
            margin: 100px auto;
        }
        
        .box li {
            float: left;
            width: 24px;
            height: 24px;
            background-color: pink;
            margin: 15px;
            background: url(images/sprite.png) no-repeat;
        }
    </style>
</head>

<body>
    <div class="box">
        <ul>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
    <script>
        // 1. 获取元素 所有的小li 
        var lis = document.querySelectorAll('li');
        for (var i = 0; i < lis.length; i++) {
            // 让索引号 乘以 44 就是每个li 的背景y坐标  index就是我们的y坐标
            var index = i * 44;
            lis[i].style.backgroundPosition = '0 -' + index + 'px';
            //注意写法 0后面有空格和负号
        }
    </script>

表单onfocus/onblur/显示隐藏文本框内容

<body>
    <input type="text" value="手机">
    <script>
        var text = document.querySelector('input');
        text.onfocus = function () {
            // console.log('得到了焦点');
            if (this.value === '手机') {
                this.value = '';
            }
            //获得焦点把文本框文字颜色变深
            this.style.color = '#333';
        }
        text.onblur = function () {
            // console.log('失去了焦点');
            if (this.value === '') {
                this.value = '手机';
            }
            //获得焦点把文本框文字颜色变灰
            this.style.color = '#666';
        }
    </script>
</body>

className更改元素样式

    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: aquamarine;
        }

        .change {
            width: 300px;
            height: 300px;
            background-color: bisque;
            margin: 100px auto;
        }
    </style>
</head>

<body>
    <div>盒子</div>
    <script>
        var box = document.querySelector('div');
        box.onclick = function () {
            this.className = 'change';
            //如果原来的div有类名,且想保留它,则可以this.className='change 原来的类名';
        }
    </script>
</body>

排他思想

如轮播图…就要用到,先排除所有的样式,然后再给当前元素添加样式。如:

<body>
    <button>按钮1</button>
    <button>按钮2</button>
    <button>按钮3</button>
    <button>按钮4</button>
    <button>按钮5</button>
    <script>
        var btns = document.querySelectorAll('button');
        //btns得到的是伪数组,里面的每一个元素用btns[i]得到
        for (var i = 0; i < btns.length; i++) {
            btns[i].onclick = function () {
                //先把所有背景颜色去掉,然后让当前的元素背景颜色改变
                for (var j = 0; j < btns.length; j++) {
                    btns[j].style.backgroundColor = '';
                }
                this.style.backgroundColor = 'pink';
            }
        }
    </script>
</body>

按某个按钮后,它变成粉色

表格隔行变色

    <style>
        table {
            width: 800px;
            margin: 100px auto;
            text-align: center;
            border-collapse: collapse;
            font-size: 14px;
        }

        thead tr {
            height: 30px;
            background-color: skyblue;
        }

        tbody tr {
            height: 30px;
        }

        tbody td {
            border-bottom: 1px solid #d7d7d7;
            font-size: 12px;
            color: blue;
        }

        .bg {
            background-color: pink;
        }
    </style>
</head>

<body>
    <table>
        <thead>
            <tr>
                <th>代码</th>
                <th>名称</th>
                <th>最新公布净值</th>
                <th>累计净值</th>
                <th>前单位净值</th>
                <th>净值增长率</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
            <tr>
                <td>003526</td>
                <td>农银金穗3个月定期开放债券</td>
                <td>1.075</td>
                <td>1.079</td>
                <td>1.074</td>
                <td>+0.047%</td>
            </tr>
        </tbody>
    </table>
    <script>
    //注意选择的是tbody里的tr
        var trs = document.querySelector('tbody').querySelectorAll('tr');
        for (var i = 0; i < trs.length; i++) {
            //鼠标经过事件onmouseover
            trs[i].onmouseover = function () {
                this.className = 'bg';
            }
            //鼠标离开事件onmouseout
            trs[i].onmouseout = function () {
                this.className = '';
            }
        }
    </script>

自定义属性操作

element.属性 内置属性
element.getAttribute(‘属性’) 我们定义的属性

element.setAttribute('属性‘,’值‘)
注意修改属性时:
1) element.className=‘属性’;
2)element.setAttribute(class,’值‘)
移除属性
element.removeAttribute(‘属性’)

H5自定义属性


或者用setAttribute设置

获取属性:getAttribute(无兼容性问题)
还有: element.dataset.data-后面的属性名字;还要注意自定义属性里面有多个短横线连接的单词,用dataset获取时要用驼峰命名法

节点操作

所有的都是节点,节点一般有节点类型 名称 值


实际开发主要操作的是元素节点

节点层级

父节点 子节点

想获得某个元素的父节点:element.parentNode

childNodes获得所有的子节点,包括元素节点、文本节点…(空格换行)
我们可以用nodeType来判断是不是元素节点:如我们想要ul里面的li

element.children
获得所有子元素节点(html元素)

获取第一个和最后一个孩子:
注意:firtsChild lastChild获取的是第一个(最后一个)子节点,包括文本节点、元素节点…
以下两种方法只支持IE9以上
要获取第一个子元素节点

要获取最后一个子元素节点
parentNode.lastElementChild

另一种方法:(实际开发都用这样的)
获取第i个子元素节点
parentNode.children[i]
获取最后一个:
parentNode.children[parentNode.children.length-1]

兄弟节点


下面两方法只支持IE9以上:
node.nextElementSibling
node.previousElementSibling
解决兼容性问题:

创建和添加节点

document.createElement(‘li’)
node.appendChild(element)
添加到指定父节点的子节点后面

node.insertBefore(child,指定元素)
node为父元素,指定元素为指定的子元素,插到它前面

<body>
    <ul>
        <li>123</li>
    </ul>
    <script>
        //创建节点
        var li = document.createElement('li')
        //添加节点
        var ul = document.querySelector('ul')
        ul.appendChild(li);
        //在123前面插入一个li
        var lili = document.createElement('li')
        ul.insertBefore(lili, ul.children[0])
    </script>
</body>

删除节点

node.removeChild(child)
从node中删除某个子节点,返回删除的节点

阻止链接跳转

javascript:void(0);或者javascript:;

复制节点

node.cloneNode()
node为要克隆的节点;如果括号为空或里面是false,则只是浅拷贝,只复制标签不复制里面的内容,则克隆完以后要添加appendChild;括号里有true,就是把节点本身以及里面所有的子节点都拷贝。

三种创建元素的方式

document.write()
文档流执行完毕后,会导致页面全部重绘

innerHTML用拼接字符串的方式,效率很低,但用数组的方式传给他会效率很高。creatElement效率会低一点,但结构更清晰。

事件高级

注册事件(绑定事件)


    <button>传统注册事件</button>
    <button>方法监听注册方式</button>
    <script>
        //click不需要加on 要引号 listener就是function 可以注册多个,传统的不可以
        var btns = document.querySelectorAll('button')
        btns[1] = addEventListener('click', function () {
            alert(22);
        })
        btns[1] = addEventListener('click', function () {
            alert(33);
        })
    </script>

注:attachEvent要IE9以前的支持

删除事件(解绑)

传统,如:
element.οnclick=null;
监听:
element.removeEventListener

    <div>1</div>
    <div>2</div>
    <div>3</div>
    <script>
        var divs = document.querySelectorAll('div');
        divs[0].onclick = function () {
            alert(11);
            // 1. 传统方式删除事件
            divs[0].onclick = null;
        }
        // 2. removeEventListener 删除事件
        divs[1].addEventListener('click', fn) // 里面的fn 不需要调用加小括号

        function fn() {
            alert(22);
            divs[1].removeEventListener('click', fn);
        }
        // 3. detachEvent
        divs[2].attachEvent('onclick', fn1);

        function fn1() {
            alert(33);
            divs[2].detachEvent('onclick', fn1);
        }
    </script>

DOM事件流


事件发生时会在元素节点之间按照特定的顺序传播。当addEventListener第三个参数为true,则是捕获阶段,当我们给父元素添加相同的事件如鼠标点击,则点击子元素时,son father body html document依次执行;冒泡就是第三个参数设置为false,son事件处理程序执行,然后父元素的事件处理程序执行,然后…body、html、document

事件对象

<div>123</div>
<script>
    // 事件对象
    var div = document.querySelector('div');
    div.onclick = function(e) {
            // console.log(e);
            // console.log(window.event);
            // e = e || window.event;
            console.log(e);


        }
        // div.addEventListener('click', function(e) {
        //         console.log(e);

    //     })
    // 1. event 就是一个事件对象 写到我们侦听函数的 小括号里面 当形参来看
    // 2. 事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数
    // 3. 事件对象 是 我们事件的一系列相关数据的集合 跟事件相关的 比如鼠标点击里面就包含了鼠标的相关信息,鼠标坐标啊,如果是键盘事件里面就包含的键盘事件的信息 比如 判断用户按下了那个键
    // 4. 这个事件对象我们可以自己命名 比如 event 、 evt、 e
    // 5. 事件对象也有兼容性问题 ie678 通过 window.event 兼容性的写法  e = e || window.event;
</script>

常见的事件对象属性和方法

    <div>123</div>
    <ul>
        <li>abc</li>
        <li>abc</li>
        <li>abc</li>
    </ul>
    <script>
        // 常见事件对象的属性和方法
        // 1. e.target 返回的是触发事件的对象(元素)  this 返回的是绑定事件的对象(元素)
        // 区别 : e.target 点击了那个元素,就返回那个元素 this 那个元素绑定了这个点击事件,那么就返回谁
        var div = document.querySelector('div');
        div.addEventListener('click', function(e) {
            console.log(e.target);
            console.log(this);

        })
        var ul = document.querySelector('ul');
        ul.addEventListener('click', function(e) {
                // 我们给ul 绑定了事件  那么this 就指向ul  
                console.log(this);
                console.log(e.currentTarget);

                // e.target 指向我们点击的那个对象 谁触发了这个事件 我们点击的是li e.target 指向的就是li
                console.log(e.target);

            })
            // 了解兼容性
            // div.onclick = function(e) {
            //     e = e || window.event;
            //     var target = e.target || e.srcElement;
            //     console.log(target);

        // }
        // 2. 了解 跟 this 有个非常相似的属性 currentTarget  ie678不认识

事件委托

<body>
    <ul>
        <li>知否知否,点我应有弹框在手!</li>
        <li>知否知否,点我应有弹框在手!</li>
        <li>知否知否,点我应有弹框在手!</li>
        <li>知否知否,点我应有弹框在手!</li>
        <li>知否知否,点我应有弹框在手!</li>
    </ul>
    <script>
        // 事件委托的核心原理:给父节点添加侦听器, 利用事件冒泡影响每一个子节点
        var ul = document.querySelector('ul');
        ul.addEventListener('click', function(e) {
            // alert('知否知否,点我应有弹框在手!');
            // e.target 这个可以得到我们点击的对象
            e.target.style.backgroundColor = 'pink';


        })
    </script>

常见的鼠标事件

禁止鼠标右键菜单和禁止选择(不让复制)


<body>
    我是一段不愿意分享的文字
    <script>
        // 1. contextmenu 我们可以禁用右键菜单
        document.addEventListener('contextmenu', function(e) {
                e.preventDefault();
            })
            // 2. 禁止选中文字 selectstart
        document.addEventListener('selectstart', function(e) {
            e.preventDefault();

        })
    </script>
</body>

鼠标事件对象


这种黄色框框跟随鼠标走可以参照下面的案例:

    <style>
        img {
            position: absolute;
            top: 2px;
        }
    </style>
</head>

<body>
    <img src="images/angel.gif" alt="">
    <script>
        var pic = document.querySelector('img');
        document.addEventListener('mousemove', function (e) {
            // 1. mousemove只要我们鼠标移动1px 就会触发这个事件
            // console.log(1);
            // 2.核心原理: 每次鼠标移动,我们都会获得最新的鼠标坐标, 把这个x和y坐标做为图片的top和left 值就可以移动图片
            var x = e.pageX;
            var y = e.pageY;
            console.log('x坐标是' + x, 'y坐标是' + y);
            //3 . 千万不要忘记给left 和top 添加px 单位,元素默认是贴着左上角对其的,所以让鼠标刚好在图片中心就好
            pic.style.left = x - 50 + 'px';
            pic.style.top = y - 40 + 'px';
        });

键盘事件

keydown会比keypress先执行,最后是keyup
注意:传统的才需要加on,addEventListener不用

键盘事件对象

e.keycode获得按到的键对应的ascII码

BOM

浏览器对象模型,独立于内容而与浏览器窗口做交互效果。

BOM比DOM大。window对象是JS访问浏览器窗口的一个接口,它是全局对象,全局变量都是window的一个属性,函数都是它的方法。(可以省略)

常见事件

页面加载事件

传统:window.οnlοad=function(){}
监听:window.addEventListener(‘load’,function(){})
这样就可以把script写到页面任何一个地方,意思是页面内容全部加载完毕再执行里面的代码。(包括图像、脚本文件、css)
注意,传统的方式只能最后一个起作用。

DOMContentLoaded 仅当DOM元素加载完毕,不包括样式表,图片,flash等。只适合IE9以上。

调整窗口大小事件


windo.innerWidth当前屏幕的宽度(浏览器)

定时器

setTimeout()
setInterval()

<button>点击停止</button>
<script>

    // setTimeout(function () {},毫秒)
    // setTimeout(function () {
    //     console.log('hi');
    // }, 3000)

    // 也可以这样写,setTimeout(函数名,毫秒数)
    //setTimeout(函数名,毫秒数)里面的函数也叫做:callbcak也叫做回调函数
    //要点击完才执行的函数这种也叫做回调函数
    function callback() {
        alert('炸了')
    }
    var time1 = setTimeout(callback, 2000)

    // 也可以这样写,setTimeout('函数名()',毫秒数)
    //一般要给定时器加上标识符,免得很多定时器

    //停止定时器
    // window.clearTimeout(timeoutID) window可以省略
    var btn = document.querySelector('button');
    btn.addEventListener('click', function () {
        clearTimeout(time1)
    })
</script>

setInterval()的区别就是它可以重复调用函数,每隔一段时间就调用一次;
倒计时效果:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .father {
            display: flex;
            width: 600px;
            margin: 100px auto;
            justify-content: center;
            align-items: center;
        }

        .father div {
            height: 100px;
            width: 100px;
            background-color: blue;
            margin: 0 10px;
            text-align: center;
            line-height: 100px;
            font-size: 30px;
        }
    </style>
</head>

<body>
    <div class="father">
        <div class="hour">1</div>
        <div class="minute">2</div>
        <div class="second">3</div>
    </div>
    <script>
        //获取元素
        var hour = document.querySelector('.hour')
        var minute = document.querySelector('.minute')
        var second = document.querySelector('.second')
        var inputTime = +new Date('2021-3-20 19:00:00');//返回用户输入的时间的总毫秒数
        //倒计时函数
        function countDown() {
            var nowTime = +new Date();//返回当前时间总的毫秒数
            var times = (inputTime - nowTime) / 1000;//返回剩余时间的秒数
            var h = parseInt(times / 60 / 60);//当前剩余的hour
            h = h < 10 ? '0' + h : h;
            hour.innerHTML = h;
            var m = parseInt(times / 60 % 60);//当前剩余的minutes
            m = m < 10 ? '0' + m : m;
            minute.innerHTML = m;
            var s = parseInt(times % 60);//当前剩余的seconds
            s = s < 10 ? '0' + s : s;
            second.innerHTML = s;
        }
        countDown();
        setInterval(countDown, 1000);
    </script>
</body>

</html>

案例:点击发送验证码

    <input type="number" name="" id="">
    <button>发送验证码</button>
    <script>
        var btn = document.querySelector('button');
        var time = 3;
        btn.addEventListener('click', function () {
            btn.disabled = true;
            var timer = setInterval(function () {
                if (time !== 0) {
                    btn.innerHTML = '请' + time + '秒后再试';
                    time--;
                }
                else if (time == 0) {
                    clearInterval(timer);
                    btn.disabled = false;
                    btn.innerHTML = '点击发送验证码';
                    time = 3;
                }
            }, 1000)
        })
    </script>

this指向谁

1.全局作用域或调用普通函数指向window
如setInterval()指向的就是window

2.谁调用方法就指向谁
btn.addEventListener(‘click’, function () {
this.disabled = true;}
指向btn

3.构造函数指向实例化对象
如:
function fn(){
this.age=18;
}
var fn1=new fn()
指向fn1

JS执行机制

js是单线操作;
但现在可以同步和异步;

location对象

url

统一资源定位符



<body>
    <button>点击</button>
    <script>
        var btn = document.querySelector('button')
        btn.addEventListener('click', function () {
            // location.assign('http://www.baidu')//记录浏览器历史,可以后退
            // location.replace('http://www.baidu')//不记录不后退
            location.reload();//相当于刷新,当有参数时为强制刷新,这样就不存在缓存的问题(之前有的网站打开后已经被缓存了,这时候需要强制刷新)
        })
    </script>
</body>

navigator对象

history对象

history.pushState({},’’,‘home’) 也可以改变url且不发生刷新(入栈操作,back(),go(-1)相当于出栈操作)

在OA系统中用的比较多

PC端网页特效

offset系列属性


注意:parentNode返回的是最近一级的父亲;offsetParent返回的是带有定位的父亲;

offset和style的区别


style只能得到行内样式表里的样式值,不能获得内嵌的(就是写在< style></ style>里的不行。

如何获取鼠标在盒子内的距离

元素可视区client系列

client返回的不包含border值,其余和offset一样。

flexible.js解析

立即执行函数 (function(a){})(1) 或(function(a){}(1)) 第二个小括号可以看作在调用函数,里面可以放实参,传给第一个小括号里的形参;它是不需要调用就可以执行的函数;立即执行函数创建了一个独立的作用域,里所有的变量都是局部变量,不会有冲突。

scroll系列

scrollTOP(Left)不针对document

scroll高度宽度是真正的内容大小,Top Left:滚动条拖动时,文字往上走了,scrollTop指的是边框的下沿到文字上沿距离

scroll滚动事件,即我们的滚动条滚动时触发的事件。

注意页面document被卷曲的头部可以用:
window.pageYOffset获得(左侧Y改成X)

mouseover和mousenter事件

mouseover:当鼠标移动到自身盒子及其子盒子都会触发一次事件;因为它会冒泡。
mousenter:当鼠标移动到自身盒子会触发一次事件;

动画函数封装

核心原理:通过定时器setInterval()不断移动盒子的位置。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            position: absolute;
            left: 0;
            width: 100px;
            height: 100px;
            background-color: pink;
        }
        
        span {
            position: absolute;
            left: 0;
            top: 200px;
            display: block;
            width: 150px;
            height: 150px;
            background-color: purple;
        }
    </style>
</head>

<body>
    <button>点击夏雨荷才走</button>
    <div></div>
    <span>夏雨荷</span>
    <script>
        // var obj = {};
        // obj.name = 'andy';
        // 简单动画函数封装obj目标对象 target 目标位置
        // 给不同的元素指定了不同的定时器
        function animate(obj, target) {
            // 当我们不断的点击按钮,这个元素的速度会越来越快,因为开启了太多的定时器
            // 解决方案就是 让我们元素只有一个定时器执行
            // 先清除以前的定时器,只保留当前的一个定时器执行
            clearInterval(obj.timer);
            obj.timer = setInterval(function() {
                if (obj.offsetLeft >= target) {
                    // 停止动画 本质是停止定时器
                    clearInterval(obj.timer);
                }
                obj.style.left = obj.offsetLeft + 1 + 'px';

            }, 30);
        }

        var div = document.querySelector('div');
        var span = document.querySelector('span');
        var btn = document.querySelector('button');
        // 调用函数
        animate(div, 300);
        btn.addEventListener('click', function() {
            animate(span, 200);
        })
    </script>
</body>

</html>

缓动动画

就是让它慢慢停下来。

轮播图


一些细节:当链接里面是#时,点击就会自动回到页面顶部,我们要把#换成javascript:;

手动调用事件;

更多推荐

JavaScript基础语法-dom/bom-es6-jQuery-数据可视化echarts(2)

本文发布于:2023-04-30 04:20:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/ea79735faadcc5f3d7619fdce0d2bc40.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:语法   基础   数据   dom   JavaScript

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 113268文章数
  • 28747阅读数
  • 0评论数