惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
Y
Y Combinator Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
L
LangChain Blog
美团技术团队
N
Netflix TechBlog - Medium
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
B
Blog
博客园 - 司徒正美
爱范儿
爱范儿
D
DataBreaches.Net
月光博客
月光博客
U
Unit 42
B
Blog RSS Feed
Engineering at Meta
Engineering at Meta
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
MongoDB | Blog
MongoDB | Blog
腾讯CDC

张鑫旭-鑫空间-鑫生活

1分钟速度了解text-align match-parent声明 « 张鑫旭-鑫空间-鑫生活 光标的形状也能设置了,就是CSS caret-shape属性 « 张鑫旭-鑫空间-鑫生活 pretext与文字四面环绕效果的实现 « 张鑫旭-鑫空间-鑫生活 JSON.rawJSON方法的作用是什么? « 张鑫旭-鑫空间-鑫生活 如何使用CSS判断鼠标从哪个方向进入元素? « 张鑫旭-鑫空间-鑫生活 借助mediabunny纯JS实现视频水印、剪裁、合成等功能 « 张鑫旭-鑫空间-鑫生活 务必谨慎使用JS WeakRef弱引用 « 张鑫旭-鑫空间-鑫生活 CSS六边形头像的实现与蜂巢布局 « 张鑫旭-鑫空间-鑫生活 CSS corner-shape与背景底纹技术 « 张鑫旭-鑫空间-鑫生活 浅学WebTransport API:下一代Web双向通信技术 « 张鑫旭-鑫空间-鑫生活 HTML dialog元素新支持了closedBy属性 « 张鑫旭-鑫空间-鑫生活 HTML interestfor属性与悬停popover交互效果 « 张鑫旭-鑫空间-鑫生活 CSS3模拟window7炫酷界面效果展示 « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 纯js无图片无外链CSS图片幻灯片播放插件 « 张鑫旭-鑫空间-鑫生活 CSS border三角、圆角图形生成技术简介 « 张鑫旭-鑫空间-鑫生活 CSS “渐进增强”在web制作中常见应用举例 « 张鑫旭-鑫空间-鑫生活 让IE6/IE7/IE8浏览器支持CSS3属性 « 张鑫旭-鑫空间-鑫生活 jQuery – 高亮动态显示页面HTML代码插件 « 张鑫旭-鑫空间-鑫生活 翻译 – 逐渐消失的Flash网站 « 张鑫旭-鑫空间-鑫生活 CSS reset的重新审视 – 避免样式重置 « 张鑫旭-鑫空间-鑫生活 新浪微博插入话题后部分文字选中的js实现 « 张鑫旭-鑫空间-鑫生活 JavaScript实现http地址自动检测并添加URL链接 « 张鑫旭-鑫空间-鑫生活 CSS实现兼容性的渐变背景(gradient)效果 « 张鑫旭-鑫空间-鑫生活 CSS content内容生成技术以及应用 « 张鑫旭-鑫空间-鑫生活 CSS gradient渐变之webkit核心浏览器下的使用 « 张鑫旭-鑫空间-鑫生活 CSS渐变之CSS3 gradient在Firefox3.6下的使用 « 张鑫旭-鑫空间-鑫生活 区分IE8/IE7/IE6及其他浏览器-CSS “\9″hack « 张鑫旭-鑫空间-鑫生活 CSS实现跨浏览器兼容性的盒阴影效果 « 张鑫旭-鑫空间-鑫生活 CSS3&HTML5各浏览器支持情况一览表 « 张鑫旭-鑫空间-鑫生活
HTML permission元素和Permissions API简介 « 张鑫旭-鑫空间...
张鑫旭,zhangxinxu · 2025-02-24 · via 张鑫旭-鑫空间-鑫生活

by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=11534
本文可全文转载,独立域名个人网站无需授权,但需要保留原作者、出处以及文中链接,任何网站均可摘要聚合,商用请联系授权。

Permissions API占位图

本文介绍一个全新的HTML元素<permission>元素,与浏览器权限申请与使用相关,同时介绍Permissions API。

年纪上去了,精力有限,本文就不扯淡了,直接讲最核心的东西。

一、permission元素的作用

在Web开发的时候,我们会经常用到权限申请,比方说摄像头,访问相册,是否允许通知,又或者地理位置信息等。

权限提示

在过去,这种申请都是通过JavaScript代码触发的,使用各种权限专门的API,或者使用统一的Permissions API。

但是,JavaScript触发的这种权限选择会有个问题,那就是如果用户不小心点击了拒绝怎么办?

这个其实还挺常见,或者有时候用户正好和女朋友吵架,心情不好,这个时候出现个提示,想都不想就拒绝,也是很有可能的,对吧。

此时,想要恢复权限,就很麻烦,需要去浏览器设置里面去处理。

设置权限

这个对于那种非互联网重度用户而言,太难了。

于是,就有了<permission>元素。

权限按钮直接暴露在网页中,直接让用户点击就好了。

比方说下面的代码:

<permission type="camera" />

实时渲染效果如下(浏览器不支持会只有虚框):

在我windows chrome浏览器下的渲染效果则是:

使用摄像头示意

对应的HTML源码结构参见:

权限申请源码

此时,用户点击此按钮,就会自动呼起权限选择的框框,例如:

权限提示说明

此时,我们点击右上角的叉叉,不做任何选择,紧接着在点击此按钮,依然会出现提示。

这就避免了上面提到的用户权限选择拒绝后无法再次权限申请的问题。

眼见为实,您可以狠狠地点击这里:HTML permission元素不同类型展示效果demo

浏览器是否支持的检测

判断浏览器是否支持元素,可以使用下面展示的JS代码:

if ('HTMLPermissionElement' in window) {
  // The `<permission>` 元素支持
}

二、Permissions API又是什么

在不过去,不同类型的权限申请回使用各自专门的API去进行,比方说地址位置的申请使用navigator.geolocation,摄像头权限申请使用navigator.getUserMedia()等。

这就会导致开始使用的学习和使用成本比较高。

既然都是权限申请,且系统出现的提示UI都近似,何必来个大统一呢?在这种背景下,Permissions API被提出来了。

所有的权限申请全都使用一个统一的API名称入口,使用的方法是Permissions.query(),直接看案例,地址位置权限申请。

navigator.permissions.query({ name: "geolocation" }).then((result) => {
  if (result.state === "granted") {
    showLocalNewsWithGeolocation();
  } else if (result.state === "prompt") {
    showButtonToEnableLocalNews();
  }
  // 如果权限没通过就不执行任何操作
});

下面列表显示了各类权限API预支对应的权限名称:

  • Background Synchronization API: background-sync (这个结果应该都是granted)
  • Clipboard_API: clipboard-read, clipboard-write
  • Compute Pressure API: compute-pressure
  • Geolocation API: geolocation
  • Local Font Access API: local-fonts
  • Media Capture and Streams API: microphone, camera
  • Notifications API: notifications
  • Payment Handler API: payment-handler
  • Push API: push
  • Screen Wake Lock API: screen-wake-lock
  • Sensor APIs: accelerometer, gyroscope, magnetometer, ambient-light-sensor
  • Storage Access API: storage-access, top-level-storage-access
  • Storage API: persistent-storage
  • Web Bluetooth API: bluetooth
  • Web MIDI API: midi
  • Window Management API: window-management

不展开介绍。

三、两者结合使用?

既然都是与权限上面,那个HTML的这个和JS的这个是不是可以组合使用,没错,还真是,而且推荐这么处理。

下面是个案例,摄像头权限申请处理,看代码,先是HTML部分:

<permission type="camera" />

然后接下来看看实操的JS代码:

// 获取permission元素
const permission = document.querySelector('permission');
// 绑定事件
permission.addEventListener('promptdismiss', showCameraWarning);

function showCameraWarning() {
  // 显示摄像头会获取授权的提醒
}

// 使用Permissions API申请权限
const permissionStatus = await navigator.permissions.query({name: "camera"});
// 权限状态变化的处理
permissionStatus.addEventListener('change', () => {
  // 如果权限允许,使用相机该干嘛就干嘛
  if (permissionStatus.state === "granted") {
    useCamera();
  }
});

// 运行初始检查,如果用户之前已经通过,直接处理
if (permissionStatus.state === "granted") {
  useCamera();
}

大家平时开发的时候,就参照上面的案例处理就好了。

permission元素事件

上面代码出现的promptdismiss事件就是permission元素支持的事件类型之一。

具体有这么几个:

onpromptdismiss
用户关闭权限提示的时候触发。使用addEventListener绑定事件的时候,'on'需要省略,下同。在浏览器开启实验支持阶段,也可能使用的是ondismiss名称。
onpromptaction
当用户对元素触发的权限提示执行某些操作来解除该提示时,系统会触发此事件。这并不一定意味着权限状态已更改,用户可能已执行某项操作来维持现状(例如继续允许使用某项权限)。在非正式阶段,事件名称为onresolve
onvalidationstatuschange
当元素从valid状态切换成invalid时触发。默认情况下都是valid状态,但是,如果当前的permission元素被其他元素遮挡,则被视为invalid

PS:本来想测试下事件支持的名称,发现浏览器版本升级到最新之后,反而无法正常渲染permission元素了,怪哉,难道放弃支持了?

四、其他权限相关说明

目前Permissions API是可以放心使用的,浏览器支持有一段时日了,截图参考:

Permissions API兼容性

但是对于HTML <permission>元素,目前没有任何兼容性相关的数据,MDN上连个文档都没有,我怀疑,这个元素很有可能会中道崩殂。

另外 <permission>元素的样式是无法完全自定义的,毕竟与安全相关,仅有部分样式支持,综合上述,大家目前了解下即可。

好,就介绍这么多,希望可以对大家的工作与学习有所帮助。

也欢迎点赞,转发,一键……不好意思,说顺口,没有一键三连,转发就好了!

文章最后的小图-仙清儿

本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=v

(本篇完)