02-JavaScript

导读

  • 文档:developer.mozilla.org

一、JavaScript基础

1、输入输出

方法说明归属
alert(msg)弹出警示框浏览器
console.log(msg)输出信息浏览器
prompt(info)输入信息浏览器

2、数据类型

  • Js是动态语言,变量的数据类型是可以变化的
var x = 10;
x = 'xiaoqing';

2.1、转移字符

  • 在字符串中需要转义字符
转义符解释说明
\n换行符
\\反协杠
\‘单引号
\‘’双引号
\ttab 缩进
\b空格

2.2、NaN

  • 非数字
var space = null;
console.log(space + 1);
输出:1

2.3、underfined

  • 未定义类型
var str;
console.log(str + "pink");
输出:underfinedpink;

2.4、typeof

  • 可以通过typeof获取数据类型
var num = 10;
console.log(typeof num);
输出:number
var num = true;
console.log(typeof num);
输出:boolean
var num = undefined;
console.log(typeof num);
输出:undefined
var num = null;
console.log(typeof num);
输出:object
var num = 'pink';
console.log(typeof num);
输出:Strign

2.5、转换成字符串

方法说明
toString()转成字符串
String()强制转换转成字符串
加号拼接字符串和字符串拼接的都是字符串

2.6、转化成数字型

方法说明备注
parseInt(String)函数将String转换成int类型会将浮点数向下取整;会将多余的单位去掉;若前面有其它字符直接NaN
parseFloat(String)函数将String转换成浮点类型会将多余的单位去掉;若前面有其它字符直接NaN
Number()强制转换函数强制转换成数值型
js隐式转换(- * /)利用算数运算隐式转换为数值型会将原来的字符串转换成int类型再进行运算console.log(‘100’ - 0);

2.7、转换成布尔类型

方法说明案例
Boolean()函数将其他类型转换成布尔类型Boolean(’true‘)
  • 代表空、否定的数值会呗转换成false,如 ‘’、0、NaN、null、undefined
  • 其余数值都会被转换为true
console.logp(Boolean('')); false
console.logp(Boolean(0)); false
console.logp(Boolean(NaN)); false
console.logp(Boolean(null)); false
console.logp(Boolean(undefined)); false
console.logp(Boolean('小白')); true
console.logp(Boolean(12)); true]

3、运算符

1、等号的使用

符号作用用法
=赋值给变量赋值
==判断判断两边数值是否相等(注意此时有隐式转换)
===全等判断两边的值和数据类型是否完全相同
//2、== 的使用
console.log(3 == 5); false
console.log('pink' == '刘德华'); false
console.log(18 == 18); true
console.log(18 == '18'); true
console.log(18 != 18); false
//3、=== 数据类型和数值都是要保持一致
console.log(18 === 18); true
console.log(18 == '18'); false

2、运算优先级

优先级运算符顺序
1小括号()
2一元运算符++ – !
3算数运算符先*/
4关系运算符> >= < <=
5相等运算符== != === !==
6逻辑运算符先 && 后 ||
7赋值运算符=
8逗号运算符

4、流程控制-分支

5、数组

var arr = new Array();
var arr = [];
var arr1 = [1,2,'pink',true];

6、函数

方法说明备注
getSum(a,b)将a到b的所有数值相加

1、声明函数

//第一种常用方式
function sayHi(){
    console.log('hi~~');
}
//第二种可以将返回值赋值给变量
var getSum = function (){
    return 100;
}

2、arguments使用

  • arguments是用来存放实参的数组,可以使用数组的方式进行访问
function fn(){
    consolo.log(arguments);
}
fn(1,2,3);

7、作用域

js中不存在块级作用域,if {} for {}

if(3 < 5){
    var num = 10;
}
consolo.log(num) // 10

作用域链

  • 采取就近原则来查找变量
<script>
	var num = 10;
	function fn() {
        var num = 20;
        function fun(){
            console.log(num); // 20;
        }
    }
	
</script>

8、预解析

  • 我们js引擎运行js 分为两步:预解析、代码执行
    • 预解析js 引擎会把js里面所有得 var 还有function 提升到当前作用域的最前面
    • 代码执行 按照代码书写的顺序从上往下执行
  • 预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
    • 变量提升:就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操纵
    • 函数提升:就是把所有的函数声明提升到当前作用域的最前面 不调用函数
//问题一
console.log(num); 
var num = 10;
------预处理------
var num;
conosle.log(num);
num = 10;
结果:undefined

//问题二
fn()
function fun(){
    console.log(11);
}
//结果:11

//问题三
fun();
var fun =  function(){
    console.log(22)
}
-----预处理-----
var fun;
fun();
function fun(){
    console.log(22);
}
//答案:报错

//问题四
f1();
console.log(c);
console.log(b);
console.log(a);
function f1(){
    var a = b = c = 9;
    console.log(a);
    console.log(b);
}
----预处理----binaliang
function f1(){
    var a; // 局部变量
    a = b = c = 9; // b and c 相当于全局变量
    console.log(a); 9
    console.log(b); 9
    console.log(c); 9
}
f1();
console.log(c); 9
console.log(b); 9
console.log(a); // 因为a是局部变量,所以是error
  • 糖:旺仔四袋
  • 水:椰子水24 两箱、王老吉24 四箱、花生牛奶 两箱

9、对象

创建对象

var ovj = {
    username = '张三丰',
    age: 18,
    sex: '男',
    sayHi: function(){
        console.log('h1~')
    }
}

构造函数

  • 不需要return
function Star(username,age,sex){
    this.name = username;
    this.age = age;
    this.sex = sex;
    this.sing = function(song){
        console.log(song);
    }
}
var temp = new Star('sdaf',123,'男');
temp.sing('冰雨');

遍历对象

for(var k in obj){
    console.log(k); // k变量输出得到的是属性名
    console.log(obj[k]) // obj[k]得到的是属性值
}

10、内置对象

1、Date日期

1.1、使用
var data = new Date();
console.log(data); // 返回当前系统的时间
var data1 = new Date(2019,10,1);
console.log(data1); //  返回的是11月 不是 10月
var data2 = new Date('2019-10-1 8:8:8');
console.log(date2); 
1.2、格式化
function getTime() {
    var time = new Date();
    var h = time.getHours();
    h = h < 10 ? '0' + h : h;
    var m = time.getMinutes();
    var s = time.getSeconds;
    return h + ':' + m + ':' + s;
}
1.3、获得Date总的毫秒数
//1、
var date = new Date();
consolo.log(date.valueOf());
console.log(date.getTime());
//2、常用方法
var date = +new Date();
console.log(date);
//3、H5 新增的
console.log(Date.now());

2、数组

数组的创建
var arr = [1,2,3];
console.log(arr[0]);
//2、
var arr = new Array(2); // 数组的长度是二
//3、
var arr = new Array(2,3);
console.log(arr); // [2,3]
判断数据类型
  • 判断数组有两个办法,一个是instanceof另外一个则是Array.isArray(arr)
//1、
var arr = [];
var obj = {};
console.log(arr instanceof Array);
//2、
console.log(Array.isArray(arr));
添加和删除元素
方法说明返回值
push(参数1,…)在数组的末尾添加元素返回的是添加元素过后的数组长度
pop()删除数组最后的一个元素返回的是删除元素的数值
unshift(参数一,…)想数组的开头添加一个元素或者是多个元素返回新数组的长度
shift()删除数组的第一个元素返回的是删除元素的数值
数组的排序
方法说明
arr.reverse()数组反转
arr.sort()数组按照指定的方式进行排序(默认值比较第一个数字)
var arr = [13,4,77,1,7];
arr.sort(function(a,b){
    return a-b;
})
数组索引方法
  • 如果元素重复则返回第一个所索号
方法说明返回值
indexOf()数组中查找给定元素的第一个索引如果存在返回索引号,如果不存在则返回-1
lastIndex()在数组中的最后一个的索引如果存在返回索引号,如果不存在则返回-1
案例
  • 去除重复的元素
function unique(arr){
    var newArr = [];
    for(var i = 0; i < arr.length; i++){
        if(newArr.indexOf(arr[i]) === -1 ){
            newArr.push(arr[i]);
        }
    }
    return newArr;
}
转换成字符串
方法说明返回值
toString转换成字符串字符串
join(‘分隔符’)可以通过自定的分隔符来转换成字符串字符串
concat()连接两个或者多个数组 不影响原数组返回一个新的数组
slice()数组截取slice(begin,end)返回被截取项目的新数组
splice()数组删除splice(第几个开始,要删除个数)返回被删除项目的新数组,注意这个会影响原数组

3、字符串

  • 查找字符串“aksdjflajsdlfkj”中所有a的位置以及次数
var index = str.indexOf('a');
while(index !== -1){
	console.log(index);
	index = str.indexOf('a',index + 1);
}
根据位置返回字符
方法名说明使用
charAt(index)返回指定位置的字符(index 字符串的索引号)str.charAt(0)
charCodeAt(index)获取指定位置处字符的ASCII码(index索引号)str.charCodeAt(0)
str[index]获取指定位置处字符HTML5
o[‘属性名’]判断该对象中是否存在该属性o[‘sex’]
案例
  • 找到"aksdjflajsdlfkj"中出现次数最多的字符
var a = {};
for(var i = 0; i < str.length; i++){
    var data = str.charAt(i);
    if(a[data]){
        a[data]++;
    }else{
        a[data] = 1;
    }
}
var max = 0;
var item = '';
for(var k in a){
    if(max < a[k]){
        item = k;
        max = a[k];
    }
}
字符串操作方法
方法名说明
concat(str1,str2)拼接字符串
substr(str,length)从start位置开始,length 取得个数重点记住这个
slice(str,end)从start位置开始,截取到end位置(不包括end)
subString(start,end)跟slice一样,但是不接受负数
replace(‘被替换的字符’,‘字符’)替换字符
split(‘分隔符’)将字符转换成数组
toUpperCase()转换成大写
toLowerCase()转换成小写

11、简单类型与复杂类型

  • 简单数据类型:是存放在栈里面 里面直接开辟一个空间存放的是值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jEIu45jH-1678617038938)(D:\01_Software\03-markdownImages\image-20221231103442526.png)]

  • 复杂数据类型:首先在栈里面存放地址 十六进制 然后这个地址指向堆里面的数据
  • 从新的赋值会直接影响堆里面的数据的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4uoRYlKa-1678617038939)(D:\01_Software\03-markdownImages\image-20221231110428793.png)]

二、Web APIS

1、DOM

获取页面元素

  • 根据 ID 获取
  • 根据标签名获取
  • 通过 HTML5 新增的方法获取
  • 特殊元素获取
根据 ID 获取
  • console.log():打印我们返回的元素对象 更好的查看里面的属性和方法
var time = document.getElementById('time');

console.dir(time);
根据标签名获取
  • 得到的是一个对象的集合,所以我们想要操作里面的元素就需要遍历
  • 得到元素对象是动态的
  • 是以伪数组的形式存储的
var ol = document.getElementByTagName('ol');
var lis = ol[0].getElementByTagName('li');
console.log(lis[0]);
根据类名来获取元素
var boxs = document.getElementByClassName('box');
cn
通过 HTML5 新增的方法获取
  • document.querySelector(‘id或者元素标签’):返回指定选择器的第一个元素对象
    • 里面的选择器需要加符号:.box/#nav
var box = document.querySelector('.box');
var nav = document.querySelector('#nav');
  • document.querySelectorAll(‘li’):返回指定选择器的所有元素对象集合
var allBox = document.querySlectorAll('.box');
特殊元素获取
  • 获取body元素
var body = document.body 
  • 获取html元素
document.documentElement

事件基础

事件三要素
  • 事件源:事件被触发对象

    • var btn = document.getElementByid('btn')
      
  • 事件类型:事件被触发什么事件,比如鼠标单点

  • 事件处理程序:通过一函数赋值的方式 完成

    • btn.onclick = function(){ alert('点秋香') }
      

操作元素

鼠标事件触发条件
onclick鼠标点击左键
onmouseover鼠标经过
onmouseout鼠标离开
onfocus获取鼠标焦点
onblur市区鼠标焦点
onmousemobe鼠标移动触发
onmouseup鼠标弹开
onmousedown鼠标按下
改变元素内容
  • element.innerText:从起始位置到终止位置的内容,但它取出html标签,同时空格和换行也会被去掉
  • element.innerHTML:起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行。
var div = document.querySelctor('div');
div.innerText = '2019-06-06';
  • InnerText和InnerHTML区别

    • innnerText:不识别html标签,同时空格和换行也会被去掉
    • InnerHTML:识别html标签
  • 案例:根据按钮更换照片

var a = document.getElemenetById('a');
var b = document.getElemenetById('b');
var img = document.querySelector('img');
a.onclick = function(){
    img.src = 'images/b.jpg';
}
b.onclick = function(){
    img.src = 'images/a.jpg';
}
  • 案例:根据不同的时间段选择不同的照片
var img = document.querySelector('img');
var img = document.querySelector('div');
var date = new Date();
var h = date.getHours();
if(h < 12){
    div.innerHTML = '早上好';
}else if(h < 18){
    div.innerHTML = '中午好';
}else{
    div.innerHTML = '晚上好';
}
表单元素的属性操作
btn.onclick = function(){
    input.value = '被点击了';
    this.disabled = true;//禁用按钮
}
  • 案例显示密码
eye.onclick = function(){
    if(flag == 1){
        img.src = 'open.img';
        flag = 0;
        input.type = 'text';
    }else{
        img.src = 'cloes.img';
        flag = 1;
        input.type = 'password';
    }
}
修改样式属性
  • js 修改的样式操作,产生的是行内样式,Css权重比较高

1、emleemnt.style 行内样式操作

2、element.className 类名样式操作

div.onclick = function(){
    this.style.backgourdCorlor = 'pink';
}
  • 案例:隐藏盒子
btn.onclick = function(){
    box.style.display = 'none';
}
  • 案例:精灵图用法
var lis = document.querySelectorAll('li');
for(var i = 0 ;i < lis.length; i++){
    lis[i].style.backgourPosition = '0 -'+44 * i +'px';
}
排他思想
var btns = document.querySelctoryAll('button');
for(var i = 0; i < btns.length; i++){
    btns[i].onclick = function(){
        for(var i = 0; i < btns.length; i++){
             btns[i].style.backgroudColor = '';
        }
        this.style.backgroundColor = 'pink';
    }
}
切换背景图
var imgs = document.querSelector('div').querSelectorAll('img');

for(var i = 0; i < imgs.length; i++){
    imgs[i].onclick = function(){
        document.body.style.backgroundImage = 'url('+this.src+')';
    }
}
表单隔行变色
var trs = document.querySelectAll('tr');
for(var i = 0; i < trs.length; i++){
    trs[i].onmouseover = function(){
        this.style.backgourndColor('pink');
    }
    trs[i].onmouseout = function(){
        this.style.backgourndColor('');
    }
    
}
全选按钮
  • this.checked:可以获取复选框的状态
var checkboxAll = document.querySelctory('.cbAll')
var checkboxs = document.querySelectory('tbody').querySlectoryAll('input');
checkboxAll.onclick = function(){
    for(var i = 0; i < checkboxs.length; i++){ 
        checkboxs[i].checked = this.checked;
    }
}

for(var i = 0; i < trs.length; i++){
    var falg = true;
    checkboxs[i].onclick = function(){
       for(var i = 0; i < trs.length; i++){
           if(!checkboxs[i].checked){
               flag = false;
               break;
           }
       }
       checkboxAll.checked = flag;

    }
}
自定义属性的操作

1、获取属性值

  • element.属性 获取属性值
  • element.getAttribute(‘属性’)

区别

  • element.属性 获取内置属性值
  • element.getAttribute(‘属性’); 主要获取自定义的属性数值

2、设置属性值

  • element.属性 = ‘值’
  • element.setAttribute(‘属性’,‘数值’);
Tab切换导航栏
var navs = document.querySelectoryAll('li');
var divs = docuemnt.querySelectoryAll('div');
for(var i = 0; i < navs.length; i++){
    navs[i].onclick = function(){
        //1、导航栏切换更换底色
        for(var i = 0; i < navs.length; i++){
            navs[i].style.backgrouedColor = '';
        }
        this.style.backgrouedColor = 'red';
        //2、显示出导航栏相对应的模块
        for(var i = 0; i < navs.length; i++){
            divs[i].style.display = 'none';
        }
        divs[i].style.display = 'bolck';
    }
}
H5 自定义属性
  • 自定义属性目的:是为了保存并使用数据

1、设置 H5 自定义属性

<div data-index = " 1 "></div>

2、获取 H5 自定义属性

  • 兼容性获取:element.getAttribute(‘data-index’);
  • H5新增element.dataset.index 或者 element.dataset[‘index’] ie11才支持

结点操作

父结点
var node = document.querySelector('div');
var parent = node.parentNode;
  • parentNode属性返回某结点的父结点,注意是最近的一个父结点
  • 如果指定的节点没有父结点则返回null
子节点
  • parentNode.childNodes 返回包括指定节点的子节点,包括文本节点(不提倡使用)
parentNode.childNodes;
  • children:获取所有的子元素结点(推荐使用)
    • parentNode.firstChildren:获取子元素的第一个文本结点或这个是元素结点(不推荐)
    • parentNode.firstElementChild:返回第一个子元素结点(IE9以上)
    • parentNode.lastElementChiled:返回最后一个子元素结点(IE9以上)
  • 实际开发
var ol = document.querySelectory('ol');
第一个节点:ol.children[0]
最后一个节点:ol.children[ol.children.length - 1];
下拉菜单
var nav = document.querySelectory('.nav');
var lis = nav.children;
for(var i = 0; i < lis.length; i++){
 	 lis[i].onmouseover = function(){
         this.children[1].style.display = 'bolck';
     } 
     lis[i].onmouseover = function(){
         this.children[1].style.display = 'none';
     } 
    
}
兄弟节点
  • div.nextSibling:下一个兄弟节点
  • div.previousSibing:上一个兄弟节点

2、元素节点

  • div.nextElementSibling:下一个兄弟节点
  • div.previousElementSibing:上一个兄弟节点
创建节点
  • append:在元素的末尾追加元素
  • insertBefore:可以指定在元素的某个位置添加
var li = document.createElement('li');
var ul = document.querySelector('ul');
ul.appendChild(li);
ul.insertBefore(li,ul.children[0]);
案例:留言框
var btn = document.querySelector('button');
var text = document.querySlector('textarea');
var ul = document.querySelector('ul');
btn.onclick = function(){
    //当点击发布时创建小li
    var li = document.createElement('li');
    li.innerHTML = text.value;
    ul.appendChild(li);
}
删除节点
node.removeChild(child);
删除评论
var btn = document.querySelector('button');
var text = document.querySlector('textarea');
var ul = document.querySelector('ul');
btn.onclick = function(){
    //当点击发布时创建小li
    var li = document.createElement('li');
    li.innerHTML = text.value + "<a href="javascript:;">删除</a>";
    ul.appendChild(li);
    var as = document.querySelectory('a');
    for(var i = 0; i < as.length; i++){
        as[i].onclick = function(){
            ul.removeChild(this.parentNode);
        }
    }
}
赋值节点
  • node.cloneNode(fase):浅拷贝,只会复制元素的结构
  • node.cloneNode(true):深拷贝,克隆整个元素
var lili = ul.children[0].cloneNode();
动态创建单元格
var users = [
{
  name: '张三丰',
  age: 18,
  sex: '男'
},
{
  name: '张三丰',
  age: 18,
  sex: '男'
},
{
  name: '张三丰',
  age: 18,
  sex: '男'
},
]
var tbody = document.querySelector('tbody');
//1、动态生成tr
for(var i = 0; i < users.length, i++){
    var tr = document.createElement('tr');
    tbody.appendChild(tr);
    //2、添加列属性
    for(var k in users[i]){
        var td = document.createElement('td');
        td.innerHTML = users[i][k];
        tr.appendChild(td);
    }
    var del = document.createElement('td');
    del.innerHTML = '<a href="javascript:;">删除</a>';
    tr.appendChild(del);
}

//删除操作
var as = document.querySelector('a');
for(var i = 0; i < as.length;i++){
    as[i].onclick = function(){
        //删除所在节点的父元素结点
        tbody.removeChild(this.parentNode.parentNode);
    }
}
三种动态创建元素区别
  • document.write()
  • element.innerHTML
  • document.createElement()

区别

1、document.write 是直接将内容跟写入页面的内容流,但是文档流执行完毕,则它会导致整个页面重绘

2、innerHTML 是将内容写入某个 DOM 结点,不会导致页面全部重绘

3、innerHTML 创建多个元素效率更高(不要拼接字符串,采用数组形式拼接)

4、createElement() 创建多个元素效率稍低一点,但是结构更清晰

总结:不同浏览器下,innerHTML 效率要比 createElement 高

事件高级

addEventListener 事件监听方式
eventTarget.addEventListener(type, listener[, userCapture]);
  • type:事件类型字符串,比如click、ouseover,注意这里不要带on
  • listener:事件处理函数,事件发生时,会调用该监听函数
  • userCapture:可选参数,是一个布尔值,默认false。
var btn = document.querSelector('button');
btn.addEventListener('click',funtion(){
        alter('你好');
})
removeEventListener 事件删除方式
var btn = document.querSelector('button');
btn.addEventListener('click',fn);
function fn(){
    alert('你好');
    removeEventListener('onclick',fn);
}

事件流
  • 事件发生事结点之间按照特定的顺序传播,这个传播过程就是DOM事件流

注意:

1、捕获:document -> html -> father -> son

2、冒泡:son -> father -> html -> document

3、js 代码中只能执行其中一个阶段

4、onclick 和 attachEvent 只能得到冒泡阶段

5、addEventListener(type, listener[, useCapture])第三个参数如果时 true ,表示在事件捕获阶段调用事件处理程序;如果false(默认为false),标识在事件冒泡阶段调用事件处理函数

6、冒泡事件有时候会代来麻烦,有时候又会帮助很巧妙地左某些事件

事件对象
  • event:事件对象,该事件对象是内置对象,可以得到鼠标相关信息
  • 兼容性: e = e || windown.event
div.onclick = function(event) {}
事件对象的属性和方法
事件对象属性方法说明
e.target返回触发事件的对象 标准
e.type返回触发事件的类型 比如 click mouseover 不带on
e.cancel该属性阻止冒泡 非标准
e.returnValue该属性 阻止默认事件 比如:不让连接跳转
e.preventDefault()该方法 阻止默认事件 标准 比如:不让链接跳转
e.stopPropagation()阻止冒泡 标准
事件委托/委派
  • 不是给每个子节点添加事件,儿是将事件监听器设置在父结点上,通过冒泡原理影响到每一个子节点上。
<ul>
    <li>asdljkldjf</li>
    <li>asdljkldjf</li>
    <li>asdljkldjf</li>
    <li>asdljkldjf</li>
</ul>
var ul = docuemnt.querySelector('ul');
ul.addEventListener('click', functionc(){
    alter('给所有的li添加了事件元素');
})
鼠标事件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Chb10Kth-1678617038940)(D:\01_Software\03-markdownImages\image-20230104090654654.png)]

  • 禁用鼠标右键
document.addEvetListener('contextmenu', function(e){
         e.preventDefault();                
})
  • 禁止选文字 selectstart
document.addEventListner('selectstart', function(e){
        e.preventDefault();                 
})
键盘事件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CYZ08INA-1678617038940)(D:\01_Software\03-markdownImages\image-20230104091300596.png)]

  • keyon和keydown:是不区分字母的大小写的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mHPCahjb-1678617038941)(D:\01_Software\03-markdownImages\image-20230104091924848.png)]

案例:京东搜索框
var serach = document.querySelectory('input');
document.addEvenetListener('keyup',function(){
    if(e.keyCode === 83){
        serach.focus();
    }
})
案例:京东搜索框放大效果
var serach = document.querySelector('input');
var fangda = document.querySelector('div');
serach.addEventListener('keyup',funtion(){
    //当用户按下s键快速获得焦点  
    if(e.keyCode === 83){
        serach.focus();
    }
	//当没有文字时就将放大域隐藏
	if(this.value == ''){
       fangda.style.display = 'none';
    }else{
       fangda.style.display = 'block';
       fangda.value = this.value;
    }	
})
//当搜索框焦点时放大框隐藏
	serach.addEventListener('blur',function(){
        fangda.style.display = 'none';
    })
	serach.addEventListener('focus',function(){
        fangda.style.display = 'bolck';
    })

2、BOM

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k119gZQo-1678617038941)(D:\01_Software\03-markdownImages\image-20230104104429087.png)]

window 对象的常用事件

窗口加载事件
  • 当页面元素全部图片加载完以后才会执行处理函数
window.onlocad = function(){}
windown.addEvenListener("load",function(){});
  • 只要dom元素加载完以后就会执行
document.addEventListener('DOMContentLoaded', function(){
    alter(33);
})
调整窗口大小事件
window.addEventListener('resize',function(){
    alter('变化');
})
案例:达到一定宽度就隐藏盒子
window.addEventListener('load',function(){
    var div = document.querySlector('div');
    window.addEventListener('resize',function(){
        if(window.innerWidth <= 800){
            div.style.display = 'none';
        }else{
            dis.style.display = 'block';
        }
    }
    
})

定时器

setTimeout() 定时器

1、window.setTimeout(回调函数,延时毫秒);

//1、
setTimeout(function(){
    console.log('时间到了')
},2000)

//2、
function timeOut(){
    console.log('123')
}
var time1 = setTimeOut(timeOut,2000);

2、停止定时器

clearTimeOut(time1);
setInterval() 定时器

1、window.setInterval(回调函数,延时毫秒)

//1、
setInterval(function(){
    console.log('时间到了')
},2000)

//2、
function timeOut(){
    console.log('123')
}
var time1 = setInterval(timeOut,2000);

2、暂停定时器

window.clearInterval(intervalID);
两个定时器的区别
  • setTimeout:延时事件到了,就去调用这个回调函数,只调用依次 就结束这个定时器
  • setInterval:会一直调用该函数
案例:倒计时
var targetTime = +new Date('1919-10-10');
function time(){
    var curTime = +new Date():
    timeData = (curTime - targetTime) / 1000; // 剩余秒数
    var day = timeData / 60 / 60 / 24;
    day = day < 10 ? '0' + day : day; 
    var hour = timeData / 60 / 60 % 24;
    hour = hour < 10 ? '0' + hour : hour; 
    var minute = timeData / 60 % 60;
    minute = minute < 10 ? '0' + minute : minute; 
    var second = timeData % 60;
    second = second < 10 ? '0' + second : second; 
}
time();
setInterval(time(),1000);
案例:发送短信
//获取发送按钮
var btn = docuemnt.querySelector('button');
//给发送按钮设定点击事件,点击按钮时
btn.addEventListener('click',function(){
    btn.disabled = true;
    var time = 3;
    var timeOut = setTimeOut(function(){
        if(time == 0){
            time = 3;
            btn.disabled = false;
            btn.innerHTML = '发送';
            clearTimeOut(timeOut);
        }
        time--;
        btn.innerHTML = '剩余'+time+'秒';
        
    },1000)
})

JS执行机制

  • 为了解决js单线程的问题,利用多喝CPU的计算能力,HTML5提出 Web Worker 标准,允许 JavaScript 脚本多个线程。于是js中出现了同步和异步。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RcNiI1gX-1678617038941)(D:\01_Software\03-markdownImages\image-20230104124144828.png)]

执行机制

1、先执行执行栈中的同步任务。

2、异步任务(回调函数)放入任务队列中

3、一旦执行中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈哪,开始执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wue76y4d-1678617038942)(D:\01_Software\03-markdownImages\image-20230104124526059.png)]

异步任务
  • 一般而言,异步任务有以下三种类型:

1、普通时间,如click、resize等

2、资源加载,如load、error等

3、定时器,包括setInterval、setTimeout等L

location 对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0iglRbrW-1678617038942)(D:\01_Software\03-markdownImages\image-20230104142906701.png)]

localtion对象的属性
location对象属性返回值
localtion.href获取或者设置整个URL
loclation.host返回主机(域名) www.itheima.com
location.port返回端口号 如果未写返回 空字符串
localtion.pathname返回路劲
localtion.search返回参数
localtion.hash返回片段 #后面内容 常用于链接 锚点
localtion对象的方法
方法说明
localtion.assign(“www.baidu.com”)重定向(可以后退)
localtion.replace(“www.baidu.com”)替换当前页面不能后退
location.reload()刷新页面,如果有形参true,就相当于强制刷新(Ctrl + F5)
案例:页面跳转倒计时
var times = 5;
setInterval(function(){
    if(times){
        localtion.href = 'www.baidu.com';
    }else{  
        div.innerHTML = '还有' + times + '秒跳转链接';
        times--;
    }
    
},5)
案例:数据不同页面的传递
console.log(location.serach); // ?username=andy
var namePath = location.serach.substr(1);
var arr = username.split('=');
var userName = arr[1] 

Navigator对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T2wlpTWd-1678617038942)(D:\01_Software\03-markdownImages\image-20230104145323324.png)]

history对象

方法说明
back()可以退后功能
forward()前进功能
go(参数)前进后退功能 参数如果是1就是前进 如果是-1就是后退

三、PC 端网页特效

元素偏移量 offset 系列

offset系列属性作用
element.offsetParent返回该元素带有定位的父结点
element.offsetTop返回 元素相对带有定位父元素上边框的偏移
element.offsetLeft返回 元素相对带有定位父元素左边框的偏移
element.offsetWidth返回自身包括padding、边框、内容区的宽度。返回不带单位
element.offsetHeight返回自身包括padding、边框、内容区的高度。返回不带单位

offset和style区别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NfELPObq-1678617038943)(D:\01_Software\03-markdownImages\image-20230104150711327.png)]

案例:获取鼠标在盒子内的坐标

box.addEventListener('click',function(e){
    var pagex = e.pageX;
    var pagey = e.pageY;
    var x = pagex - this.offsetLeft;
    var y = pagey - this.offsetTop;
})

案例:模态框的拖拽

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BNlo9l40-1678617038943)(D:\01_Software\03-markdownImages\image-20230104152408499.png)]

var title = document.querySelect('.title');
var box = document.querSelect('.box');
title.addEventListener('mousedown',function(e){
    //获取鼠标距离盒子的距离
    var x = e.pageX - title.offsetLeft;
    var y = e.pageY - title.offsetTop;
    //当鼠标移动
    function move(e){
        box.style.left = e.pageX - x;
        box.style.top = e.pageY - y;
    }
    document.addEventListener('mousemove',move());
    //当鼠标弹开
    document.addEventListener('mouseup',function(){
        document.removeEventListener('mousemove',move())
    })
})

元素的可视区 client 系列

client系列属性作用
element.clientTop返回元素上边框的大小
element.clientLeft返回元素左边框的大小
element.clientWidth返回自身包括padding、内容的宽度,不含边框,返回数值不带单位
element.clientHeight返回自身包括padding、内容的宽度,不含边框,返回数值不带单位

立即函数

//1、立即函数:不需要调用,立刻执行
function fn(){
    console.log(1);
}
fn();
//2、写法
(function(){}()) 或者 (function(){})()
(function(a,b){
    console.log(a+b);
})(1,2);

pageshow事件跟load事件的区别

  • load:在火狐浏览器中,会缓存当前的页面,当后退事件不能再次进行load监听的事件
  • pageshow::可以避免火狐浏览器的这种情况发生

元素 scroll 系列属性

属性作用
element.scrollTop返回被卷去的上侧距离,返回数值不带单位
element.scrollLeft返回被卷去的左侧距离,返回数值不带单位
element.scrollWidth返回自身实际宽度,不含边框,返回数值不带单位
element.scrollHeight返回自身实际的高度,不含边框,返回数值不带单位

案例:修改侧边栏样式

var banner = document.querySelector('.banner');
var slider = document.querySelector('.slider');
var main = docuement.querSelector('.main');
var bannerScrollTop = banner.scrollTop;
var sliderTop = slider.offsetTop - bannerScrollTop;
var mainScrollTop = main.scrollTop;
var goback = document.querySelector('.goback');
document.addEventListener('scroll',function(){
    //当页面到达banner时,改成固定定位
    if(window.pageYOffset >= bannerScrollTop){
        slider.style.position = 'fix';
        slider.style.top = sliderTop + 'px';
    }else{
        slider.style.top = '300px';
        slider.style.postition = 'absolute';
    }
    
    if(window.pageYoffset >= mainScrollTop){
        goback.style.display = 'block';
    }else{
        goback.style.display = 'none';
    }
})

三大系列总结

大小对比作用
element.offsetWidth返回自身包括padding、边框、内容去的宽度,返回数值不带单位
element.clientWidth返回自身包括padding、内容去的宽度,不含边框,返回数值不带单位
element.scrollWidth返回自身实际的宽度,不含边框,返回数值不带单位

他们主要用法:

1、offset 经常用于获取元素位置 offsetLeft offsetTop

2、client 经常用于获取元素大小 clientWidth clientHeight

3、scroll 经常用于获取滚动距离 scrollTop scrollLeft

4、注意页面滚动的距离通过 window.pageXoffset 获取

mouseenter 和mouseover的区别

mouseenter 鼠标事件

  • 当鼠标移动到元素上时就会触发 mouseenter 时间

动画函数封装

动画原理

  • 元素必须要有定位
var box = document.querySelector('.box');
var time = setInteval(function(){
    if(box.style.left >= 400){
        clearInterval(time);
    }
    box.style.left = box.style.left + 1;
},1000)

动画函数封装

function animate(obj,target){
    //为了防止多次开启定时器
    clearInterval(obj.name);
    //取名为了开启多余的空间
    obj.name = setInterval(function(){
        //缓慢减速的效果
        var step = Math.ceil((target - obj.offsetLeft) / 10);
        if(obj.offsetLeft >= target){
        	clearInterval(time);
   		}
    	obj.style.left = obj.offsetLeft + step + 'px';
    },20)
})

回调函数

function animate(obj,target,callback){
    //为了防止多次开启定时器
    clearInterval(obj.name);
    //取名为了开启多余的空间
    obj.name = setInterval(function(){
        //缓慢减速的效果
        var step = Math.ceil((target - obj.offsetLeft) / 10);
        if(obj.offsetLeft >= target){
        	clearInterval(time);
            //回调函数
            if(callback){
            	callback();    
            }
   		}
    	obj.style.left = obj.offsetLeft + step + 'px';
    },20)
})

案例:滑动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t86i8TAo-1678617038943)(D:\01_Software\03-markdownImages\image-20230105210532202.png)]

sliderbar.addEventListener('mousenter',function(){
    animate(sliderbar,-(sliderbar.offsetWidth - con.offsetWidth),function(){
        sliderbar.innerHTML = '➡';
    });
})
sliderbar.addEventListener('mouseover',function(){
    animate(sliderbar,0,function(){
        sliderbar.innerHTML = '⬅';
    });
})

常用网页特效案例

轮播图

1、当鼠标经过两边箭头显示

2、动态生成小圆圈

3、小圆圈的排他思想

4、点击小圆圈轮播图图片移动

5、两侧箭头点击事件

  • 当点击到最后一张图片时会快速的跳到第二张图片

6、克隆第一张图片

7、点击右侧按钮圆圈的样式会跟着变化

8、解决bug

9、自动播放

  • 每两秒调用事件
document.addListener("load",function(){
    //获取两个箭头的信息,以及轮播图的信息
    var focus = document.querySelector(".focus");
    var arrow_l = document.querySelector(".arrow_l");
    var arrow_r = document.querySelector(".arrow_r");
    var imgWidth = focus.offsetWidth;
    //1、当鼠标经过焦点图两边箭头显示
    focus.addListener("mouseenter",function(){
        arrow_l.style.display = "block";
        arrow_r.style.display = "block";
    })
    //鼠标离开隐藏
    focus.addListener("mouseleave",function(){
        arrow_l.style.display = "none";
        arrow_r.style.display = "none";
    }
    //2、动态生成小圆圈
    var ul = document.querySelector("ul");
    var ol = document.querySelector("ol");
    for(var i = 0; i < ul.children.length; i++){
        var li = createElement("li");
        //设置属性
        li.setAttribute("index");
        ol.appendChild(li);
        //3、小圆圈的排他思想
        li.addListener("click",function(){
           for(var i = 0; i < ol.children.length; i++){
               ol.children[i].className = "";
           }
           this.className = "current";
           //4、点击小圆圈轮播图图片移动
           var index = this.getAttribute("index");
           animate(ul,-index * imgWidth);
           circle = index;
           num = index;
        })
    }
    //把ol的第一个小li设置类名
    ol.children[0].className = "current";
    //克隆第一张图片
   	var clone = ul.children[0].clone(true);
    ul.appendChild(clone);
    //5、两侧箭头点击事件
    var num = 0;
    var circle = 0;
    arrow_r.addListener("click", function(){
        num = 
        if(num == ul.children.length){
            ul.style.left = 0;
            num = 0;
        }
    	num++;
        animate(ul,- num * imgWidth);
        
        circle++;
        for(var i = 0; i < ol.children.length; i++){
        	ol.children[i].className = '';
        }
        ol.children[circle].className = "current";
    )}
    arrow_l.addListener("click", function(){
    	num--;
        animate(ul,- num * imgWidth);
    )}
    //9、自动调用点击事件
    var timer = setInterval(function(){
        arrow_r.click();
    },2000);	
}) 

节流阀

  • 防止轮播图按钮连续点击造成播放过快。

  • 节流阀目的:当傻瓜一个函数动画内容执行完毕,再去执行下个函数动画,让事件无法连续触发。

我们可以设置一个变量 var flag = true;

if(flag){ flag = false; do something }

关闭水龙头

  • 李彤回调函数 动画执行完毕,flag = true 打开水龙头

筋斗云

1、当鼠标经过云彩就到目标位置

2、当鼠标离开云彩回到起始位置

3、点击导航栏时将云彩固定到当导航栏

var cloud = document.querySelector(".cloud");
var navs = documentt.querySelectorAll(".nav")
var current = 0;
//1、当鼠标经过云彩就到目标位置
for(var i = 0; i < navs.children.length; i++){
    //1、当鼠标经过云彩就到目标位置
    navs.children[i].addListener("mouseenter",function(){
        animate(cloud,this.offsetLeft);
    })
    //2、当鼠标离开云彩回到起始位置
    navs.children[i].addListener("mouseenter",function(){
        animate(cloud,current);
    })
    //3、点击导航栏时将云彩固定到当导航栏
    navs.children[i].addListener("click",function(){
        current = this.offsetLeft;
    })
}

四、移动端

触屏事件

触屏概述

触屏touch事件说明
touchstart手指触摸到一个 DOM 元素时触发
touchmove手指在一个 DOM 元素上滑动时触发
touchend手指从一个 DOM 元素上移开时触发

触屏对象

在实际开发中更多使用targetTouches

触摸系列说明
touches正在触摸屏幕的所有手指的列表
targetTouches正在触摸当前 DOM 元素上的手直的一个列表
chagnedTouches手指状态发生了改变的列表 从无到有 或 从有到无

拖动元素

div.addEventListener("touchstart", function (e) {
            startX = e.targetTouches[0].pageX;
            startY = e.targetTouches[0].pageY;
            x = this.offsetLeft;
            y = this.offsetTop;
        })
        //盒子当前的位置
        div.addEventListener("touchmove", function (e) {
            moveX = e.targetTouches[0].pageX - startX;
            moveY = e.targetTouches[0].pageY - startY;
            this.style.left = moveX + x + "px";
            this.style.top = moveY + y + "px";
            console.log(moveX);
            console.log(moveY);
        })

移动端常见特效

返回顶部

var goBack = docuemtn.querySelector(".goBack");
var nav = document.querySelector(".nav");
window.addEvenListener("scroll",function(){
    if(window.pageYOffset >= nav.offsetTop){
        goBack.style.display = "block";
    }else{
        goBack.style.display = "none";
    }
});
goBack.addEventListener("click".function(){
        windown.scroll(0,0);
})

click 延时解决方案

1、禁用缩放,浏览器禁用默认的双击双方行为并且去掉 300 ms的点击延时

<meta name="viewport" content="user-scalable=no">

2、引入fastclick 插件

网站链接:https://github.com/ftlabs/fastclick/tree/main/lib

常用插件

Swiper 插件的使用

中文官网地址:https://www.swiper.com.cn/

1、引入插件相关文件

2、按照规定语法使用

插件的使用总结

1、确认插件实现的功能

2、去网站查看使用说明

3、下载插件

4、打开demo实力文件,查看需要引入的相关文件,并且引入

5、赋值demo实例文件中的结构html,样式css以及js代码

移动端常用开发框架

Bootstart

  • 网站:www.bootcss.com

1、引入jquery的js文件

五、本地存储

本地存储特性

1、数据存储在用户浏览器中

2、设置、读取方便甚至页面刷新不丢失数据

3、容量较大,sessionStorage约5M、localStorage约20M

4、只能存储字符串,可以将对象JSON。stringfy() 编码后存储

window.sessionStorage

1、生命周期为关闭浏览器窗口

2、在同一个窗口(页面)下载数据可以共享

3、以键值对的形式存储使用

存储数据:

sessionStorage.setItem(key,value);

获取数据:

sessionStorage.getItem(key);

删除数据:

sessionStorage.removeItem(key);

删除所有数据:

sessionStorage.clear();

window.localStorage

1、生命周期永久生效,除非手动删除 否则关闭页面也会存在

2、可以多窗口(页面)共享(同一页面可以共享)

3、 以键值对的形式存储使用
存储数据:

localStorage.setItem(key,value);
//若是对象,则要把对象转换成json格式
localStorage,setItem("person",JSON.stringify(p))

获取数据:

localStorage.getItem(key);
console.log(JSON.parse(person))

删除数据:

localStorage.removeItem(key);

删除所有数据:

localStorage.clear();

案例

image-20230114162503560

1、把数据存入本地存储中

2、关闭页面,也可以显示用户名,所以用到localStorage

3、打开页面,先判断是否有这个用户名,如果有,就在表单里面显示用户名,并且勾选复选框。

4、当复选框发生改变的时候change事件

5、如果勾选,就存储,否则移除

var username = document.querySelector("#username");
var remember = document.querySelector("#remember");
//如果本地存储中有username 则直接显示
if(localStorage.getItem("username")){
    username.value = localStorage.getItem("username");
    remember.checked = true;
}
//当复选框发生改变的时候change事件
remember.addEventListener("change",function(){
    if(remember.checked){
        localStorage.setItem("username",username);
    }else{
        localStorage.removeItem("username");
    }
})

/lib

常用插件

Swiper 插件的使用

中文官网地址:https://www.swiper.com.cn/

1、引入插件相关文件

2、按照规定语法使用

插件的使用总结

1、确认插件实现的功能

2、去网站查看使用说明

3、下载插件

4、打开demo实力文件,查看需要引入的相关文件,并且引入

5、赋值demo实例文件中的结构html,样式css以及js代码

移动端常用开发框架

Bootstart

  • 网站:www.bootcss.com

1、引入jquery的js文件

五、本地存储

本地存储特性

1、数据存储在用户浏览器中

2、设置、读取方便甚至页面刷新不丢失数据

3、容量较大,sessionStorage约5M、localStorage约20M

4、只能存储字符串,可以将对象JSON。stringfy() 编码后存储

window.sessionStorage

1、生命周期为关闭浏览器窗口

2、在同一个窗口(页面)下载数据可以共享

3、以键值对的形式存储使用

存储数据:

sessionStorage.setItem(key,value);

获取数据:

sessionStorage.getItem(key);

删除数据:

sessionStorage.removeItem(key);

删除所有数据:

sessionStorage.clear();

window.localStorage

1、生命周期永久生效,除非手动删除 否则关闭页面也会存在

2、可以多窗口(页面)共享(同一页面可以共享)

3、 以键值对的形式存储使用
存储数据:

localStorage.setItem(key,value);
//若是对象,则要把对象转换成json格式
localStorage,setItem("person",JSON.stringify(p))

获取数据:

localStorage.getItem(key);
console.log(JSON.parse(person))

删除数据:

localStorage.removeItem(key);

删除所有数据:

localStorage.clear();

案例

image-20230114162503560

1、把数据存入本地存储中

2、关闭页面,也可以显示用户名,所以用到localStorage

3、打开页面,先判断是否有这个用户名,如果有,就在表单里面显示用户名,并且勾选复选框。

4、当复选框发生改变的时候change事件

5、如果勾选,就存储,否则移除

var username = document.querySelector("#username");
var remember = document.querySelector("#remember");
//如果本地存储中有username 则直接显示
if(localStorage.getItem("username")){
    username.value = localStorage.getItem("username");
    remember.checked = true;
}
//当复选框发生改变的时候change事件
remember.addEventListener("change",function(){
    if(remember.checked){
        localStorage.setItem("username",username);
    }else{
        localStorage.removeItem("username");
    }
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值