JavaScript总结

目录

数据类型:

变量:

typeof运算符

函数

        函数的声明:

        函数提升:

        函数参数:

对象

        对象的定义:

DOM

document对象获取元素

document.getElementById():

document.getElementsByTagName():

document.getElementsByClassName():

document.querySelector():

document.querySelectorAll():

document对象创建元素

        document.createElement():

        document.createTextNode():

        document.createAttribute():

value:

setAttributeNode():

appendChild():

Element对象

Element.id:

Element.className

Element.classList

Element.innerHTML

Element.innerText

Element.innerHTML和Element.innerText的区别:

         Element获取元素位置

CSS操作

事件处理程序

        HTML事件处理

​编辑

        DOM0级事件处理

        DOM2级事件处理

        鼠标事件

        Event事件对象属性

        Event事件对象方法

​编辑

        键盘事件

        事件代理

​编辑

定时器:

        setTimeout定时器

        setInterval定时器

防抖优化:

​编辑

节流优化:


数据类型:

JavaScript是一种动态语言,它并不需要明确的数据类型,声明类型通过var进行声明,js的数据类型总共有六种:数值型、字符串、布尔值、undefined、null、对象        

这里我们重点将以下对象:

对象又称为合成类型/复合类型,对象可以包含所有数据类型,对象可以包含对象,可以看作是一个存放各种值的容器

变量:

变量的定义

var num 10;

变量提升

JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行代码。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,声明和赋值分离了,这就叫做变量提升(hoisting)。

typeof运算符

typeof运算符的作用是判断一个值是什么类型

数值返回number

typeof 123// "number"

 

字符串返回string

typeof '123'// "string"

 

布尔值返回boolean

typeof false// "boolean"

 

对象返回object

typeof {} // "object"

 

unll和undefined的区别

null与undefined都可以表示“没有”,含义非常相似。将一个变量赋值为undefined或null,老实说,语法效果几乎没区别。既然含义与用法都差不多,为什么要同时设置两个这样的值,这不是无端增加复杂度,令初学者困扰吗?这与历史原因有关

函数

        函数的声明:

js的函数声明通过function命令声明,function后面是函数名,函数名后面是一对圆括号,圆括号可定义参数,圆括号后面跟着大括号,大括号里放着函数的代码

例子:

function print(s) {

        console.log(s);

}

        函数提升:

js将函数名视同变量名,当js编译时会将整个函数提升到代码头部,所以这就导致了我们可以先调用函数,然后再实现函数

add();

function add() {}

        函数参数:

JavaScript的函数参数不需要给定类型

function square(x) {

    console.log(x*x);

}

square(2) // 4

square(3) // 9-

对象

简单来说,对象就是一组“键值对”key-value的集合,是一种无序的复合数据集合,我们可以通过key获得key所对应的value值

        对象的定义:

对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型、方法、对象。

var user = {

        name:"一拳超人";

        age:16;

        add:function(a,b){

                return a+b;

        }

        jobs = {

                frontEnd:["Web前端","PHP"];

                backEnd:["Java","C++"];        

        }

}

DOM

DOM是js操作网页的接口,全称为“Document Object Model”文档对象模型,它的作用是将网页转为一个JavaScript对象从而可以对网页进行操作

浏览器会根据 DOM 模型,将HTML解析成一系列的节点,再由这些节点组成一个树状结构(DOM Tree)。所有的节点和最终的树状结构,都有规范的对外接口

DOM 只是一个接口规范,可以用各种语言实现。所以严格地说,DOM 不是 JavaScript 语法的一部分,但是 DOM 操作是 JavaScript 最常见的任务,离开了 DOM,JavaScript 就无法控制网页。另一方面,JavaScript 也是最常用于 DOM 操作的语言

节点的类型有七种

Document:整个文档树的顶层节点 

DocumentType:doctype标签 

Element:网页的各种HTML标签

Attribute:网页元素的属性(比如class="right")

Text:标签之间或标签包含的文本 

Comment:注释 DocumentFragment:文档的片段

        document对象获取元素

document.getElementById():

返回匹配指定id属性的元素节点,如果没有匹配的则返回null

var ele = document.getElementById("id值");

document.getElementsByTagName():

返回匹配指定元素名的元素节点集,它的返回值是一个类似数组的对象(HTMLCollection),可以使用数组的方式访问该对象存放的匹配的元素节点,没有则返回一个空集

var ele = document.getElementsByTagName("元素名");

console.log(ele[0]);

document.getElementsByClassName():

返回匹配指定class名的元素集,它的返回值也是一个HTMLCollection对像,可以通过数组的方式访问该对象存放的匹配的元素节点

var ele = document.getElementsByClassName(class名);

console.log(ele[0]);

  

document.querySelector():

接收一个CSS选择器作为参数,返回匹配该选择器的元素节点,如果有多个结点匹配,则只返回第一个匹配的节点,如果没有匹配的节点返回null

document.querySelectorAll():

用法和querySelector函数一样,但是querySelectorAll函数返回匹配的结果集

        document对象创建元素

document.createElement():

        该方法用来生成元素节点,并返回该节点

        var ele = document.createElement("元素名");

document.createTextNode():

        该方法用来创建文本内容,参数是文本节点的内容

        var text = document.createTextNode("文本内容");

document.createAttribute():

        该方法生成一个新的属性节点

        var att = document.createAttribute("属性名");

value:

属性值通过属性节点的value属性进行赋值

        att.value = 属性值

setAttributeNode():

给元素节点添加属性通过setAttribute方法进行属性的添加

appendChild():

给元素添加内容通过appendChild方法实现

例子:创建元素p,内容为hello,添加class属性为p1,并将这个元素p添加到div元素中        

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        .box{
            width: 200px;
            height: 200px;
            background-color: pink;
        }
    </style>
</head>
<body>
    <div class="box"></div>
    <script>
        //创建元素p
        var ele = document.createElement("p");
        //创建内容
        var text = document.createTextNode("hello");
        //将内容放入元素p中
        ele.appendChild(text);

        //创建属性
        var att = document.createAttribute("class");
        //设置属性值
        att.value = "p1";
        //将属性设置给元素p
        ele.setAttributeNode(att);

        //获取div元素
        var div = document.getElementsByTagName("div")[0];
        //将元素p放入div元素中
        div.appendChild(ele);

        console.log(div);
    </script>
</body>
</html>

        Element对象

我们通过document对象获取的元素或者创建的元素就是Element对象,可以将Element对象当做就是对应的元素,元素有属性那么Element对象也有属性,可以通过Element对象添加属性值给元素添加属性

Element.id:

该属性返回指定元素的id属性,该属性可以读写

// HTML 代码为 <p id="foo">
var p=document.querySelector('p');
Console.log(p.id)// "foo"

Element.className

该属性返回指定元素的class属性,它的值是一个字符串

<body>
    <div class="box box1 box2"></div>
    <script>
        //通过Class获取对应的元素    
        var div = document.getElementsByClassName("box")[0];
        //输出该元素的class属性
        console.log(div.className);
        //结果为:box box1 box2
    </script>
</body>

Element.classList

classList对象有下列方法

  • add():增加一个 class。
  • remove():移除一个 class。
  • contains():检查当前元素是否包含某个 class。
  • toggle():将某个 class 移入或移出当前元素。

vardiv=document.getElementById('myDiv');

div.classList.add('myCssClass');

div.classList.add('foo', 'bar');

div.classList.remove('myCssClass');

div.classList.toggle('myCssClass'); // 如果 myCssClass 不存在就加入,否则移除

div.classList.contains('myCssClass'); // 返回 true 或者 false

<body>
    <div class="box" id="box"></div>
    <script>
        //通过id获取对应的元素
        var div = document.getElementById("box");
        //添加class为box1
        div.classList.add("box1");
        //删除class名box
        div.classList.remove("box");
        //输出当前元素的class是否包含某个box。
        console.log(div.classList.contains("box"));
        //如果 box 不存在就加入,否则移除
        div.classList.toggle("box");
        console.log(div);
    </script>
</body>

Element.innerHTML

可以给元素添加内容

<body>
    <div class="box" id="box">asdf</div>
    <script>
        //获取对应id的Element对象
        var div = document.getElementById("box");
        //给该对象添加内容
        div.innerHTML="waeifjkladsflfsl";
    </script>
</body>

Element.innerText

可以个元素添加内容

<body>
    <div class="box" id="box">asdf</div>
    <script>
        //获取对应id的Element对象
        var div = document.getElementById("box");
        //给该对象添加内容
        div.innerText="waeifjkladsflfsl";
    </script>
</body>

Element.innerHTML和Element.innerText的区别:

innerHTML是添加一条HTML语句,他可以识别标签

<body>
    <div class="box" id="box">asdf</div>
    <script>
        //通过id获取对应的元素
        var div = document.getElementById("box");
        //给该元素添加内容(HTML语句)
        div.innerHTML="<p>hello world!</p>";
        //将该元素的结构打印出来
        console.log(div);
    </script>
</body>

innerText只是添加内容,会直接将代码渲染为字符串,而不会识别是否为HTML语句

<body>
    <div class="box" id="box">asdf</div>
    <script>
        //通过id获取对应的元素
        var div = document.getElementById("box");
        //给该元素添加内容
        div.innerText="<p>hello world!</p>";
        //将该元素的结构打印出来
        console.log(div);
    </script>
</body>

 

        Element获取元素位置

属性

描述

clientHeight

获取元素高度包括padding部分,但是不包括bordermargin

clientWidth

获取元素宽度包括padding部分,但是不包括bordermargin

scrollHeight

元素总高度,它包括padding,但是不包括bordermargin包括溢出的不可见内容

scrollWidth

元素总宽度,它包括padding,但是不包括bordermargin包括溢出的不可见内容

scrollLeft

元素的水平滚动条向右滚动的像素数量

scrollTop

元素的垂直滚动条向下滚动的像素数量

offsetHeight

元素的 CSS 垂直高度(单位像素),包括元素本身的高度、padding 和 border

offsetWidth

元素的 CSS 水平宽度(单位像素),包括元素本身的高度、padding 和 border

offsetLeft

到定位父级左边界的间距

offsetTop

到定位父级上边界的间距

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        .box{
            width: 200px;
            height: 200px;
            margin: 10px;
            padding: 10px;
        }
        h3{
            height: 500px;
        }
    </style>
</head>
<body>
    <div class="box" id="box">
        <h3>标题</h3>
        <h3>标题</h3>
        <h3>标题</h3>
        <h3>标题</h3>
        <h3>标题</h3>
    </div>
    <script>
        var box = document.getElementById("box");
        //元素的高度:200px
        console.log("元素高度(包括padding):"+ box.clientHeight);
        console.log("元素宽度(包括padding):"+ box.clientWidth);
        //页面的高度(内容撑开的部分)
        console.log("元素总高度:"+box.scrollHeight);
        console.log("元素总宽度:"+box.scrollWidth);
        console.log("垂直高度:"+box.offsetHeight);
        console.log("水平宽度:"+box.offsetWidth);
    </script>
</body>
</html>

        CSS操作

以上都是通过js完成HTML操作,那么如何使用js完成CSS操作呢?

1、操作 CSS 样式最简单的方法,就是使用网页元素节点的setAttribute方法直接操作网页元素的style属性

div.setAttribute(

 'style','background-color:red;'+'border:1px solid black;'

);

2、通过元素节点的style属性赋值

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>

    </style>
</head>
<body>
    <div id="box"></div>
    <script>
        //通过id属性获取对应的元素对象的style属性
        var box = document.getElementById("box").style;
        //给box对应的元素对象的style属性的属性赋值
        box.width = "200px";
        box.height = "200px";
        box.backgroundColor = "pink";


    </script>
</body>
</html>

3、通过元素对象的属性的cssText属性添加css语句

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <div id="box"></div>
    <script>
        var box = document.getElementById("box").style;
        box.cssText = "width:200px;height:200px;background-color:pink";
    </script>
</body>
</html>

事件处理程序

        HTML事件处理

在HTML的元素中设置属性οnclick=js里边设置的方法,现在我们设置的是鼠标事件,当我们点击鼠标时就会触发

缺点:HTML和js没有分开

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <button onclick="clickHandle()">按钮</button>
    <script>
        //缺点:HTML和JS没有分开
        function clickHandle(){
            console.log("点击了按钮");
        }
    </script>
</body>
</html>

        DOM0级事件处理

 通过js获取元素对象,通过元素对象的属性设置事件

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <button id="btn">按钮</button>
    <script>
        var btn = document.getElementById("btn");
        btn.onclick = function(){
            console.log("点击了按钮");
        }
    </script>
</body>
</html>

但是DOM0级事件处理有一个缺点,就是无法添加两个相同的事件,相同事件会被覆盖

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <button id="btn">按钮</button>
    <script>
        var btn = document.getElementById("btn");
        btn.onclick = function(){
            console.log("点击了按钮");
        }
        btn.onclick = function(){
            console.log("点击了按钮1");
        }
    </script>
</body>
</html>

        DOM2级事件处理

通过添加事件监听器实现事件处理

优点:相同的事件不会被覆盖

缺点:写的麻烦

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <button id="btn">按钮</button>
    <script>
        var btn = document.getElementById("btn");
        btn.addEventListener("click",function(){
            console.log("点击了按钮1");
        });
        btn.addEventListener("click",function(){
            console.log("点击了按钮2");
        })
    </script>
</body>
</html>

        鼠标事件

鼠标事件指与鼠标相关的事件,具体的事件主要有以下一些

  1. click:按下鼠标时触发
  2. dblclick:在同一个元素上双击鼠标时触发
  3. mousedown:按下鼠标键时触发
  4. mouseup:释放按下的鼠标键时触发
  5. mousemove:当鼠标在节点内部移动时触发。当鼠标持续移动时,该事件会连触发。
  6. mouseenter:鼠标进入一个节点时触发,进入子节点不会触发这个事件
  7. mouseleave:鼠标离开一个节点时触发,离开父节点不会触发这个事件
  8. mouseover:鼠标进入一个节点时触发,进入子节点会再一次触发这个事件
  9. mouseout:鼠标离开一个节点时触发,离开父节点也会触发这个事件

        Event事件对象属性

实现事件触发的方法是有参数的,参数为Event,这个参数名任意,而这个参数的作用就是监听,当我们触发某个事件时,我们可以通过监听器阻止浏览器的一些默认行为

Event对象属性

  1. Event.Target
  2. Event.type

Event.target

Event.target属性返回事件当前所在的节点

// HTML代码为

// <p id="para">Hello</p>

function setColor(e) {

 console.log(this===e.target);

 e.target.style.color='red';

}

para.addEventListener('click', setColor);

Event.type

Event.type属性返回一个字符串,表示事件类型。事件的类型是在生成事件的时候。该属性只读

        Event事件对象方法

通过Event监听器阻止浏览器默认行为,

例如:当我们点击超链接,浏览器会默认跳转到该链接,此时我们就可以通过Event对象的preventDefault()函数阻止浏览器的默认行为

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <a href="https://www.baidu.com/">百度</a>
    <script>
        var a = document.getElementsByTagName("a")[0];
        a.onclick = function(e){
            e.preventDefault();
            console.log("点击了跳转,但我就不跳");
        }
    </script>
</body>
</html>

        键盘事件

键盘事件由用户击打键盘触发,主要有keydown、keypress、keyup三个事件

  1. keydown:按下键盘时触发。
  2. keypress:按下有值的键时触发,即按下 Ctrl、Alt、Shift、Meta 这样无值的键,这个事件不会触发。对于有值的键,按下时先触发keydown事件,再触发这个事件。
  3. keyup:松开键盘时触发该事件
<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <input type="text" id="text">
    <script>
        var box = document.getElementById("text");
        box.onkeydown = function(){
            console.log("键盘按下了");
        }
        box.onkeyup = function (e) {
            console.log(e.target.value);
        }
        box.onkeypress = function(){
            console.log("keypress");
        }
    </script>
</body>
</html>

 

        事件代理

由于事件会在冒泡阶段向上传播到父节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件。这种方法叫做事件的代理(delegation)

下方有一段代码,当我们点击子类的div时,父类的div事件也会触发

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        #box1{
            width: 200px;
            height: 200px;
            background-color: pink;
        }
        #box2{
            width: 100px;
            height: 100px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div id="box1">
        <div id="box2"></div>
    </div>
    <script>
        var box1 = document.getElementById("box1");
        var box2 = document.getElementById("box2");

        box1.onclick = function(){
            console.log("点击了box1");
        }
        box2.onclick = function(){
            console.log("点击了box2");
        }
    </script>
</body>
</html>

 所以此时我们就可以通过事件代理,完成通过父类解决子类的事件

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <ul id="ul">
        <li>列表</li>
        <li>列表</li>
        <li>列表</li>
    </ul>
    </div>
    <script>
        var ul = document.getElementById("ul");
        ul.onclick = function(e){
            if(e.target.tagName==="LI"){
                console.log("li被点击");
            }            
        }
    </script>
</body>
</html>

定时器:

        setTimeout定时器

JavaScript 提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()setInterval()这两个函数来完成。它们向任务队列添加定时任务

setTimeout函数用来指定某个函数或某段代码,在多少毫秒之后执行。它返回一个整数,表示定时器的编号,以后可以用来取消这个定时器。

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <script>
        var time = setTimeout(function(){
            console.log("执行1次");
        }, 3000);
        time;
    </script>
</body>
</html>

三秒过后将会执行代码

        setInterval定时器

 setInterval定时器的使用方法和setTimeout定时器一样,但是setInterval的作用是每隔n秒执行1次,也就是说setInterval是无限次执行的

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
</head>
<body>
    <script>
        var time = setInterval(function(){
            console.log("执行1次");
        }, 3000);
        time;
    </script>
</body>
</html>

防抖优化:

防抖属于性能优化的知识,但实际上遇到的频率相当高,处理不当或者放任不管就容易引起浏览器卡死。

从滚动条监听的例子说起

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        h3{
            height: 500px;
        }
    </style>
</head>
<body>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <script>
        function showTop() {
            var scrollTop=document.documentElement.scrollTop;
            console.log('滚动条位置:'+scrollTop);
        }
        //滚动条监听,当我们滑动滚动条时就会触发该监听
        window.onscroll=showTop
    </script>
</body>
</html>

当我稍微滑动一下滚动条就会触发n多次该事件,那么这样子就会造成浏览器性能的下降

 实现原理:

通过一个引用将setTimeout定时器封装起来,当我们要执行改代码时,这个引用就会等于这个定时器,此时timer就是有值的,如果我们再次执行shake这个方法,那么timer此时不为null

if语句判断为true,进入if语句清空前面的定时器,然后再次调用定时器执行该方法

意思其实就是:当我们一直触发该条件时,就不会一直执行代码,而是清除上次的定时器,然后重新开始计时

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Document</title>
    <style>
        h3{
            height: 500px;
        }
    </style>
</head>
<body>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <script>
        function shake(fn,delay){
            var timer = null;
            return function(){
                if(timer){
                    clearTimeout(timer);
                }
                timer = setTimeout(fn,delay);
            }
    }
        function showTop() {
         var scrollTop = document.documentElement.scrollTop;
         console.log('滚动条位置:'+scrollTop);
        }
        //滚动条监听,当我们停止滑动滚动条0.3秒后就会触发该监听
        window.onscroll=shake(showTop,300)
        
    </script>
</body>
</html>

防抖定义

对于短时间内连续触发的事件(上面的滚动事件),防抖的含义就是让某个时间期限(如上面的1000毫秒)内,事件处理函数只执行一次

节流优化:

还是使用滚动事件的例子,如果用户想要的需求是,就算一直滑动滚动条,也会触发滚动事件,每隔n秒触发一次

大家重点看注释部分,通过注释部分可以很好的理解这段代码是如何实现的

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

<head>
    <title>Document</title>
    <style>
        h3 {
            height: 500px;
        }
    </style>
</head>

<body>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <h3>标题</h3>
    <script>
        function shake(fn, delay) {
            var flag = true;
            //以上厕所为例,
            //此时如果flag为true,那么厕所没有人
            return function () {
                if (!flag) {
                    return false;
                }
                //如果flag为true,那么顺利进入上厕所
                //进入了厕所得锁门吧,所以需要将flag设置为false
                flag = false;
                //上厕所
                setTimeout(function(){
                    //上厕所
                    fn();
                    //上完厕所打开门,将flag转为true
                    flag = true;
                }, delay);
                
            }
        }
        function showTop() {
            var scrollTop = document.documentElement.scrollTop;
            console.log('滚动条位置:' + scrollTop);
        }
        window.onscroll = shake(showTop, 500)
    </script>
</body>

</html>

滑动滚动条过后

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值