Permission API 統一查詢權限狀態

20190326225810.png

Permission API 不是一個新的標準,早在 2015 年,就已經成爲標準。這個 API 的主要做用就是提供一個統一的查詢 API 權限的接口。 😌瀏覽器

若是咱們使用 Notification API,那麼須要這樣操做:函數

Notification.requestPermission().then(function (permission) {
    if (permission === 'granted') {
        let notification = new Notification('helloooooo')
    } else if(/* ... */) {
        // ...
    } else {
        // ...
    }
})
複製代碼

首先要調用 requestPermission 方法,而後在回調函數中檢查 permission 參數是否爲 granted 若是是那麼證實已經獲取到權限,則能夠建立 Notification 實例ui

20190326222057.png

而後再看看 Geolocation API 是如何獲取權限的:this

navigator.geolocation.getCurrentPosition(console.log, console.error)
複製代碼

20190326222732.png

哦吼?不須要顯式調用並驗證是否爲獲取到權限,而是經過回調函數來作檢查 😵spa

因此,有的時候就會致使混亂,Permission API 這個玩意就是爲了解決這個標準不統一的問題的3d

那麼具體怎麼用呢 ❓code

這裏的 permission 就是指 navigator.permissions 他有一個 query 方法,用來查詢權限狀態:cdn

navigator.permissions.query({ name: 'geolocation' }).then(status => {
    console.log(`當前狀態 ${status.state}`)
    // status 是一個 PermissionStatus 的實例
})
複製代碼

接收一個對象,這個對象的屬性 name 爲須要查詢的 API 的名稱,效果以下:對象

20190326223813.png

他有三種狀態分別是:blog

  • granted
  • denied
  • prompt

這個 PermissionStatus 還有一個 change 的事件,能夠監聽這個事件針對權限變化作進一步處理

一樣的對於 Notification 也是傳入參數到 query 來查詢:

navigator.permissions.query({ name: 'notifications' }).then(status => {
    console.log(`當前狀態 ${status.state}`)
    status.onchange = function() {
        console.log(`狀態改變 ${this.state}`, this.state)
    }
})
複製代碼

效果以下:

20190326224640.png

固然若是須要獲取權限,那麼仍是須要根據特定的 API 來編寫代碼,Permission 只提供查詢的功能 😫

補充:

查詢到瀏覽器還支持 navigator.permissions.requestnavigator.permissions.requestAll 方法,用來請求權限,嘗試以下:

navigator.permissions.request({ name: 'geolocation' }).then(console.log)
複製代碼

瀏覽器會彈出並詢問是否受權:

20190326232716.png

那麼這樣一來 Permission 還可以提供請求權限功能

相關文章
相關標籤/搜索