Usando la API de geolocalización podemos pedirle al navegador las coordenadas de posición del usuario
El navegador expone unnavigator.geolocation
objeto, a través del cual haremos todas las operaciones de geolocalización.
Solo está disponible en páginas servidas mediante HTTPS, por motivos de seguridad, y está disponible en todos los navegadores modernos.
navigator.geolocation
Ya que
window
es el objeto global, podemos accedernavigator
sin especificarwindow.navigator
loswindow.navigator
propiedad expuesta por los navegadores apunta a unObjeto navegadorel cual es unobjeto contenedorque pone a nuestra disposición una gran cantidad de API de plataforma web.
losgeolocation
object proporciona los siguientes métodos:
getCurrentPosition()
watchPosition()
clearWatch()
El primero se utiliza para obtener las coordenadas de la posición actual. Cuando llamamos a este método por primera vez, el navegador solicita automáticamente al usuario permiso para compartir esta información con nosotros.
Así es como se ve esta interfaz en Chrome:
en Firefox:
y en Safari:
Esto debe hacerse solo una vez por origen. Puede cambiar la decisión que tomó y revertir una decisión de permiso. Así es como lo hace con Chrome, haciendo clic en el ícono de candado cerca del dominio:
Una vez concedido este permiso, podemos continuar.
Obtener la posición del usuario
Comencemos con este código de muestra:
navigator.geolocation.getCurrentPosition(() => {})
Debería aparecer el panel de permisos. Permita el permiso.
Fíjate como pasé un vacíofunción de flecha, porque la función quiere una función de devolución de llamada.
Esta función se pasa aPosition
objeto, que contiene la ubicación real:
navigator.geolocation.getCurrentPosition(position => {
console.log(position)
})
Este objeto tiene 2 propiedades:
coords
, aCoordinates
objetotimestamp
, laMarca de tiempo de UNIXcuando se recuperó la posición
losCoordinates
El objeto viene con varias propiedades que definen la ubicación:
accuracy
la precisión de la posición medida, expresada en metrosaltitude
el valor de altitud medidoaltitudeAccuracy
la precisión de la altitud medida, expresada en metrosheading
la dirección hacia la que se desplaza el dispositivo. Expresado en grados (0 = Norte, Este = 90, Sur = 180, Oeste = 270)latitude
el valor de latitud medidolongitude
el valor de longitud medidospeed
la velocidad a la que viaja el dispositivo, expresada en metros por segundo
Dependiendo de la implementación y el dispositivo, algunos de ellos seránnull
. Por ejemplo, en Chrome ejecutándose en mi MacBook Air, solo obtuve valores paraaccuracy
,latitude
ylongitude
.
navigator.geolocation.getCurrentPosition(position => {
console.log(position.coords.latitude)
console.log(position.coords.longitude)
})
Observando la posición por cambios
Además de obtener la posición de usuario una vez, lo que puede hacer usandogetCurrentPosition()
, puedes usar elwatchPosition()
método denavigator.geolocation
para registrar una función de devolución de llamada a la que se recurrirá en todos y cada uno de los cambios que el dispositivo nos comunique.
Uso:
navigator.geolocation.watchPosition(position => {
console.log(position)
})
Por supuesto, el navegador solicitará el permiso también con este método, si aún no se ha concedido.
Podemos dejar de buscar una posición llamando alnavigator.geolocation.clearWatch()
método, pasándole elid
devuelto porwatchPosition()
:
const id = navigator.geolocation.watchPosition(position => {
console.log(position)
})
//stop watching after 10 seconds
setTimeout(() => {
navigator.geolocation.clearWatch(id)
}, 10 * 1000)
Si el usuario niega el permiso
¿Recuerda la ventana emergente de permisos que muestra el navegador cuando llamamos a uno de los métodos para obtener la posición?
Si el usuario lo niega, podemos interceptar este escenario agregando una función de manejo de errores, como segundo parámetro a los métodos.getCurrentPosition()
ywatchPosition()
.
navigator.geolocation.getCurrentPosition(position => {
console.log(position)
}, error => {
console.error(error)
})
El objeto pasado al segundo parámetro contiene uncode
propiedad para distinguir entre tipos de error:
1
significa permiso denegado2
significa posición no disponible3
significa tiempo de espera
Añadiendo más opciones
Cuando hablé de errores anteriormente, mencioné el error de tiempo de espera. Buscar la posición puede llevar algún tiempo y podemos establecer un tiempo máximo permitido para realizar la operación, como opción.
Puede agregar un tiempo de espera agregando un tercer parámetro a los métodosgetCurrentPosition()
ywatchPosition()
, un objeto.
navigator.geolocation.getCurrentPosition(position => {
console.log(position)
}, error => {
console.error(error)
}, {
})
Dentro de este objeto podemos pasar las propiedades
timeout
para establecer el número de milisegundos antes de que salgan los errores de solicitudmaximumAge
para establecer la "edad" máxima de la posición almacenada en caché por el navegador. No aceptamos uno más antiguo que la cantidad establecida de milisegundos.enableHighAccuracy
un booleano por defectofalse
, requiere una posición con el mayor nivel de precisión posible (lo que puede llevar más tiempo y más potencia)
Uso de ejemplo:
navigator.geolocation.getCurrentPosition(position => {
console.log(position)
}, error => {
console.error(error)
}, {
timeout: 1000,
maximumAge: 10000,
enableHighAccuracy: true
})
Descarga mi gratisManual para principiantes de JavaScript
Más tutoriales de navegador:
- Algunos trucos útiles disponibles en HTML5
- Cómo hice que un sitio web basado en CMS funcionara sin conexión
- La guía completa de aplicaciones web progresivas
- La API de Fetch
- La guía Push API
- La API de mensajería de canal
- Tutorial para trabajadores de servicios
- La guía de la API de caché
- La guía de la API de notificaciones
- Sumérjase en IndexedDB
- La API de selectores: querySelector y querySelectorAll
- Cargue JavaScript de forma eficiente con diferir y asincrónico
- El modelo de objetos de documento (DOM)
- La API de almacenamiento web: almacenamiento local y almacenamiento de sesiones
- Descubra cómo funcionan las cookies HTTP
- La API de historia
- El formato de imagen WebP
- XMLHttpRequest (XHR)
- Un tutorial detallado de SVG
- ¿Qué son las URL de datos?
- Hoja de ruta para aprender la plataforma web
- CORS, intercambio de recursos de origen cruzado
- Trabajadores web
- La guía requestAnimationFrame ()
- Que es el Doctype
- Trabajar con la consola de DevTools y la API de la consola
- La API de síntesis de voz
- Cómo esperar el evento DOM Ready en JavaScript simple
- Cómo agregar una clase a un elemento DOM
- Cómo recorrer los elementos DOM de querySelectorAll
- Cómo eliminar una clase de un elemento DOM
- Cómo comprobar si un elemento DOM tiene una clase
- Cómo cambiar un valor de nodo DOM
- Cómo agregar un evento de clic a una lista de elementos DOM devueltos por querySelectorAll
- WebRTC, la API web en tiempo real
- Cómo obtener la posición de desplazamiento de un elemento en JavaScript
- Cómo reemplazar un elemento DOM
- Cómo aceptar solo imágenes en un campo de archivo de entrada
- ¿Por qué utilizar una versión de vista previa de un navegador?
- El objeto Blob
- El objeto de archivo
- El objeto FileReader
- El objeto FileList
- ArrayBuffer
- ArrayBufferView
- El objeto URL
- Matrices escritas
- El objeto DataView
- La API BroadcastChannel
- La API de Streams
- El objeto FormData
- El objeto del navegador
- Cómo utilizar la API de geolocalización
- Cómo utilizar getUserMedia ()
- Cómo utilizar la API de arrastrar y soltar
- Cómo trabajar con el desplazamiento en páginas web
- Manejo de formularios en JavaScript
- Eventos de teclado
- Eventos del mouse
- Toque eventos
- Cómo eliminar a todos los hijos de un elemento DOM
- Cómo crear un atributo HTML usando Vanilla Javascript
- ¿Cómo verificar si una casilla de verificación está marcada usando JavaScript?
- Cómo copiar al portapapeles usando JavaScript
- Cómo deshabilitar un botón usando JavaScript
- Cómo hacer que una página sea editable en el navegador
- Cómo obtener valores de cadena de consulta en JavaScript con URLSearchParams
- Cómo eliminar todo el CSS de una página a la vez
- Cómo utilizar insertAdjectedHTML
- Safari, avisa antes de salir
- Cómo agregar una imagen al DOM usando JavaScript
- Cómo restablecer un formulario
- Cómo utilizar las fuentes de Google