列表


querySelector

**
都9102年了,还在用getElementById吗😭
获取指定元素中匹配css选择器的元素:

  1. // 作用在document
  2. document.querySelector("#nav"); // 获取文档中id="nav"的元素
  3. document.querySelector(".nav"); // 获取文档中class="nav"的元素
  4. document.querySelector("#nav li:first-child"); // 获取文档中id="nav"下面的第一个li元素
  5. // 也可以作用在其他元素
  6. let nav = dodocument.querySelector("#nav");
  7. nav.querySelector("li"); // 如果有多个li的话,返回第一个li

注意:无论如何只返回一个元素,如果有多个素,那也只返第一个✅


querySelectorAll

**
获取指定元素中匹配css选择器的所有元素:

  1. let list = document.querySelectorAll("li"); // NodeList(2) [li, li] 这里假设返回2个

注意:返回的值是一个类数组,无法使用数组的原生方法(forEach、map等),需
要转换一下:

  1. Array.from(list).map();

closest

跟querySelector相反,该元素可以向上查询,也就是可以查询到父元素:

  1. document.querySelector("li").closest("#nav");

dataset

就跟原生微信小程序一样,能获取标签上以”data-“为前缀的属性集合:

  1. <p data-name="蜘蛛侠" data-age="16"></p>
  1. document.querySelector("p").dataset; // {name: "蜘蛛侠", age: "16"}

注意:虽然可以用getAttribute方法获取任何属性值,但是性质却不一样,这是开发规范问题,凡是自定义属性都要加上data-前缀哦✅


URLSearchParams

假设浏览器的url参数是 “?name=蜘蛛侠&age=16”

  1. new URLSearchParams(location.search).get("name"); // 蜘蛛侠

hidden

这是一个html属性,规定元素是否隐藏,表现跟css的display: none一致:

  1. <div hidden>我被隐藏了</div>
  1. document.querySelector("div").hidden = true / false;

contenteditable

可以使一个元素可以被用户编辑:

  1. <p contenteditable>我是P元素,但是我也可以被编辑</p>

效果如下:
列举一些列比较不常见的Web API - 图1
如果这个属性跟style标签相遇会产生一段非常奇妙的故事:contenteditable跟style标签可真是天生一对


speelcheck

也是一个html属性,规定输入的内容是否检查英文拼写:

  1. <!-- 默认就是true,可省略 -->
  2. <textarea spellcheck="true"></textarea>

效果如下:
列举一些列比较不常见的Web API - 图2
设置不检查:

  1. <textarea spellcheck="false"></textarea>

效果如下:
列举一些列比较不常见的Web API - 图3


**classList**

这是一个对象,该对象里封装了许多操作元素类名的方法:

  1. <p class="title"></p>
  1. let elem = document.querySelector("p");
  2. // 增加类名
  3. elem.classList.add("title-new"); // "title title-new"
  4. // 删除类名
  5. elem.classList.remove("title"); // "title-new"
  6. // 切换类名(有则删、无则增,常用于一些切换操作,如显示/隐藏)
  7. elem.classList.toggle("title"); // "title-new title"
  8. // 替换类名
  9. elem.classList.replace("title", "title-old"); // "title-new title-old"
  10. // 是否包含指定类名
  11. elem.classList.contains("title"); // false


**getBoundingClientRect**

可以获取指定元素在当前页面的空间信息:

  1. elem.getBoundingClientRect();
  2. // 返回
  3. {
  4. x: 604.875,
  5. y: 1312,
  6. width: 701.625,
  7. height: 31,
  8. top: 1312,
  9. right: 1306.5,
  10. bottom: 1343,
  11. left: 604.875
  12. }

注意:top是距离文档顶部的距离,y则是距离可视窗口(浏览器屏幕)的顶部距离,如果浏览器滚动,top值不变,y值会变 ✅


**contains**

可以判断指定元素是否包含了指定的子元素:

  1. <div>
  2. <p></p>
  3. </div>
  1. document.querySelector("div").contains(document.querySelector("p")); // true

**online state**

监听当前的网络状态变动,然后执行对应的方法:

  1. window.addEventListener("online", xxx);
  2. window.addEventListener("offline", () => {
  3. alert("你断网啦!");
  4. });

PC端效果如下:
列举一些列比较不常见的Web API - 图4
移动端效果如下:
列举一些列比较不常见的Web API - 图5
使用场景:提示用户已断网,直接一个弹框把用户吓懵✅


battery state

获取设备的电池状态:

  1. navigator.getBattery().then(battery => console.log(battery));
  2. // 返回
  3. {
  4. charging, // 是否在充电
  5. chargingTime, // 充满电所需时间
  6. dischargingTime, // 当前电量可使用时间
  7. level, 剩余电量
  8. onchargingchange, // 监听充电状态变化
  9. onchargingtimechange, // 监听充满电所需时间变化
  10. ondischargingtimechange, // 监听当前电量可使用时间变化
  11. onlevelchange // 监听电量变化
  12. }

使用场景:提示用户电量已充满,或者为了让用户有安全感,电量低于99%的时候来个弹框提示”该充电啦”✅


vibration

嘻嘻,使设备进行震动:

  1. // 震动一次
  2. navigator.vibrate(100);
  3. // 连续震动,震动200ms、暂停100ms、震动300ms
  4. navigator.vibrate([200, 100, 300]);

效果如下:不好意思你得用你自己的手握住手机才能感受得到;
使用场景:通过振动来提供感官反馈,比如太久没有触摸屏幕的时候连续震动提醒用户✅


page visibility

顾名思义,这个API是用来监听页面可见性变化的,在PC端标签栏切换、最小化会触发、在移动端程序切到后台会触发,简单说就是页面消失了🤦‍♂️

  1. document.addEventListener("visibilitychange", () => {
  2. console.log(`页面可见性:${document.visibilityState}`);
  3. });

PC端效果如下:
列举一些列比较不常见的Web API - 图6
移动端效果如下:
列举一些列比较不常见的Web API - 图7
使用场景:当程序切到后台的时候,如果当前有视频播放或者一些动画执行,可以先暂停✅


deviceOrientation

陀螺仪,也就是设备的方向,又名重力感应,该API在IOS设备上失效的解决办法,将域名协议改成https;
列举一些列比较不常见的Web API - 图8
从左到右分别为alpha、beta、gamma:

  1. window.addEventListener("deviceorientation", event => {
  2. let {
  3. alpha,
  4. beta,
  5. gamma
  6. } = event;
  7. console.log(`alpha${alpha}`);
  8. console.log(`beta${beta}`);
  9. console.log(`gamma${gamma}`);
  10. });

移动端效果如下(此时手机在不停的转动):
列举一些列比较不常见的Web API - 图9
使用场景:页面上的某些元素需要根据手机摆动进行移动,达到视差的效果,比如王者荣耀进入游戏的那个界面,手机转动背景图会跟着动😂


toDataURL

这个canvas的API,作用是将画布的内容转换成一个base64的图片地址:

  1. let canvas = document.querySelector("canvas");
  2. let context = canvas.getContext("2d");
  3. // 画东西
  4. ...
  5. let url = canvas.toDataURL("image/png"); // 将画布内容转换成base64地址

使用a标签进行图片下载时,图片链接跨域(图片是我的掘金头像),无法进行下载而是进行图片预览:

  1. <img src="xxx">
  2. <button>
  3. <a href="xxx" download="avatar">下载图片</a>
  4. </button>

效果如下:
列举一些列比较不常见的Web API - 图10
封装以下代码便可解决✅

  1. const downloadImage = (url, name) => {
  2. // 实例化画布
  3. let canvas = document.createElement("canvas");
  4. let context = canvas.getContext("2d");
  5. // 实例化一个图片对象
  6. let image = new Image();
  7. image.crossOrigin = "Anonymous";
  8. image.src = url;
  9. // 当图片加载完毕
  10. image.onload = () => {
  11. // 将图片画在画布上
  12. canvas.height = image.height;
  13. canvas.width = image.width;
  14. context.drawImage(image, 0, 0);
  15. // 将画布的内容转换成base64地址
  16. let dataURL = canvas.toDataURL("image/png");
  17. // 创建a标签模拟点击进行下载
  18. let a = document.createElement("a");
  19. a.hidden = true;
  20. a.href = dataURL;
  21. a.download = name;
  22. document.body.appendChild(a);
  23. a.click();
  24. }
  25. }

效果如下:
列举一些列比较不常见的Web API - 图11
或者将当前的DOM转换成图片进行下载,常用于生成海报,推荐插件html2canvas,大家可以自己去搜;


customEvent

自定义事件,就跟vue里面的on跟emit一样;

监听自定义事件:

  1. window.addEventListener("follow", event => {
  2. console.log(event.detail); // 输出 {name: "前端宇宙情报局"}
  3. });

派发自定义事件:

  1. window.dispatchEvent(new CustomEvent("follow", {
  2. detail: {
  3. name: "前端宇宙情报局"
  4. }
  5. }));

notification

PC端的桌面通知,如网页端的微信,当收到消息时,右下角会出现一个通知(尽管你把浏览器最小化),因为这个通知时独立于浏览器的,是系统的一个原生控件:

  1. const notice = new Notification("前端宇宙情报局", {
  2. body: "这20个不常用的Web API真的有用吗?,别问,问就是有用🈶",
  3. icon: "我的掘金头像",
  4. data: {
  5. url: "https://www.baidu.com"
  6. }
  7. });
  8. // 点击回调
  9. notice.onclick = () => {
  10. window.open(notice.data.url); // 当用户点击通知时,在浏览器打开百度网站
  11. }

效果如下:
列举一些列比较不常见的Web API - 图12
注意:想要成功的调起通知,首先要用户的授权✅

  1. Notification.requestPermission(prem => {
  2. prem == "granted" // 同意
  3. prem == "denied" // 拒绝
  4. })

所以,再调用之前先向用户发起请求:

  1. let permission = Notification.permission;
  2. if (permission == "granted") {
  3. // 已同意,开始发送通知
  4. ...
  5. } else if (permission == "denied") {
  6. // 不同意,发不了咯
  7. } else {
  8. // 其他状态,可以重新发送授权提示
  9. Notification.requestPermission();
  10. }

fullScreen

全屏不咯? 之前的一个项目刚好用上,不仅仅可以作用在documentElement上,还可以作用在指定元素:

  1. /**
  2. * @method launchFullScreen 开启全屏
  3. * @param {Object} elem = document.documentElement 作用的元素
  4. */
  5. const launchFullScreen = (elem = document.documentElement) => {
  6. if(elem.requestFullScreen) {
  7. elem.requestFullScreen();
  8. } else if(elem.mozRequestFullScreen) {
  9. elem.mozRequestFullScreen();
  10. } else if(elem.webkitRequestFullScreen) {
  11. elem.webkitRequestFullScreen();
  12. }
  13. }

作用在documentElement上没啥可以介绍的咯,就相当于F11开启全屏:
列举一些列比较不常见的Web API - 图13
那么作用在指定元素会是什么效果呢?
列举一些列比较不常见的Web API - 图14
就像效果图一样,会直接开启全屏,并且只显示指定的元素,元素的宽高填充了整个屏幕✅

关闭全屏的时候需要注意的是,统一用document对象:

  1. /**
  2. * @method exitFullScreen 关闭全屏
  3. */
  4. const exitFullScreen = () => {
  5. if (document.exitFullscreen) {
  6. document.exitFullscreen();
  7. } else if (document.mozCancelFullScreen) {
  8. document.mozCancelFullScreen();
  9. } else if (document.webkitCancelFullScreen) {
  10. document.webkitCancelFullScreen();
  11. }
  12. }

使用场景:需要让用户专注去做某件事,比如代码编辑区的全屏✅


orientation

可以监听用户手机设备的旋转方向变化:

  1. window.addEventListener("orientationchange", () => {
  2. document.body.innerHTML += `<p>屏幕旋转后的角度值:${window.orientation}</p>`;
  3. }, false);

效果如下:
列举一些列比较不常见的Web API - 图15
也可以使用css的媒体查询:

  1. /* 竖屏时样式 */
  2. @media all and (orientation: portrait) {
  3. body::after {
  4. content: "竖屏"
  5. }
  6. }
  7. /* 横屏时样式 */
  8. @media all and (orientation: landscape) {
  9. body::after {
  10. content: "横屏"
  11. }
  12. }

使用场景:页面需要用户开启横屏来获得更好的体验😂


总结

其实不常用的还有很多很多,有一些我没有发现或者没写,如geoLocation地理定位、execCommand执行命令等,也欢迎大家补充,前几篇文章都是css相关,后面几篇先不写css啦,好多内容大家都写过,想写一些新的,但是又难免会冲突~