08-Web APIs

Web APIs 08



缓慢动画回到页面指定位置

<!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>
        body{
            background: pink;
            height: 2000px;
        }
        .box{
            position: fixed;
            left: 200px;
            top: 200px;
        }
    </style>
</head>
<body>
    <div class="box">
        <button>缓慢动画回到0</button>
        <button>直接去到500</button>
        <button>缓慢动画去到1000</button>
    </div>
    
    <script>
        // 兼容写法
        function getScroll(){
            return {
                left: window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft ,
                top:window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop
            }
        }

        // 缓慢动画就是做动画的速度,刚开始是很快的,逐渐慢下来

        var timer = null;
        // target滚动位置的目标值
        function animate_scroll( target ){
            if( timer === null ){
                timer = window.setInterval( function(){
                    // 先获取当前垂直滚动条位置
                    var currentScrollTop = getScroll().top;

                    // 判断当前垂直滚动条位置是否达到目标值
                    if( currentScrollTop == target ){
                        // 清除定时器
                        window.clearInterval( timer );
                        // 设置timer的值为null
                        timer = null;
                    }
                    // 计算步长值( 运动速度 ) 公式
                    // var 步长值 = (目标值 - 当前值)/10
                    var speed = (target - currentScrollTop)/10;
                    // 处理步长值(可能出现小数)  正数向上取整  负数向下取整   否则有可能无法达到目标值
                    speed = speed > 0 ? Math.ceil( speed ) : Math.floor( speed );
                    // 设置页面滚动
                    window.scroll( 0,  currentScrollTop+speed  );
                }, 15 );
            }
        }

        var btns = document.querySelectorAll("button");
        btns[0].onclick = function(){
            animate_scroll( 0 );
        };

        btns[1].onclick = function(){
            window.scroll( 0 , 500 )
        };

        btns[2].onclick = function(){
            animate_scroll( 1000 );
        };

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

案例详解-仿淘宝固定右侧侧边栏

在这里插入图片描述

mouseenter和mouseover的区别 面试题

  • 当鼠标移动到元素上时就会触发mouseenter 事件
  • 类似 mouseover,它们两者之间的差别是
  • mouseover 鼠标经过自身盒子会触发,经过子盒子还会触发。mouseenter 只会经过自身盒子触发
    之所以这样,就是因为mouseenter不会冒泡
  • 跟mouseenter搭配鼠标离开 mouseleave 同样不会冒泡

举例: 分别给.father绑定mouseover和mouseenter事件

在这里插入图片描述

防抖函数和节流函数

参考博客:https://www.cnblogs.com/wssdx/p/11557706.html
参考博客: https://blog.csdn.net/sdta25196/article/details/88038489


防抖函数

  • 概念:函数防抖(debounce),就是指触发事件后,在 n 秒内函数只能执行一次,如果触发事件后在 n秒内又触发了事件,则会重新计算函数延执行时间。

生活中例子: 一群人排队上公交车, 公交车司机, 直到最后一个人上了车以后,再关车门


节流函数

  • 所谓节流,就是指连续触发事件但是在 n 秒中只执行一次函数。 节流会稀释函数的执行频率。

举例:
在这里插入图片描述

值传递与引用传递

什么叫做传递呢? 就是变量与变量之间的赋值操作

参考网址: https://blog.csdn.net/flightsmallbird/article/details/84771095


js中的传递分为值传递与引用传递
  • 基本数据类型之间的赋值操作都是值传递
  • 复合数据类型之间的赋值操作都是引用传递

值传递

将一个变量的值赋值给另外一个变量,如果修改其中一个变量的值,不会影响到另外一个变量的值! 这两个变量之间是没有任何的联系。
变量如何在内存中存储? 内存它是分区域:栈区和堆区
栈区:
空间小,速度快 主要存储变量名以及值在堆区的地址
堆区:空间大,速度慢 主要存储变量的值

小问: 变量名变量值之间的关系? 变量名引用变量值 ,变量值被变量名所引用!

window.onload = function(){}
或者
window.addEventListener("load",function(){});

window.onload 是窗口 (页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本文件、CSS 文件等), 就调用的处理函数。

图解:

在这里插入图片描述

  1. 有了window.onload就可以把JS代码写在页面元素的上方,因为onload是等页面内容全部加载完毕,再去执行处理函数的
  2. window.onload传统注册事件方式 只能写一次 , 如果有多个,会以最后一个window.onload为准
  3. 如果使用addEventListener方法注册事件,则没有限制

引用传递

将一个变量的值(内存地址)赋值给另外一个变量,如果修改其中一个变量的值,会影响到另外一个变量的值! 这两个变量之间是有联系的。

图解:
在这里插入图片描述

举例:
在这里插入图片描述

解除引用

参考网址: https://www.cnblogs.com/guoyansi19900907/p/12064769.html


数组解除引用

解决数组引用的方法有两种
第一种是使用for循环遍历
第二种使用可以得到新数组的内置函数 比如 数组对象.concat()等 数组对象.slice()等

举例:
在这里插入图片描述

对象解除引用

解除对象引用的方法有两种
第一种:使用for…in循环
第二种:使用es6提供的Object.assign(新对象,旧对象) 把旧对象进行浅拷贝到新对象中
另外Object.assign还可以合并多个object,它可以接收多个对象,第一个是合并的目标对象,后边都是被合并的对象 类似数组的concat方法
Object.assign使用文档如下:
https://www.jianshu.com/p/d5f572dd3776
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

举例:
在这里插入图片描述


JSON数据格式

什么是JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。由于其利于阅读和编写、同时也方便机器进行解析和生成。这使得JSON成为最理想的数据交换语言。

JSON数据格式的应用场景

只要有数据交换的地方,都会有JSON数据格式的身影。

① 手机号码归属地查询
在这里插入图片描述

② 快递查询

在这里插入图片描述

JSON格式的定义

基本语法:

{
    "name":"Mark",
    "age":18,
    "mobile":"13586007445"
}

注意:

  • JSON格式的数据,其键名必须使用"双引号"引起来
  • JSON格式的数据,“不能出现成员方法,只能是成员属性”

但是在JS中,如果以上格式赋值给某个变量,这个变量也是JS对象

var jsonObj = {
    "name":"Mark",
    "age":18,
    "mobile":"13586007445"
};

JSON对象与JS对象的区别

区别JSONjavascript对象
含义仅仅是一种数据格式表示类的实例
传输可以跨平台数据传输,速度快不能传输
表现①键值对方式,键必须加双引号 ②值不能是方法函数,不能是undefined或者NaN①键值对方式,键不加引号②值可以是函数、对象、字符串、数字、布尔等
相互转换JSON转换为JS对象:①JSON.parse(JSONString)(不兼容ie7)②var jsobj=eval("("+JSONString+")") (兼容所有浏览器,但不安全,会执行json里面的表达式JS对象转换为JSON:JSON.stringify(jsobj);(不兼容ie7)

其他:调用JSON官网的js,实现parse和stringify在各个浏览器的兼容:
https://github.com/douglascrockford/JSON-js/blob/master/json2.js

定义JSON对象

// 定义JSON对象
var jsonObj = {
"name":"Allen",
   "age":23,
   "mobile":"13123456789"
}

访问JSON对象的属性

基本语法:

JSON对象.属性

JSON对象[属性]

// 定义JSON对象
var jsonObj = {
    "name":"zhangsan",
    "age":23,
    "mobile":"13123456789"
}
console.log(jsonObj.name);
console.log(jsonObj["age"]);

遍历JSON对象的属性

for…in 语句用于对数组或者对象的属性进行循环操作

格式:

for (attr in JSON对象) {
   console.log( attr );  // attr是属性名
   console.log( JSON对象[attr] ); // JSON对象[attr]可以得到属性名对应的属性值
}
  • 这个变量是自定义 符合命名规范 但是一般我们 都写为 k 或则 key 或者 attr
  • 后面的可以是对象 也可以是数组 因为 数组也属于对象

注意: 遍历的时候使用 JSON对象.属性名 得到的是undefined , 所以只能使用 JSON对象[属性名]

举例:

// 定义JSON对象
var jsonObj = {
   "name":"zhangsan",
   "age":23,
   "mobile":"13123456789"
}
// 遍历JSON对象中的所有属性
for(var attr in jsonObj){
   console.log(attr);// 属性名
   console.log(jsonObj[attr]);// 属性值
   console.log(jsonObj.attr);// undefined
   console.log("");
}

JSON数组

问题:在JS中,我们可以通过JSON格式的数据来保存一个人的信息,如果我们想保存多个人的信息如何进行操作呢?答:使用JSON数组, 把多个json对象放在一个数组中

基本语法:

var 变量名 = [ 
    {键值对},
    {键值对},
    {键值对},
    ...
];

举例:

var persons = [
  {
       "name":"zhangsan",
       "age":23,
       "email":"zhangsan@163.com"
  },
  {
       "name":"lisi",
       "age":24,
       "email":"lisi@163.com"
  },
  {
       "name":"wangwu",
       "age":25,
       "email":"wangwu@163.com"
  },
];// 访问lisi的信息
console.log("姓名:"+persons[1].name);
console.log("年龄:"+persons[1].age);
console.log("邮箱:"+persons[1].email);

JSON格式的字符串与JS对象的转换

把JSON字符串转换为JS对象 语法如下

JSON.parse(JSON格式的字符串);

举例:

var jsonStr = '{"resultcode":"200","reason":"Return Successd!","result":{"province":"广西","city":"玉林","areacode":"0775","zip":"537000","company":"联通","card":""},"error_code":0}';
console.log(jsonStr);
console.log(typeof jsonStr);
console.log("");var json = JSON.parse(jsonStr);
console.log(json);
console.log(typeof json);
console.log("");// 获取JS对象中具体的数据
console.log("归属地:"+json.result.province+json.result.city);
console.log("运营商:"+json.result.company);

把JS对象转换为JSON格式的字符串 语法如下

JSON.stringify(JS对象);

举例:

var jsonObj = {
   "name":"zhangsan",
   "age":23,
   "email":"zhangsan@163.com"
};
console.log(jsonObj);
console.log(typeof jsonObj);
console.log("");var jsonStr = JSON.stringify(jsonObj);
console.log(jsonStr)
console.log(typeof jsonStr);

创建json格式的文件
在这里插入图片描述

cookie

cookie 是浏览器提供的一种可以缓存数据的机制 [http协议]
https://www.runoob.com/js/js-cookies.html

cookie特点

1、需要http服务或者https服务器
在这里插入图片描述
在这里插入图片描述
说明: live server打开的页面,会根据我们编写的代码,实时更新

2、同一个客户端软件
3、同一个服务环境下 【路径】可以实现数据共享

小结:

  1. cookie是浏览器缓存数据的一种机制
  2. cookie需要在http协议下使用
  3. cookie是共享数据的一种机制

设置cookie缓存数据

document.cookie = "username=admin";
document.cookie = "userpass=123456";
document.cookie = "uid=10010";

获取cookie缓存数据

// 1.0 获取缓存的数据
var dataStr = document.cookie;
console.log(dataStr);
// {key:value}
// 2.0切割字符串
var dataArr = dataStr.split("; ");
console.log(dataArr);
// 3.0 循环数组
// 定义空对象
var user = {};
// 循环数组
for(var i = 0 ; i < dataArr.length ; i ++){
  // 取key
  var key = dataArr[i].split("=")[0];
  // 取value
  var val = dataArr[i].split("=")[1];
  // 属性 = 值
  user[key] = val;
}
// 对象
console.log(user);

在这里插入图片描述

删除cookie数据

// 设置cookie有效时间
// var dt = new Date();
// var start = dt.getTime();
// var end = start + 2 * 60 * 60 * 1000;// 有效期2小时
// dt.setTime(end);
// console.log(dt);
// document.cookie = "userpass=123456; expires="+dt;

// 删除cookie 设置有效期为过去的时间
document.cookie = "username=''; expires=Thu Jan 01 1970 08:00:00 GMT+0800"


function setCookie(cname,cvalue,exdays)
{
  var d = new Date();
  d.setTime(d.getTime()+(exdays*24*60*60*1000));
  var expires = "expires="+d.toGMTString();
  document.cookie = cname + "=" + cvalue + "; " + expires;
}

总结:

cookie的使用:
设置:document.cookie = ‘key=val;path:/;expires=’+d (其中d为时间)
获取:document.cookie
删除cookie: 将过期时间设置为负值

举例:
在这里插入图片描述

结语

个人学习笔记,如有错解,劳烦指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值