JS基础入门

一、 组成

(一)基础语法

1、alert弹窗及js引入方式

(1)alert('   ')

(2)js引入方式:(head、body内外均可以引用)

内部引用:<script>   js代码   </script>

外部引用:<script   src="路径"> </script>

2、console输出

console.log("内容")   //打印一般信息、日志

console.info("内容")   //打印一般信息、日志

console.error("内容")   //打印错误信息

console.warn("内容")   //打印非法警告信息

3、变量与注释

js变量都是弱类型,无需确定数据类型。

强类型:编译前进行数据类型的确定。

弱类型:编译后确定数据类型。

(1)定义变量   var a=1;   //声明同时初始化

(2)注释    //   或者/*注释的内容*/

4、数据类型

(1)数字型   Number

(2)字符串   String   (  "内容"   、  '内容'  、  `内容` )

(3)布尔   Boolean:ture or false

(4)未定义   Undefind   确省(只声明、不定义)

(5)空   Null

(6)特殊类型、对象类型   Object

注意:typeof()可以进行类型检测。

5、NAN

      not a number

6、算数运算符和赋值运算符

(1)算数运算符:+   -   *   /   %(取余)   ++(自增)   --(自减)

(2)赋值运算符:=      +=      -=      *=      /=      %=

7、数据类型转换及Math对象

(1)数据类型转换

隐式转换:数字与字符串进行运算(+转字符串,其余都是数字)、转布尔类型(非0即为真、非空即为真)。

强制类型转换:

//NaN
var str = "123abc" ;

var n = Number(str);

console.log(n)

字符串转数字parseInt    parseFloat

(2)Math对象

Math.floor(n)   //向下取证

Math.ceil(n)   //向上取证

Math.round(n) //四舍五入

Math.max(n1,n2...) //最大值

Math.min(n1,n2...) //最小值

Math.random() //随机数[0,1)

Math.pow(2,3) //幂数

Math.sqrt(9) //开平方

Math.abs(-1) //绝对值

Math.sin() //正弦

8、函数基础

(1)作用:代码更加简洁,提高重用性

//函数的声明
function sum(a, b) {
console.log(a+b);
return a+b;
console.log(123);//不执行
}
//函数的调用
sum(1,2);
sum(300,400);

function   函数名(一组参数){
代码体
}


一组参数:最多255个参数 ,也可以不写。

参数:形参(声明的位置)、实参(调用的位置)

函数的返回值(可有可无),作用:返回一个值、结束函数

(2)函数的作用域

全局作用域、局部作用域、全局变量、局部变量

<!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>作用域</title>
</head>
<body>
    
</body>
<script>
    // 全局作用域
    // 在全局作用域声明的变量,称之为全局变量
    var nick = "csdn";

    function changeNick() {
        // 局部作用域定义的变量称之为局部变量
        // 不能在全局作用域调用局部变量
        var my = "张金贺";
        nick = "hello csdn";
    }

    changeNick();
    console.log(my)
</script>
</html>

9、比较运算符

==等于   

!=  <>不等于(只判断内容大小)
===恒等于

!==恒不等于(既判断内容大小有判断数据类型)

>大于

<小于

>=大于等于

<=小于等于

10、逻辑运算符与运算符优先级

(1)逻辑运算符:&&逻辑与(一假即假)   ||逻辑或(一真即真)   !逻辑非(取反)

(2)运算符优先级:

11、流程控制语句-if

12、流程控制语句-switch

13、三目运算符

判断条件?对的︰错的

14、循环

(1)while

while(条件){
语句
}

(2)do while

do {
代码块
}while(条件)

(3)for

for (var i=0;i<=5;i++) {
代码块
}

15、获取元素

(1)通过id获取

(2)通过ul获取

(2)通过类名获取

<!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>获取元素</title>
    <style>
        .color {
            color: red;
        }
    </style>
</head>
<body>
    <div id="d1">
        <span>自挂东南枝</span>
    </div>
    <ul>
        <li class="item">李白</li>
        <li class="item">杜甫</li>
        <li class="item">白居易</li>
    </ul>
</body>
<script>
    var d1 = document.getElementById("d1");
	//获取文本内容
	console.log(d1.inner)
	// 获取标签和内容
    console.log(d1.innerHTML)
	// 修改内容
    d1.innerHTML = "举头望明月,自挂东南枝";
	// 修改样式
    d1.className = "color";
	// 内联修改样式
    d1.style.fontSize = "30px";

    // 1. 标签获取
    var ul = document.getElementsByTagName("ul");
    // 2.类名获取
    var lis = document.getElementsByClassName("item")
    // console.log(lis)
 
    //for循环,遍历获取
    for (var i=0; i<lis.length; i++) {
        //遍历
        lis[i].style.textAlign = "right";
        lis[i].style.backgroundColor = "orange"
    }

</script>
</html>

16、数组的基本使用

<!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>数组</title>
</head>
<body>
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</body>
<script>
    // 三种创建方式
    // 1.
    var array = new Array(1,2,3,4,5);
    console.log(array);

    // 2. 
    var array = new Array(3);
    array[0] = 1
    console.log(array);

    // 3. 
    var sdmz = ["内容一","内容二","内容三"];
    var lis = document.getElementsByTagName("li");
    // 数组的遍历
    for (var i=0; i<lis.length; i++) {
        lis[i].innerHTML = sdmz[i];
    }
    // 可以通过取下标(索引)的方式获取或修改对应的数组元素
</script>
</html>

17、基本数据类型与引用数据类型的区别

此处涉及堆和栈的知识。

深拷贝:拷贝内容。

浅拷贝:拷贝地址,不拷贝内容。

基本数据类型的值在栈内存。

引用数据类型的值在堆内存。

<!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>基本数据类型与引用数据类型的区别</title>
</head>
<body>
    
</body>
<script>
    // 基本数据类型
    var a = 1;
    var b = a;
    b = 2;
    console.log(a);
	// a不受影响

    // 引用数据类型
    var arr1 = [1,2,3];
    var arr2 = arr1;
    arr2[0] = 10;
    console.log(arr1[0])
	// arr1受影响

    // 基本数据类型的值在栈内存
    // 引用数据类型的值在堆内存
</script>
</html>

数组常见操作!!! 

<!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>数组常见操作</title>
</head>
<body>
    
</body>
<script>
    // 数组元素的修改与访问
    var books = ["西游记","水浒传","三国演义","红楼"]
    // 通过下标访问 修改元素
    console.log(books[0])
    books[3] = "石头记";
    console.log(books.length);

    push(n)   在数组最后添加一个元素n
    pop()     删除数组最后一个元素
    books.push("聊斋");
    books.pop();
    books.pop();

    unshift(n)  在数组的开头添加一个元素n  
    shift()     删除数组的第一个元素
    books.unshift("山海经");
    books.shift();

    concat() 拼接数组  返回一个新的数组
    var arr = ["山海经","聊斋"];
    books = books.concat(arr);

    splice(下标,删除元素的个数,新插入的元素列表)
    books.splice(1,2,"聊斋","钢铁是怎样炼成的")

    slice(start[, end])  截取元素  返回一个新的数组
    [start, end)
    var a = books.slice(1,2);
    console.log(a);

    reverse() 反转数组
    console.log(books.reverse())

    join(规则)  按照规则将数组转为字符串
    console.log(books.join(" "))

    indexOf(子元素)  从数组中查询子元素,返回下标,没有就返回-1
    console.log(books.indexOf("朝花夕拾"))

   // 遍历
   // 1. for  while
   // 2. forEach
   // 函数做参数,称之为回调函数
   // item 数组的每一个值
   //index 下标
    books.forEach(function(item, index) {
        console.log(item, index)
    })
   // 3. map  遍历  回调函数中return一个新的值 返回新数组
    var arr = [1,2,3,4];
    var newArr = arr.map(function(item) {
        return item ** 2;
    })
    console.log(newArr)

    sort()  排序  
    var arr = [7, 18, -9, -23, 0, 56];
    // a b是数组相邻的两个值
    // 回调函数,如果返回值大于0,就交换a b的顺序
    arr.sort(function(a, b) {
        return a - b;
    })
    console.log(arr)

    // console.log(books);
</script>
</html>

18、对象结构

<!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>对象</title>
</head>
<body>
    
</body>
<script>
    // key: value
    // 人物 : 姓名:张金贺  年龄:22  性别:man  城市:河北   爱好:计算机
    var zhang = {
        name: "张金贺",
        age: 22,
        sex: "man",
        city: "河北",
        hobby: "computer"
    }

    //  访问:
    //  1.  通过.语法
    console.log(zhang.name)
    //修改
    zhang.name = "张金贺";
    // console.log(cege)
    //  2. 通过 [变量]
    var str = "age";
    console.log(zhang[str])

    // 可以为对象添加任意属性
    zhang.car = "奔驰";
    // 删除 delete 
    delete zhang.car

    // 使用 for  in 进行对象的遍历 
    for(var key in zhang) {
        console.log(key)
        console.log(zhang[key])
    }
</script>
</html>

19、字符串操作

<!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>字符串</title>
</head>
<body>
    <div id="ok">
        <!-- <p>静夜思</p>
        <p>床前明月光</p>
        <p>疑是地上霜</p>
        <p>举头望明月</p>
        <p>低头思故乡</p> -->
    </div>
</body>
<script>
    var dOk = document.getElementById("ok");
    var author = "李白"
    // dOk.innerHTML = "<p>静夜思</p><p>"+author+"</p><p>床前明月光</p><p>疑是地上霜</p><p>举头望明月</p><p>低头思故乡</p>"
    dOk.innerHTML = `
        <p>静夜思</p>
        <p>${author}</p>
        <p>床前明月光</p>
        <p>疑是地上霜</p>
        <p>举头望明月</p>
        <p>低头思故乡</p>
    `;

    // 获取字符串的长度 length
    console.log(author.length)

    // toUppercase() 大写  toLowercase() 小写
    var str = "Hello CsDn";
    console.log(str.toUpperCase(),str.toLowerCase())

    // split(规则) 以某种规则将字符串转为数组
    var str = "你-好";
    var arr = str.split("-");

    // indexOf()  下标
    var str = "123123";
    console.log(str.indexOf(4))

    // substring(start, end)[)  substr(start, length)
    var str = "一棵是枣树,另一棵也是枣树";
    console.log(str.substring(0,5));
    console.log(str.substr(4,2))

    // replace(x,y)  用y替换x 
    var str = "一棵是枣树,另一棵也是枣树";
    console.log(str.replace("枣树","桃树"))

    var str = "一棵是\"枣树\"另一棵也是枣树"
    console.log(str);
</script>
</html>

20、计时器

<!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>计时器</title>
</head>
<body>
    
</body>
<script>
    setTimeout(fn, time)  
    // 延迟time后,执行一次fn
    setInterval(fn, time)
    // 每延迟time后,执行一次fn
	// eg:
    setTimeout(function(){
        console.log("执行")
    }, 1000);
	// eg:
    setInterval(function() {
        console.log("执行")
    }, 1000)


// 使用场景
    var timer = null;
    var count = 0;
    timer = setInterval(function() {
        count ++;
        if (count == 10) {
            clearInterval(timer)
        }
        console.log("执行")
    }, 1000)
    

</script>
</html>

21、日期对象Date()

<script>
    // Date()
    // var date = new Date(); //获取当前的时间戳
    // console.log(date);
    var date = new Date("2022-1-1 00:00:00");
    console.log(date.getFullYear());//年
    console.log(date.getMonth());  //[0,11]   月
    console.log(date.getDate());//日
    console.log(date.getDay());  //星期几

    console.log(date.getHours())//时
    console.log(date.getMinutes())//分
    console.log(date.getSeconds())//秒
    // 获取距离1970.1.1的毫秒数
    console.log(date.getTime());
</script>

22、函数补充

<!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>函数补充</title>
</head>
<body>
    <button>1</button>
    <button>2</button>
    <button>3</button>
    <button>4</button>
    <button>5</button>
</body>
<script>
    // 1. arguments
    function add() {
        var sum = 0;
        for (var i=0; i<arguments.length; i++) {
            sum += arguments[i];
        }
        return sum
    }
    var n = add(1,2,3,4,5,6,7,8);
    console.log(n)

    // 2. 匿名函数  回调函数
    var add = function(a,b) {
        return a + b;
    }
    console.log(add(1,2))

    // 3. 自执行函数
    (function(a,b,c) {
        console.log(a+b+c)
    })(1,2,3)

    // 4. 函数最后返回自身  递归函数
    // 如果随机数不大于10,就一直打印
    function shown() {
        var n = rand(0,12);
        if (n > 10) {
            return ;
        }
        console.log(n)
        shown();
    }
    shown();

    function rand(min, max) {
        return Math.round(Math.random() * (max-min) + min);
    }

    // 用setTimeout实现setInterval
    function interval() {
        setTimeout(function(){
            console.log("123123")
            interval();
        }, 1000)
    }
    interval();

    // 5.闭包
	// 局部变量数据持久化
	// 函数内部嵌套函数
    // 全局作用域不能调用局部变量
	// 造成一定内存压力
    function fn1() {
        var a = 1;
        function fn2() {
            return a;
        }
        return fn2;
    }
   var ok = fn1()();
// eg:
    var buts = document.getElementsByTagName("button");
    // 闭包
    for (var i=0; i<buts.length; i++) {
        (function(item) {
            buts[item].onclick = function() {
                console.log(item)
            }
        })(i)
    }
    // 对象方式实现闭包功能
    for (var i=0; i<buts.length; i++) {
        buts[i].index = i;  //单独做标记
        buts[i].onclick = function() {
            // this代表当前事件的拥有者
            console.log(this.index)
        }
    }
</script>
</html>

(二)DOM操作(文档、对象、模型)

对HTML节点进行增删改查

1、树形结构

嵌套、非线性结构、非对称(HTML的标签逻辑就是树形结构)

2、DOM增加操作

(1)新建

fn createElement(标签名)      创建元素节点
fn setAttribute(name,value)      直接设置属性true包含子节点
fn cloneNode(true、false)      false 不包含

(2)插入

拼接节点      fn appendChild()
插入节点      fn insertBefore(new,old)

3、DOM删除操作

(1)删除子节点

fn removeChild();

(2)删除属性节点

fn removeAttributeNode()

4、DOM修改操作

(1)替换节点

fn replaceChild(new,old)
注意:需要用父级来调用

(2)修改属性值

fn setAttribute()

5、DOM查找操作

6、代码演示

<!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>DOM</title>
    <style>
        .ok {
            color:  red;
        }
        .yes {
            font-size: 36px;
        }
        .no {
            font-weight: 900;
        }
    </style>
</head>
<body>
    <!-- <div id="wrap">
        <p id="zy" class="ok">赵云</p>
        <p id="dw">典韦</p>
        <p id="mc">马超</p>
    </div> -->

    <ul>
        <li>两个黄鹂鸣翠柳</li>
        <li class="ok yes">一行白鹭上青天</li>
        <li>窗含西岭千秋雪</li>
        <li>门泊东吴万里船</li>
    </ul>
</body>
<script>

    var dWrap = document.getElementById("wrap");

    // 1. 增加
    var p1 = document.createElement("p");
    p1.innerHTML = "诸葛亮";
    // 将p1放在指定位置
    dWrap.appendChild(p1);

    var arr = ["诸葛亮","司马懿","郭嘉"];
    for (var i=0; i<arr.length; i++) {//创建p标签
        var p = document.createElement("p");
        p.innerHTML = arr[i];
        dWrap.appendChild(p);
    }
	
	// eg:将荀彧插入到诸葛亮前面

    // 获取诸葛亮的p标签
    var pZhuge = document.getElementsByTagName("p")[0];
	// 设置id、class等属性
    pZhuge.setAttribute("id","zg");
    pZhuge.setAttribute("class","ok");
	// 同作用:
    // pZhuge.id = "zg";
    // pZhuge.className = "ok";

    /* pZhuge.myname = "zhang";
     通过setAttribute设置的自定义属性通过点语法是不能调用的
    pZhuge.setAttribute("myname","zhang");
    console.log(pZhuge);
    console.log(pZhuge.getAttribute("myname"))*/

    var p = document.createElement("p");
    p.innerHTML = "荀彧";
    dWrap.insertBefore(p, pZhuge);
     // 克隆节点dWrap
    var d = dWrap.cloneNode(false);
    console.log(d);

    // 2. 删除
	// 标签获取
    var dDw = document.getElementById("dw");
    // 删除子节点
    dWrap.removeChild(dDw);

    //删除属性节点 eg:
	// 获取属性节点
    var dZy = document.getElementById("zy");
    var c = dZy.getAttributeNode("class");
    //删除属性节点
    dZy.removeAttributeNode(c);

    // 3. 修改
    var dDw = document.getElementById("dw");
    var p = document.createElement("p");
    p.innerHTML = "关羽";
	// 替换
    dWrap.replaceChild(p, dDw);


    // 4. 查找
    // ES6新方法
    var dWrap2 = document.querySelector("#wrap");
	
    var dDw = document.querySelector("#wrap p:nth-of-type(2)");
	
    var dDw = document.querySelectorAll("p")[1];
	
    console.log(dDw)
// eg:
    var ul = document.querySelector("ul");
    ul.firstElementChild.style.color = "yellow";
    ul.lastElementChild.style.color = "cyan";

    var li1 = document.querySelectorAll("li")[0];
    
    var li2 = li1.nextElementSibling;
    // 兼容写法
    // var li2 = li1.nextSibling.nodeType === 1 ? li1.nextSibling : li1.nextElementSibling;
    console.log(li2);
    li2.style.color = "red";
    li2.className = "ok yes";

    // console.log(li2.parentNode)

    // 获取所有子节点
    var lis = ul.children   推荐
    var lis = ul.childNodes;
    console.log(lis);

    // 操作
	// 通过classList控制样式
    var li2 = document.querySelector("ul li:nth-of-type(2)");
    li2.classList.add("no");
    li2.classList.remove("yes");
    li2.classList.replace("yes", "no");
	//判断是否包含OK
    console.log(li2.classList.contains("ok"))
    li2.classList.toggle("no", false);
    li2.classList.toggle("no", false);
</script>
</html>

7.案例见CSDN文件夹 

手风琴效果、瀑布流、拓展版瀑布流、选字游戏、购物车、滑块效果、选项卡、百度换肤、仿微博添加推荐标签、轮播图、关灯游戏。

(三)BOM操作(浏览器、对象、模型)

1、BOM简介

获取浏览器提供的一些列信息

2、window对象

(1)window是浏览器留给js的大入口,全局变量是window的属性,全局函数是window的方法。

(2) 窗口位置:

screenLeft返回浏览器窗口左上角相对于当前屏幕左上角的水平距离,不兼容FF浏览器。
screenTop返回浏览器窗口左上角相对于当前屏幕左上角的垂直距离,不兼容FF浏览器。
screenX功能同screenLeft,兼容FF。
screenY功能同screenTop,兼容FF。

(FF为Firefox)

(3) 窗口大小(IE9以下不兼容): 

innerWidth返回网页在当前窗口中可见部分的宽度,包含滚动条宽度。
innerHeight返回网页在当前窗口中可见部分的高度,包含滚动条高度。

outerWidth返回浏览器窗口宽度,包含浏览器菜单和边框。
outerHeight返回浏览器窗口高度,包含浏览器菜单和边框。

(4)打开窗口

window.open():

打开一个新的浏览器窗口,接受四个参数
(URL/打开方式/窗口参数/是否取代当前页面历史记录的布尔值)

_blank:在新窗口中浏览新的页面。
_self:在同一个窗口打开新的页面。
_parent:在父窗口中打开新的页面。(页面中使用框架才有用)
_top:以整个浏览器作为窗口显示新页面。(突破了页面框架的限制)

第三个参数示例   width=500,height=500

window.close():
关闭新打开的窗口(仅限open()打开的窗口)

3、scree(屏幕信息)和history(历史信息)

(1)scree(屏幕信息)

功能:包含显示设备的信息。

个别属性列举:
screen.height、screen.width返回设备的分辨率。
screen.availWidth、screen.availHeight返回屏幕可用宽高,值为屏幕的实际大小减去操作系统某些功能占据的空间,如系统任务栏。

(2)history(历史信息)

功能:保存用户上网的历史记录。

方法、属性:
go()在用户历史记录中任意跳转,接受一个参数,表示前后跳转页数的整数值(后退一页-1,前进一页1),也可传字符串参数,跳转到第一个包含该字符串的位置。
back()后退。
forward()前进。
length属性保存历史记录的数量。

4、location

(1)功能:保存当前文档信息、将URL解析为独立片段。

(2)属性:

href    返回当前页面完整的URL、修改这个属性,即跳转新页面。
hash   返回URL中的hash(#号后跟零或多个字符)。
host    返回服务器名称和端口号。
port     返回服务器端口号。
pathname      返回URL中的目录和文件名。
hostname      返回不带端口号的服务器名称。
protocol         返回页面使用的协议(http://或 https://)。
search           返回URL的查询字符串,字符串以问号开头。

5、navigator(浏览器状态信息)

提供一系列属性用于检测浏览器

onLine:是否联网

userAgent:浏览器嗅探、检测浏览器的类型

6、判断移动端

<!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>demo</title>
    <style>
        .blue {
            background-color: deepskyblue;
        }
        .red {
            background-color: tomato;
        }
    </style>
</head>
<body class="blue">
    
</body>
<script>    
    // 移动端下  屏幕是 红色的
    if (isMobile()) {
        document.body.className = "red";
    }


    //判断是否是移动端
    function isMobile() {
        var arr = ["iOS", "iPhone", "iPad", "Android"];
        var is = false;
        for (var i=0; i<arr.length; i++) {
            if (navigator.userAgent.indexOf(arr[i]) != -1) {
                is = true;
                break;
            }
        }
        return is;
    }
</script>
</html>

(四)事件操作

1、UI事件

(1)load当页面完全加载后在window上触发图片也可以触发load事件。

(2)resize当窗口大小变化时在window上触发。
(除火狐外其他浏览器会在浏览器窗口变化1像素时就触发事件,而火狐是在用户停止调整窗口大小时才触发。不建议在此事件中加入大计算量代码,因为可能频繁执行,导致浏览器速度变慢。另外窗口最大最小化也会触发事件)

(3)scroll当用户滚动带滚动条的元素中的内容时,在该元素上面触发。(overflow:scroll)

2、鼠标事件

(1)事件类型:

onclick(单击)

ondblclick(双击)
oncontextmenu(右键菜单)
onmouseover(移入)
onmouseout(移出)
onmouseenter(移入)
onmouseleave(移出)
onmousedown(按下)

onmouseup(抬起)
onmousemove(移动)

<script>
    var d = document.querySelector("div");
    var sec = document.querySelector("section");

    // 只读属性
    // offsetLeft  offsetTop  获取标签的左侧 顶部偏移量
    // offsetWidth  offsetHeight  获取元素的宽度和高度

    d.onclick = function(e) {
        // e 事件对象 包含了该事件所有的相关信息
        // console.log("看我一记左勾拳");
        // console.log(e.clientX, e.clientY)
        // 获取点击点在标签内部的坐标
        var x = e.clientX - this.offsetLeft;
        var y = e.clientY - this.offsetTop;
        console.log(x, y);
    }
    // d.ondblclick = function() {
    //     console.log("双击")
    // }
    // d.oncontextmenu = function() {
    //     console.log("单击")
    // }

    // d.onmouseover = function() {
    //     console.log("over")
    // }
    // d.onmouseout = function() {
    //     console.log("out")
    // }
    // // over与out在指针进入子级时会进行触发,无特殊要求,建议使用enter和leave
    // d.onmouseenter = function() {
    //     console.log("enter")
    // }
    // d.onmouseleave = function() {
    //     console.log("leave")
    // }
    // d.onmousedown = function() {
    //     console.log("down");
    // }
    // d.onmouseup = function() {
    //     console.log("up");
    // }
    // d.onmousemove = function() {
    //     console.log("move");
    // }
</script>

(2)坐标位置(先学习事件对象): 

 screenX在屏幕中的x坐标。

screenY在屏幕中的y坐标。

相对于body:
clientX表示事件发生时鼠标指针在视口中的水平坐标(不包含滚动距离);
clientY在视口中的垂直坐标;

IE没有以下两个属性:
pageX在页面中的x坐标(包含滚动距离);
pageY在页面中的y坐标;

获取点击目标的坐标(有兼容性):offsetX,offsetY

3、键盘事件

keydown当用户按下键盘上的任意键时触发,按住不动将重复触发。
keyup 当用户释放键盘上的键时触发。
event.keyCode键码。

keypress当用户按下键盘上的字符键时触发,按住不动将重复触发。
event.charCode键码(ASCII编码形式展示,需通过String.fromCharCodel()方法转换,IE9以下不支持)。
shiftkey、altkey、ctrlkey。

<!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>key</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background-color: pink;
            position: absolute;
        }
    </style>
</head>
<body>
    <div></div>
</body>
<script>
    var d = document.querySelector("div");
    // window.onkeydown = function(e) {
        // if (e.keyCode == 37) {
        //     d.style.left = d.offsetLeft - 5 + 'px';
        // } else if (e.keyCode == 38) {
        //     d.style.top = d.offsetTop - 5 + 'px';
        // } else if (e.keyCode == 39) {
        //     d.style.left = d.offsetLeft + 5 + 'px';
        // } else if (e.keyCode == 40) {
        //     d.style.top = d.offsetTop + 5 + 'px';
        // }
    // }
    // 问题:
    // 1. 先顿一下
    // 2. 不流畅
    // 3. 不支持2个键位同时按下

    // 如果要用键盘控制标签移动,需要用到定时器+状态 

    // 状态
    var isLeft = false;
    var isUp = false;
    var isRight = false;
    var isDown = false;

    //定时器
    var timer = null;

    timer = setInterval(function() {
        if (isLeft) {
            d.style.left = d.offsetLeft - 5 + 'px';
        }
        if (isRight) {
            d.style.left = d.offsetLeft + 5 + 'px';
        }
        if (isUp) {
            d.style.top = d.offsetTop - 5 + 'px';
        }
        if (isDown) {
            d.style.top = d.offsetTop + 5 + 'px';
        }
    }, 30)

    //键盘事件只改变状态
    window.onkeydown = function(e) {
        if (e.keyCode == 37) {
            isLeft = true;
        } else if (e.keyCode == 38) {
            isUp = true;
        } else if (e.keyCode == 39) {
            isRight = true;
        } else if (e.keyCode == 40) {
            isDown = true;
        }
    }
    window.onkeyup = function(e) {
        if (e.keyCode == 37) {
            isLeft = false;
        } else if (e.keyCode == 38) {
            isUp = false;
        } else if (e.keyCode == 39) {
            isRight = false;
        } else if (e.keyCode == 40) {
            isDown = false;
        }
    }
</script>
</html>

4、表单事件

focus元素获得焦点时触发;
blur元素失去焦点时触发;
submit()提交表单;
change 当input、textarea元素value值改变且失去焦点时、select元素选项改变时触发;
input当input、textarea元素value值改变同步触发事件,select元素选项改变时触发(有兼容问题,IE:onpropertychange,非E:oninput)

<!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>表单事件</title>
</head>
<body>
    <button onclick="tj()">我的提交</button>
    <form action="https://www.csdn.net/">
        <input id="ipt" type="checkbox" name="mine">
        <input type="submit">
    </form>
</body>
<script>
    var ipt = document.getElementById("ipt");
    var f = document.querySelector("form");
    // 获取焦点
    ipt.onfocus = function() {
        console.log("获取焦点")
    }

    // 失去焦点
    ipt.onblur = function() {
        console.log("失去焦点")
    }

    // 提交
    function tj() {
        f.submit();
    }

    // change 内容修改,并失去焦点
    ipt.onchange = function() {
        console.log("change")
    }
    // input 内容修改 
    ipt.oninput = function() {
        console.log("input")
    }
</script>
</html>

5、阻止冒泡

同一个事件会从子级传递向父级,称之为事件冒泡,所以有的时候我们需要阻止冒泡。

fn stopPropagation()   非IE
pro cancelBubble = true   lE

<!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>冒泡</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            margin-left: 120px;
        }
    </style>
</head>
<body>
    <div class="d1" style="background-color: pink;">
        <div class="d2" style="background-color: tomato;">
            <div class="d3" style="background-color: cyan;"></div>
        </div>
    </div>
</body>
<script>
    var d1 = document.querySelector(".d1");
    var d2 = document.querySelector(".d2");
    var d3 = document.querySelector(".d3");
    d1.onclick = function() {
        console.log("d1")
    }
    d2.onclick = function() {
        console.log("d2")
    }
    d3.onclick = function(e) {
        console.log("d3")
        //阻止冒泡
        if (e.stopPropagation) {
            e.stopPropagation();
        } else {
            e.cancelBubble = true;
        }
    }
    document.onclick = function() {
        console.log("document")
    }
    window.onclick = function() {
        console.log("window")
    }
</script>
</html>

6、阻止默认

比如右键菜单栏、P标签复制文本值等。

fn preventDefault()   非IE
pro returnValue = true   IE

<!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>阻止默认</title>
</head>
<body>
    <p>床前明月光</p>
</body>
<script>
    window.oncontextmenu = function(e) {
        // 阻止默认事件
        e.preventDefault();
    }

    var p = document.querySelector("p");
    p.onmousedown = function(e) {
        e.preventDefault();
    }
</script>
</html>

7、dom0与dom2

<script>
    // dom0
    window.onclick = function() {
        alert(1)
    }
    window.onclick = function() {
        alert(2)
    }

    // dom2
    // addEventListener(事件类型,函数,是否捕获)
    function ok() {
        alert(1);
    }
    window.addEventListener("click", ok, false)
    window.addEventListener("click", function() {
        alert(2);
    }, false)

    window.removeEventListener("click", ok)
</script>

8、捕获与冒泡

 同一个事件,由子级传递给父级称之为事件冒泡。
 同一个事件,由父级传递给子级称之为事件捕获。

<!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>冒泡与捕获</title>
    <style>
        div {
            /* width: 100px;
            height: 100px;
            margin-left: 120px; */
            padding: 50px;
        }
    </style>
</head>
<body>
    <div class="d1" style="background-color: pink;">
        <div class="d2" style="background-color: tomato;">
            <div class="d3" style="background-color: cyan;"></div>
        </div>
    </div>
</body>
<script>
    var d1 = document.querySelector(".d1");
    var d2 = document.querySelector(".d2");
    var d3 = document.querySelector(".d3");
    
    d1.addEventListener("click", function() {
        console.log("d1");
    }, true);
    d2.addEventListener("click", function() {
        console.log("d2");
    }, true);
    d3.addEventListener("click", function() {
        console.log("d3");
    }, true);

    // 同一个事件,由子级传递给父级称之为事件冒泡
    // 同一个事件,由父级传递给子级称之为事件捕获
</script>
</html>

9、事件委托

<!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>事件委托</title>
</head>
<body>
    <div>
        <button>item1</button>
        <button>item2</button>
        <button>item3</button>
        <button>item4</button>
        <button>item5</button>
    </div>
</body>
<script>
    // 一般思路
    // var buts = document.querySelectorAll("button");
    // for (var i=0; i<buts.length; i++) {
    //     buts[i].onclick = function() {
    //         console.log(this.innerHTML)
    //     }
    // }


    // 事件委托
    // 自己不想做的事情委托给别人做
    // 子级的事件全部由父级实现,通过e.target来区分
    var div = document.querySelector("div");
    div.onclick = function(e) {
        console.log(e.target.innerHTML)
    }
</script>
</html>

10、例见CSDN文件夹

放大镜、拖拽。

二、补充知识点

(一)数组

1、数组转字符串join反之solit

2、在数据前面添加新元素unshift

(二)JS

1、平滑过渡(设置延迟)

        li {
            width: 80px;
            height: 400px;
            float: left;
            background-size: cover;
            background-position: center center;
            /* 过渡 */
            transition: .3s;
        }
        li p {
            width: 80px;
            height: 400px;
            background-color: rgba(255,255,255,.5);
            color: white;
            font-size: 60px;
        }

2、只读属性
    offsetLeft  offsetTop  获取标签的左侧 顶部偏移量
    offsetWidth  offsetHeight  获取元素的宽度和高度

3、快捷生成标签案例:<div>{item$}*5

4、opacity:.5     设置透明度

5、display:nono      隐藏

6、overflow:none    隐藏

(三)所有案例见资源C1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java张金贺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值