hrome 126 于近期發(fā)布了穩(wěn)定版本,其中一個(gè)比較有意思的更新是給 HTML 帶來一個(gè)新的元素:<permission> ,它將從這個(gè)版本開始試用,并且正在努力走向標(biāo)準(zhǔn)化。
今天我們一起來看下這個(gè) <permission> 元素的用法。
當(dāng) Web 應(yīng)用程序需要訪問瀏覽器的高級功能時(shí),需要向用戶主動請求許可。例如,當(dāng)百度地圖使用 Geolocation API 獲取用戶的地理位置時(shí),瀏覽器會提示用戶申請權(quán)限,這是權(quán)限規(guī)范中定義明確的概念。
申請權(quán)限的觸發(fā)方式一般分為兩類,被動隱式觸發(fā),或者主動顯示觸發(fā):
例如,Geolocation API 是一個(gè)強(qiáng)大的 API,它的使用依賴于首次使用時(shí)隱式詢問的方法。例如,當(dāng)程序調(diào)用 navigator.geolocation.getCurrentPosition() 方法時(shí),權(quán)限提示框會在第一次調(diào)用時(shí)自動彈出,還有另外一個(gè)例子是 navigator.mediaDevices.getUserMedia()。
一些其他的 API,如 Notification API 或 Device Orientation API,通常有一種顯式的方式通過靜態(tài)方法來請求權(quán)限,如 Notification.requestPermission() 或 DeviceMotionEvent.requestPermission()。
網(wǎng)站可以在加載時(shí)立即調(diào)用諸如 navigator.mediaDevices.getUserMedia() 或 Notification.requestPermission() 等方法。這會導(dǎo)致在用戶還沒與網(wǎng)站進(jìn)行交互時(shí)就彈出權(quán)限提示。這就是明顯的權(quán)限濫用行為,并且影響到兩種方式,既包括首次使用時(shí)的隱含詢問,也包括提前明確請求。
權(quán)限濫用導(dǎo)致瀏覽器廠商要求有像點(diǎn)擊按鈕或按下按鍵這樣的用戶操作,然后才會顯示權(quán)限提示。這種方法的問題在于,瀏覽器很難確定某個(gè)特定的用戶操作是否應(yīng)該導(dǎo)致顯示權(quán)限提示。也許用戶只是因?yàn)轫撁婕虞d時(shí)間太長而在頁面上隨意某個(gè)地方隨便點(diǎn)擊,有些網(wǎng)站也變得非常擅長誘騙用戶點(diǎn)擊內(nèi)容來觸發(fā)提示。
另一個(gè)問題是權(quán)限提示框通常顯示的方式:在網(wǎng)站的 “死亡線” 之上(特別是在大屏幕上),也就是說,在應(yīng)用程序能夠繪制到的瀏覽器窗口區(qū)域之外。用戶在剛剛點(diǎn)擊了窗口底部的一個(gè)按鈕后,可能會錯(cuò)過瀏覽器窗口頂部的提示,這種情況還是挺常見的。當(dāng)瀏覽器有應(yīng)對權(quán)限濫用的緩解措施時(shí),這個(gè)問題往往會更加嚴(yán)重。
另外,用戶一旦做出了拒絕某個(gè)權(quán)限的操作,之后想要改變就不太容易了。他們得找到特定的地方,比如那個(gè)網(wǎng)站信息下拉菜單,然后去進(jìn)行重置或調(diào)整權(quán)限的操作,而且還得重新加載頁面才行。網(wǎng)站也沒辦法提供很方便的途徑讓用戶快速改變權(quán)限狀態(tài),還得詳細(xì)地告訴用戶怎么去找到地方改變設(shè)置。
如果某個(gè)權(quán)限是非常重要的,比如視頻會議軟件要用麥克風(fēng)權(quán)限,那像谷歌會議這類的軟件就會彈出很顯眼的對話框來告訴用戶怎么去把之前阻止的權(quán)限給開通。
為了解決上面的這些問題,<permission> 元素誕生了。這個(gè)元素允許開發(fā)者以聲明方式請求使用權(quán)限,如下例所示:
<permission type="camera" />
“type” 屬性代表你正在請求的權(quán)限列表(如果有多個(gè)可以以空格分割)。目前,允許的值是 'camera','microphone' 以及 'camera microphone'。默認(rèn)情況下,這個(gè)元素呈現(xiàn)出來的樣子類似于具有最簡用戶代理樣式的按鈕。
對于某些允許附加參數(shù)的權(quán)限,type-ext 屬性接受以空格分隔的鍵值對,例如 precise:true 地理位置權(quán)限。
當(dāng)用戶與 <permission> 元素交互時(shí),他們可以循環(huán)經(jīng)歷各個(gè)階段:
如果他們之前不允許某項(xiàng)功能,他們可以在每次訪問時(shí)允許該功能,或者在當(dāng)前訪問時(shí)允許該功能。
如果他們之前允許該功能,他們可以繼續(xù)允許,或者停止允許。
如果他們之前不允許某項(xiàng)功能,他們可以繼續(xù)不允許它,或者這次允許它。
<permission> 元素的文本會根據(jù)狀態(tài)自動更新。例如,如果已授予使用某項(xiàng)功能的權(quán)限,則文本會更改為表示允許使用該功能。如果需要先授予權(quán)限,則文本會更改為邀請用戶使用該功能。將之前的屏幕截圖與以下屏幕截圖進(jìn)行比較,以查看這兩種狀態(tài)。
<permission> 元素可以與 Permissions API 一起使用。有許多事件可供監(jiān)聽:
我們可以直接在 HTML 代碼中內(nèi)聯(lián)注冊這些事件的事件監(jiān)聽器(<permission type="…" onpromptdismiss="alert('The prompt was dismissed');" />),或者在 <permission> 元素上使用 addEventListener():
<permission type="camera" />
<script>
const permission = document.querySelector('permission');
permission.addEventListener('promptdismiss', showCameraWarning);
function showCameraWarning() {
// Show warning that the app isn't fully usable
// unless the camera permission is granted.
}
const permissionStatus = await navigator.permissions.query({name: "camera"});
permissionStatus.addEventListener('change', () => {
// Run the check when the status changes.
if (permissionStatus.state === "granted") {
useCamera();
}
// Run the initial check.
if (permissionStatus.state === "granted") {
useCamera();
}
});
</script>
參考:https://developer.chrome.com/blog/permission-element-origin-trial
天給大家介紹一個(gè)非常好用的前端插件jQuery UI。
jQuery UI是以 jQuery 為基礎(chǔ)的開源 JavaScript 網(wǎng)頁用戶界面代碼庫。包含底層用戶交互、動畫、特效和可更換主題的可視控件。
下面是一個(gè)以jQuery UI實(shí)現(xiàn)的彈出登錄框功能,代碼非常簡單。
<!DOCTYPE html>
<html>
<head>
<title> new document </title>
<meta charset="utf-8">
<link rel="stylesheet" href="css/bootstrap.css">
<link rel="stylesheet" href="css/jquery-ui.css">
</head>
<body>
<h1>jQueryUI:Widgets —— Dialog</h1>
<h3>彈出式對話框</h3>
<a id="btn-login" class="btn btn-success" href="#">我要登錄</a>
<div id="dialog-login" title="用戶登錄">
<form action="">
用戶名:<input type="text"><br>
密碼名:<input type="password"><br>
</form>
</div>
<script src="js/jquery-1.11.3.js"></script>
<script src="JS/jquery-ui.js"></script>
<script>
var $dialog=$("#dialog-login")
$dialog.dialog({
autoOpen:false,
modal:false,
show:{effect:"blind",duration:1000},
hide:{effect:"explode",duration:1000},
buttons:{
"登錄":()=>setTimeout(()=>{
alert("登錄成功");
$dialog.dialog("close");
},1000),
"取消":()=>$dialog.dialog("close")
},
close(){
$("form").get(0).reset()
}
});
$("#btn-login").click(()=>{
$dialog.dialog("open")
})
</script>
</body>
</html>
天給大家推薦一款超美觀的pc端vue.js彈窗組件VueJsModal。
vue-js-modal 基于Vue構(gòu)建的Modal對話框組件。單獨(dú)組件,方便使用。支持拖拽、縮放、異步調(diào)用組件。
安裝
$ npm i vue-js-modal -S
引入組件
// 在main.js中引入
import Vue from 'vue'
import VModal from 'vue-js-modal'
import 'vue-js-modal/dist/styles.css'
Vue.use(VModal)
調(diào)用方式
<template>
<modal name="example"
:width="300"
:height="300"
:resizable="true"
:draggable="true"
:adaptive="true"
@before-open="beforeOpen"
@opened="Opened"
@before-close="beforeClose"
@closed="Closed"
>
Hello, VueModal!
</modal>
</template>
<script>
export default {
data() {
return {}
},
mounted() {
this.$modal.show('example')
},
methods: {
beforeOpen(event) {
console.log('Opening...')
},
Opened(event) {
console.log('Opened...')
},
beforeClose(event) {
console.log('Closing...')
},
Closed(event) {
console.log('Closed...')
}
}
}
</script>
調(diào)用內(nèi)部 show、hide 方法顯示和隱藏彈窗
<template>
<modal name="my-first-modal">
This is my first modal
</modal>
</template>
<script>
export default {
mounted () {
this.show()
},
methods: {
show () {
this.$modal.show('my-first-modal');
},
hide () {
this.$modal.hide('my-first-modal');
}
}
}
</script>
另外還支持Modal動態(tài)調(diào)用組件
import MyComponent from './MyComponent.vue'
this.$modal.show(
MyComponent,
{ text: 'This text is passed as a property' },
{ draggable: true }
)
// or
this.$modal.show(
{
template: `
<div>
<h1>This is created inline</h1>
<p>{{ text }}</p>
</div>
`,
props: ['text']
},
{ text: 'This text is passed as a property' },
{ draggable: true, resizable: true },
{ 'before-close': event => {} }
)
附上模態(tài)框示例及倉庫地址
# demo地址
http://vue-js-modal.yev.io/
# 項(xiàng)目地址
https://github.com/euvl/vue-js-modal
ok,這次就分享到這里。如果大家有其它Vue彈窗組件,歡迎留言討論~
*請認(rèn)真填寫需求信息,我們會在24小時(shí)內(nèi)與您取得聯(lián)系。