Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >你不知道的JavaScript APIs

你不知道的JavaScript APIs

作者头像
前端小智@大迁世界
发布于 2022-10-28 02:27:26
发布于 2022-10-28 02:27:26
81800
代码可运行
举报
文章被收录于专栏:终身学习者终身学习者
运行总次数:0
代码可运行

本文首发于微信公众号:大迁世界, 我的微信:qq449245884,我会第一时间和你分享前端行业趋势,学习途径等等。 更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi ,包含一线大厂面试完整考点、资料以及我的系列文章。

最近,看到一些好用但不太常用的JS API,觉得挺不错的,分享给大家。

  • Page Visibility API
  • Web Share API
  • Broadcast Channel API
  • Internationalization API

下面,我们来看下应该在哪里使用它们,以及如何使用它们。

Page Visibility API

这个APi 可以让我们知道用户何时离开了页面。准确地说,只要页面的可见性状态发生变化,无论是用户最小化、最大化窗口还是切换标签,该API都会触发一个事件 visibilitychange

在过去,我不得不使用一些黑科技来确认用户是否切换了标签或最小化了窗口。最流行的是使用blurfoucs浏览器事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
window.addEventListener("focus", function () {
    // User is back on the page
    // Do Something
});

window.addEventListener("blur", function () {
    // User left the page
    // Do Something
});

上面的代码可以工作,但不像预期的那样。因为blur事件是在页面失去焦点时触发的,所以当用户点击搜索栏、警报对话框、控制台或窗口边框时,它就会被触发。所以,blurfoucs只告诉我们页面是否被激活,但不告诉我们页面的内容是否被隐藏或可见。

案例

一般来说,我们希望使用 Page Visibility API,在用户没有看到页面时停止不必要的进程,或者执行一些后台操作。可以下面这几种情况:

  • 当用户离开页面时,暂停视频、轮播图或动画。
  • 停止一些实时获取数据的API
  • 发送一些用户信息
如何使用它?

Page Visibility API 有两个属性和一个事件来访问页面可见性状态。

document.hidden 它是全局可用的,而且是只读的。尽量避免使用它,因为它现在已经被废弃了,但是当被访问时,如果页面是隐藏的,它将返回 true,如果是可见的,它将返回 false

Document.visibilityState (只读属性)

返回document的可见性,即当前可见元素的上下文环境。由此可以知道当前文档 (即为页面) 是在背后,或是不可见的隐藏的标签页,或者 (正在) 预渲染。可用的值如下:

  • 'visible' : 此时页面内容至少是部分可见。即此页面在前景标签页中,并且窗口没有最小化。
  • 'hidden' : 此时页面对用户不可见。即文档处于背景标签页或者窗口处于最小化状态,或者操作系统正处于 '锁屏状态'
  • 'prerender' : 页面此时正在渲染中,因此是不可见的 (considered hidden for purposes of document.hidden). 文档只能从此状态开始,永远不能从其他值变为此状态。

visibilitychange

当其选项卡的内容变得可见或被隐藏时,会在文档上触发 visibilitychange (能见度更改) 事件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
document.addEventListener("visibilitychange", () => {
    if (document.visibilityState === "visible") {
        // page is visible
    } else {
        // page is hidden
    }
});

Web Share API

Web Share API 它可以让我们访问操作系统的本地共享机制,这对移动用户特别有用。通过这个API,可以分享文本、链接和文件,而不需要创建自己的分享机制或使用第三方的机制。

使用案例

可以用它来分享网页上的内容到社交媒体上,或者把它复制到用户的剪贴板上。

如何使用它?

网络共享API给了我们两个接口来访问用户的共享系统。

navigator.canShare(data);

如果对 Navigator.share() 的调用成功,则 Web Share API 的 Navigator.canShare() 方法将返回 truedata 包含要共享的数据的对象,该对象要与 Navigator.share() 方法传递的数据相匹配。

navigator.share(data)

Navigator.share() 方法通过调用本机的共享机制作为 Web Share API 的一部分。如果不支持 Web Share API,则此方法为 undefined

data 包含要共享的数据的对象。必须至少指定以下字段之一。可用选项包括:

  • url: 要共享的 URL( USVString )
  • text: 要共享的文本( USVString )
  • title: 要共享的标题( USVString)
  • files: 要共享的文件(“FrozenArray”)

该方法将会返回一个 Promise。一旦用户完成分享,这个 promise 将会接受。如果指定的共享数据格式不正确,promise 将会立即拒绝;如果用户取消了分享,promise 也会拒绝。

事例
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
navigator.share({
  title: document.title,
  text: 'Hello World',
  url: 'https://developer.mozilla.org',
}); // 分享 MDN 的 URL

Broadcast Channel API

Broadcast Channel API 可以实现同 源 下浏览器不同窗口,Tab 页,frame 或者 iframe 下的 浏览器上下文 (通常是同一个网站下不同的页面) 之间的简单通讯。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const broadcast = new BroadcastChannel("new_channel");

BroadcastChannel 接口非常简单。通过创建一个 BroadcastChannel 对象,一个客户端就加入了某个指定的频道。只需要向 构造函数 传入一个参数:频道名称。如果这是首次连接到该广播频道,相应资源会自动被创建。

发送消息

现在发送消息就很简单了,只需要调用 BroadcastChannel 对象上的 postMessage() 方法即可。该方法的参数可以是任意对象。最简单的例子就是发送 DOMString 文本消息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
broadcast.postMessage("Example message");

不只是 DOMString,任意类型的对象都可以被发送。

断开连接

通过调用 BroadcastChannel 对象的 close() 方法,可以离开频道。这将断开该对象和其关联的频道之间的联系,并允许它被垃圾回收。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 断开频道连接
bc.close()

Internationalization API

在开发一个网页或应用程序时,需要将其内容翻译成其他语言以覆盖更广泛的受众是非常常见的。然而,仅仅将你的网页文本翻译成你所需要的任何语言,并不足以使你的内容对讲该语言的人可用,因为像日期、数字、单位等东西在不同国家是不同的,可能会给你的用户带来混乱。

假设你想在你的网页上显示日期 "2022年11月8日",如 "11/8/22"。根据读者的国家,这个数据可以用三种不同的方式来阅读。

  • “November 8, 2022” 或者 MM/DD/YY 来自美国
  • “August 11, 2022” or DD/MM/YY 来自欧洲
  • “August 22, 2011” or YY/MM/DD 来自中国、日本。

这就是国际化API(或I18n API)来解决不同语言和地区的格式问题的地方。I18n API是一个了不起的工具,有多种用途,但这里不会深入研究,以免使本文过于冗长。

如何使用它?

I18n API 使用 locale 标识符来工作。locales 参数必须是一个 BCP 47 语言标记的字符串,或者是一个包括多个语言标记的数组。如果 locales 参数未提供或者是 undefined,便会使用运行时默认的 locale。

一个 BCP 47 语言标记代表了一种语言或者区域(两者没有很大的区别)。在其最常见的格式中,它以这样的顺序囊括了这些内容:语言代码,脚本代码,和国家代码,全部由连字符分隔开。例如:

  • "hi":印地语 (primary language)。
  • "de-AT": 在奥地利使用的德语 (primary language with country code)。
  • "zh-Hans-CN":在中国使用的简体中文 (primary language with script and country codes)。

更准确地说,I18n API提供了一个Intl对象,它提供了精确的字符串对比、数字格式化,和日期时间格式化。CollatorNumberFormatDateTimeFormat 对象的构造函数是 Intl 对象的属性。本页文档内容包括了这些属性,以及国际化使用的构造器和其他语言的方法等常见的功能。

Intl.Collator

collators 的构造函数,用于启用对语言敏感的字符串比较的对象。

Intl.DateTimeFormat

用于启用语言敏感的日期和时间格式的对象的构造函数。

Intl.ListFormat

启用对语言敏感的列表格式化的对象的构造函数。

Intl.NumberFormat

用于启用语言敏感数字格式的对象的构造函数。

Intl.PluralRules

用于启用多种敏感格式和多种语言语言规则的对象的构造函数。

Intl.RelativeTimeFormat

用于启用语言敏感的相对时间格式化的对象的构造函数。

在我们的例子中,我们重点关注 Intl.DateTimeFormat() 构造函数,以根据用户的区域设置来格式化报价的 dateAdded 属性。Intl.DateTimeFormat() 构造函数需要两个参数:定义日期格式化惯例的 locale 字符串和用于自定义日期格式的 options 对象。

创建的 Intl.DateTimeFormat() 对象有一个 format() 方法,它需要两个参数:我们要格式化的Date对象和用于自定义如何显示格式化日期的 options 对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const logDate = (locale) => {
    const newDate = new Date("2022-10-24"); // YY/MM/DD
    const dateTime = new Intl.DateTimeFormat(locale, {timeZone: "UTC"});
    const formatedDate = dateTime.format(newDate);
    console.log(formatedDate);
};

logDate("en-US"); // 10/24/2022
logDate("de-DE"); // 24.10.2022
logDate("zh-TW"); // 2022/10/24

dateTime.format() 根据当地的日期格式约定改变日期。我们可以使用navigator.language全局属性在报价单的日期上实现这一行为,该全局属性持有用户的首选区域设置。为此,我们将创建一个新的函数,接收一个日期字符串(YYYY-MM-DD格式),并根据用户的locale返回格式化的日期。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const formatDate = (dateString) => {
    const date = new Date(dateString);
    const locale = navigator.language;
    const dateTimeFormat = new Intl.DateTimeFormat(locale, {timeZone: "UTC"});

    return dateTimeFormat.format(date);

};

代码部署后可能存在的BUG没法实时知道,事后为了解决这些BUG,花了大量的时间进行log 调试,这边顺便给大家推荐一个好用的BUG监控工具 Fundebug


原文:https://www.smashingmagazine....

交流

有梦想,有干货,微信搜索 【大迁世界】 关注这个在凌晨还在刷碗的刷碗智。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
你不知道的JavaScript APIs
这是一个鲜为人知的 web API,在JS现状调查[1]中,它的认知度排名倒数第四。它可以让你知道用户何时离开了页面。准确地说,只要页面的可见性状态发生变化,无论是用户最小化、最大化窗口还是切换标签页,该API都会触发一个事件。
chuckQu
2022/11/28
1K0
你不知道的JavaScript APIs
JS魔法堂:不完全国际化&本地化手册 之 实战篇
前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求——国际化&本地化。熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已。趁着这个机会好好学习整理一下
^_^肥仔John
2018/01/18
1.6K0
JS魔法堂:不完全国际化&本地化手册 之 实战篇
内置于浏览器中的国际化API[每日前端夜话0xBA]
你的程序很有可能需要支持多种语言。其中包括对语言敏感的日期处理。一个广受欢迎的库Moment.js【https://www.npmjs.com/package/moment】有助于实现这一目标,它的功能之一是国际化。其源代码【https://github.com/moment/moment/blob/develop/locale/en-gb.js】中包含对许多不同语言的本地化。现在这可能已经不是最好的方法了,因为我们有 ECMAScript 国际化 API。
疯狂的技术宅
2019/09/10
1.5K0
内置于浏览器中的国际化API[每日前端夜话0xBA]
什么,你还在用 momentJs 处理相对时间
我想,下面这段代码,你是不是在开发中常常这样使用来计算距离现在过去了多长时间: import moment from 'moment' // 61k (gzipped:19.k) function
前端修罗场
2023/10/07
2230
什么,你还在用 momentJs 处理相对时间
ECMAScript 2021 (ES12)的新特性总结
ECMAScript 2021 最终功能集于今年的3 月 9 日确定,2021 年6 月 22 日,第 121 届 Ecma 国际 宣布 ECMAScript 2021(ES12)成为事实的 ECMAScript 标准,并被写入 ECMA-262 第 12 版。先纵览下 ES2021 的新功能,看看现在这些特性在你工作中有没有用到吧:
江一铭
2022/06/16
1.3K0
ECMAScript 2021 (ES12)的新特性总结
91.HarmonyOS NEXT 应用国际化与本地化指南:打造全球化应用
通过合理的国际化和本地化策略,可以使应用更好地适应全球市场。在实际开发中,要注意平衡功能完整性和性能表现,确保良好的用户体验。
全栈若城
2025/03/16
830
小程序的国际化与多语言支持
随着微信小程序的全球化发展,越来越多的开发者希望能够让小程序支持不同语言环境,以满足全球用户的需求。因此,国际化(i18n)和多语言支持成为了小程序开发中的重要部分。
LucianaiB
2025/02/10
3120
105.精读《What's new in javascript》
2019 年 Google I/O 介绍了一些激动人心的 JS 新特性,这些特性有些已经被主流浏览器实现,并支持 polyfill,有些还在草案阶段。
黄子毅
2022/03/14
5260
【HarmonyOS NEXT】systemDateTime 时间戳转换为时间格式 Date,DateTimeFormat
在鸿蒙应用开发中,经常需要将时间戳转化为标准时间格式。即:一串数字转化为年月日时分秒。
GeorgeGcs
2025/03/24
1580
【JS】201-JavaScript 日期权威指南
在内部,日期以1970年1月1日(UTC)以来的毫秒数表示。这个日期很重要,因为就计算机而言,这就是一切开始的地方。
pingan8787
2019/07/23
2.8K0
【JS】201-JavaScript 日期权威指南
记一次平淡无奇的性能优化
甘特图的主要作用是项目管理,可以用图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的活动顺序与持续时间,如下图
玖柒的小窝
2021/09/24
4720
记一次平淡无奇的性能优化
JavaScript ES2021最值得期待的新特性解析
每年,JavaScript 的更新都会添加新特性。今年发布的是 ES2020 或称 ES11,预计 ES2021 或称 ES12 将于 2021 年中发布。添加到 JavaScript 的新特性都会经历四个阶段。在本文中,我将讨论已经进入第四阶段且已添加到谷歌 Chrome V8 引擎中的新特性。
深度学习与Python
2020/11/06
8020
JavaScript ES2021最值得期待的新特性解析
Javascript 字符串与文本格式化
JavaScript中的 String 类型用于表示文本型的数据. 它是由无符号整数值(16bit)作为元素而组成的集合. 字符串中的每个元素在字符串中占据一个位置. 第一个元素的index值是0, 下一个元素的index值是1, 以此类推. 字符串的长度就是字符串中所含的元素个数.你可以通过String字面值或者String对象两种方式创建一个字符串。
acc8226
2022/05/17
8430
JavaScript 权威指南第七版(GPT 重译)(四)
JavaScript 对象在第六章中有所涉及。该章将每个对象视为一组独特的属性,与其他对象不同。然而,通常有必要定义一种共享某些属性的对象类。类的成员或实例具有自己的属性来保存或定义它们的状态,但它们还具有定义其行为的方法。这些方法由类定义,并由所有实例共享。例如,想象一个名为 Complex 的类,表示并对复数执行算术运算。Complex 实例将具有保存复数的实部和虚部(状态)的属性。Complex 类将定义执行这些数字的加法和乘法(行为)的方法。
ApacheCN_飞龙
2024/03/23
5230
JavaScript 权威指南第七版(GPT 重译)(四)
# 学会这些 Web API 使你的开发效率翻倍
随着浏览器的日益壮大,浏览器自带的功能也随着增多,在 Web 开发过程中,我们经常会使用一些 Web API 增加我们的开发效率。
九旬
2023/10/19
4760
【JS】1678- 重学 JavaScript API - Broadcast Channel API
本文将介绍 Broadcast Channel API 的基本和高级使用方法,并提供示例代码来帮助读者更好地理解和使用该 API。
pingan8787
2023/09/01
5140
【JS】1678- 重学 JavaScript API - Broadcast Channel API
JavaScript 如何实现同源通信?
在日常工作中,你可能会遇到同源页面间通信的场景。针对这种场景,我们可以使用 localStorage 和 storage 事件来解决同源页面间通信的问题。除此之外,我们还可以使用 Broadcast Channel API 来解决该问题。接下来,阿宝哥将带大家一起来认识一下 Broadcast Channel API。
皮卡苏
2021/08/12
1.2K0
JavaScript 如何实现同源通信?
代码小魔术:30 个一行 JavaScript 代码
下面是 30 行代码小魔术 JavaScript 代码,它们将使你的编程工作更轻松。
掘金安东尼
2023/11/11
2130
代码小魔术:30 个一行 JavaScript 代码
【JS】1714- 重学 JavaScript API - Geolocation API
本文将深入探讨 Geolocation API 的概念、使用方法、实际应用以及兼容性和优缺点等方面内容,帮助您更好地了解和应用这个有趣的 API。
pingan8787
2023/09/01
5440
【JS】1714- 重学 JavaScript API - Geolocation API
跨标签页通信的8种方式(上)
跨标签页通信是指在浏览器中的不同标签页之间进行数据传递和通信的过程。在传统的Web开发中,每个标签页都是相互独立的,无法直接共享数据。然而,有时候我们需要在不同的标签页之间进行数据共享或者实现一些协同操作,这就需要使用跨标签页通信来实现。
can4hou6joeng4
2023/11/16
8410
相关推荐
你不知道的JavaScript APIs
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验