使用Geolocation API,我們可以向瀏覽器詢問用戶的位置坐標
瀏覽器顯示一個navigator.geolocation
對象,通過它我們將執行所有地理位置操作。
為了安全起見,它僅在使用HTTPS服務的頁面上可用,並且在所有現代瀏覽器中都可用。
navigator.geolocation
自從
window
是全局對象,我們可以訪問navigator
沒有指定window.navigator
這window.navigator
瀏覽器公開的屬性指向導航器對象這是一個容器對象這使我們可以使用許多Web平台API。
這geolocation
對象提供以下方法:
getCurrentPosition()
watchPosition()
clearWatch()
第一個用於獲取當前位置坐標。當我們第一次調用此方法時,瀏覽器會自動詢問用戶是否允許與我們共享此信息。
這是Chrome中該界面的外觀:
在Firefox上:
在Safari上:
每個起點只需執行一次。您可以更改自己做出的決定,並還原權限決定。在Chrome中,您可以通過以下方法來執行此操作:單擊域附近的鎖定圖標:
授予此權限後,我們便可以繼續。
獲取用戶的位置
讓我們從以下示例代碼開始:
navigator.geolocation.getCurrentPosition(() => {})
權限面板應出現。允許權限。
注意我是如何傳遞一個空的箭頭功能,因為該函數需要一個回調函數。
這個函數是通過一個Position
對象,其中包含實際位置:
navigator.geolocation.getCurrentPosition(position => {
console.log(position)
})
該對象具有2個屬性:
coords
, 一種Coordinates
目的timestamp
, 這UNIX時間戳檢索職位時
這Coordinates
對象帶有幾個定義位置的屬性:
accuracy
所測量位置的精度,以米為單位altitude
測得的高度值altitudeAccuracy
測得的高度精度,以米為單位heading
設備運行的方向。以度數表示(0 =北,東= 90,南= 180,西= 270)latitude
測得的緯度值longitude
經度測量值speed
設備運行的速度,以米/秒為單位
根據實現方式和設備的不同,其中一些null
。例如,在我的MacBook Air上運行的Chrome上,我僅獲得了accuracy
,latitude
和longitude
。
navigator.geolocation.getCurrentPosition(position => {
console.log(position.coords.latitude)
console.log(position.coords.longitude)
})
觀察職位變化
除了獲得用戶位置一次,您還可以使用getCurrentPosition()
,您可以使用watchPosition()
的方法navigator.geolocation
註冊一個回調函數,該函數將在設備將與我們進行通信的每次更改時調用。
用法:
navigator.geolocation.watchPosition(position => {
console.log(position)
})
當然,如果尚未授予該權限,瀏覽器也會使用此方法來請求該權限。
我們可以通過致電navigator.geolocation.clearWatch()
方法,將其傳遞給id
由...返回watchPosition()
:
const id = navigator.geolocation.watchPosition(position => {
console.log(position)
})
//stop watching after 10 seconds
setTimeout(() => {
navigator.geolocation.clearWatch(id)
}, 10 * 1000)
如果用戶拒絕許可
還記得我們調用其中一種方法獲取位置時瀏覽器顯示的權限彈出窗口嗎?
如果用戶拒絕,我們可以通過添加一個錯誤處理函數作為方法的第二個參數來攔截這種情況。getCurrentPosition()
和watchPosition()
。
navigator.geolocation.getCurrentPosition(position => {
console.log(position)
}, error => {
console.error(error)
})
傳遞給第二個參數的對象包含一個code
屬性以區分錯誤類型:
1
表示拒絕權限2
表示位置不可用3
表示超時
添加更多選項
當我以前談論錯誤時,我提到了超時錯誤。查找位置可能需要一些時間,並且我們可以選擇設置允許執行操作的最長時間。
您可以通過在方法中添加第三個參數來添加超時getCurrentPosition()
和watchPosition()
, 一個東西。
navigator.geolocation.getCurrentPosition(position => {
console.log(position)
}, error => {
console.error(error)
}, {
})
在此對象內,我們可以傳遞屬性
timeout
設置請求錯誤輸出之前的毫秒數maximumAge
設置瀏覽器緩存位置的最大“年齡”。我們不接受比設定的毫秒數還早的時間enableHighAccuracy
默認為布爾false
,則需要一個可能具有最高精確度的位置(這可能需要更多時間和更多能量)
用法示例:
navigator.geolocation.getCurrentPosition(position => {
console.log(position)
}, error => {
console.error(error)
}, {
timeout: 1000,
maximumAge: 10000,
enableHighAccuracy: true
})
免費下載我的JavaScript初學者手冊
更多瀏覽器教程:
- HTML5提供了一些有用的技巧
- 我如何使基於CMS的網站脫機工作
- 漸進式Web應用程序完整指南
- 提取API
- 推送API指南
- 頻道消息傳遞API
- 服務人員教程
- 緩存API指南
- 通知API指南
- 深入IndexedDB
- Selectors API:querySelector和querySelectorAll
- 通過延遲和異步有效地加載JavaScript
- 文檔對像模型(DOM)
- Web存儲API:本地存儲和會話存儲
- 了解HTTP Cookies的工作原理
- 歷史API
- WebP圖像格式
- XMLHttpRequest(XHR)
- 深入的SVG教程
- 什麼是數據網址
- 學習網絡平台的路線圖
- CORS,跨域資源共享
- 網絡工作者
- requestAnimationFrame()指南
- 什麼是Doctype
- 使用DevTools控制台和控制台API
- 語音合成API
- 如何在純JavaScript中等待DOM ready事件
- 如何將類添加到DOM元素
- 如何遍歷來自querySelectorAll的DOM元素
- 如何從DOM元素中刪除類
- 如何檢查DOM元素是否具有類
- 如何更改DOM節點值
- 如何將click事件添加到從querySelectorAll返回的DOM元素列表中
- WebRTC,實時Web API
- 如何在JavaScript中獲取元素的滾動位置
- 如何替換DOM元素
- 如何只接受輸入文件字段中的圖像
- 為什麼要使用瀏覽器的預覽版?
- 斑點對象
- 文件對象
- FileReader對象
- FileList對象
- ArrayBuffer
- ArrayBufferView
- URL對象
- 類型數組
- DataView對象
- BroadcastChannel API
- Streams API
- FormData對象
- 導航器對象
- 如何使用地理位置API
- 如何使用getUserMedia()
- 如何使用拖放API
- 如何在網頁上滾動
- 在JavaScript中處理表單
- 鍵盤事件
- 鼠標事件
- 觸摸事件
- 如何從DOM元素中刪除所有子級
- 如何使用原始Javascript創建HTML屬性
- 如何檢查是否使用JavaScript選中了複選框?
- 如何使用JavaScript複製到剪貼板
- 如何使用JavaScript禁用按鈕
- 如何在瀏覽器中使頁面可編輯
- 如何使用URLSearchParams在JavaScript中獲取查詢字符串值
- 如何一次刪除頁面上的所有CSS
- 如何使用insertAdjacentHTML
- Safari,退出前警告
- 如何使用JavaScript將圖像添加到DOM
- 如何重設表格
- 如何使用Google字體