整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          一個(gè)新的 HTML 元素:!

          hrome 126 于近期發(fā)布了穩(wěn)定版本,其中一個(gè)比較有意思的更新是給 HTML 帶來一個(gè)新的元素:<permission> ,它將從這個(gè)版本開始試用,并且正在努力走向標(biāo)準(zhǔn)化。

          今天我們一起來看下這個(gè) <permission> 元素的用法。

          Web 權(quán)限提示的問題

          當(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 APIDevice 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>元素

          為了解決上面的這些問題,<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)聽:

          • onpromptdismiss:當(dāng)元素觸發(fā)的權(quán)限提示被用戶關(guān)閉(例如,單擊關(guān)閉按鈕或單擊提示之外)時(shí),會觸發(fā)此事件。
          • onpromptaction:當(dāng)元素觸發(fā)的權(quán)限提示已被用戶對提示本身采取某種操作解決時(shí),觸發(fā)此事件。這并不一定意味著權(quán)限狀態(tài)已經(jīng)改變,用戶可能已經(jīng)采取了維持現(xiàn)狀的操作(例如繼續(xù)允許權(quán)限)。
          • onvalidationstatuschange:當(dāng)元素從 "valid" 切換到 "invalid" 時(shí)觸發(fā)此事件,例如當(dāng)元素被其他超文本標(biāo)記語言內(nèi)容部分遮擋時(shí),會認(rèn)為是 "invalid"。

          我們可以直接在 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彈窗組件,歡迎留言討論~


          主站蜘蛛池模板: 97精品国产福利一区二区三区| 精品一区二区三区免费毛片爱 | 精品国产一区二区三区AV性色| 国产成人精品一区二三区 | 日本一区二区高清不卡| 在线精品国产一区二区三区| 亚洲av成人一区二区三区| 视频一区精品自拍| 无码毛片一区二区三区中文字幕| 国产精品一区在线播放| 日韩免费观看一区| 国产成人精品无码一区二区| 国产婷婷色一区二区三区深爱网| 中文字幕乱码一区久久麻豆樱花| 亚洲国产一区在线| 日本免费电影一区二区| www一区二区三区| 一区视频在线播放| 精品人妻少妇一区二区三区| 一区 二区 三区 中文字幕| 精品无码中出一区二区| 一区二区三区四区无限乱码| 丰满岳乱妇一区二区三区| av在线亚洲欧洲日产一区二区| 免费萌白酱国产一区二区三区| 成人国内精品久久久久一区 | 夜精品a一区二区三区| 97精品国产一区二区三区| 国产一区二区好的精华液| 成人国产精品一区二区网站公司| 日韩精品电影一区| 国产亚洲综合一区二区三区 | 日本一区二区三区高清| 国产亚洲日韩一区二区三区| 国产精品亚洲综合一区| 国产裸体歌舞一区二区 | 亚洲一区中文字幕久久| 人妻体内射精一区二区三区| 亚洲av成人一区二区三区观看在线 | 色久综合网精品一区二区| 久久久久人妻一区二区三区|