Ves al contingut principal

Objecte navigator

L'objecte navigator de JavaScript és un objecte del BOM (Browser Object Model) que proporciona informació sobre el navegador de l'usuari i l'estat del sistema on s'executa. És el teu punt d'accés per obtenir dades sobre quin programari està utilitzant l'usuari (el nom i la versió del navegador) i quines capacitats té el dispositiu (geolocalització, connexió a Internet, etc.).

Pots accedir-hi mitjançant window.navigator o, simplement, navigator.

Propietats de navigator

Les propietats principals de navigator es divideixen en informació bàsica (compatibilitat) i informació avançada (estat del sistema/capacitats).

Propietats d'informació i compatibilitat (Legacy)

Aquestes propietats solien ser molt usades, però avui dia estan desaconsellades per a la detecció de navegadors específica a causa de la suplantació (spoofing) i la manca de precisió. Són de només lectura.

Propietat Descripció Exemple de Valor
userAgent Retorna la cadena completa de l'agent d'usuari (user agent) enviada pel navegador. 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/117.0.0.0 Safari/537.36'
appName El nom oficial de l'aplicació. Històricament, retorna gairebé sempre 'Netscape' per raons de compatibilitat. 'Netscape'
appVersion La versió del navegador, sovint poc fiable. '5.0 (Windows)'
platform La plataforma del sistema operatiu on s'està executant el navegador. 'Win32', 'MacIntel', 'Linux x86_64'
cookieEnabled Un booleà que indica si les cookies estan habilitades al navegador (true o false). true
language La configuració de llengua preferida del navegador (p. ex., 'ca', 'en-US'). 'ca-ES'

 

Propietats de capacitat i estat del sistema (Modernes)

Aquestes propietats accedeixen a funcionalitats i estats específics del dispositiu o el navegador.

Propietat Descripció Cas d'Ús
onLine Un booleà que indica l'estat de la connexió a Internet (true si està online). Comprovar si es pot sincronitzar dades amb un servidor.
geolocation Un objecte que conté mètodes per obtenir la ubicació geogràfica de l'usuari. Sol·licitar coordenades GPS per mostrar un mapa.
mediaDevices Un objecte que proporciona accés a càmeres, micròfons i altres dispositius multimèdia. Desenvolupar aplicacions de videoconferència o càmera web.
clipboard API per llegir i escriure contingut al porta-retalls. Implementar un botó de "Copiar URL".
storage API per gestionar la quota d'emmagatzematge persistent. Comprovar l'espai disponible per a dades offline.
vendor El venedor del navegador (sovint buit o poc fiable, excepte per a Chrome). 'Google Inc.'
maxTouchPoints El nombre màxim de punts de contacte simultanis (tocs) compatibles amb el dispositiu. Detectar si el dispositiu és tàctil per ajustar la interfície.

Mètodes de navigator

A diferència de location i history, navigator té pocs mètodes directes a l'objecte base. La majoria de les funcionalitats s'implementen mitjançant mètodes dels sub-objectes (com navigator.geolocation o navigator.mediaDevices).

Mètode Descripció Cas d'Ús
javaEnabled() Retorna un booleà que indica si Java està habilitat. (Moltes vegades retorna false o no està suportat). Comprovació de compatibilitat de components legacy (desaconsellat).
getBattery() Mètode que permet accedir a l'estat de la bateria (obsolet/no disponible en tots els navegadors). Utilitzat per reduir el consum d'energia de la pàgina si la bateria és baixa.
vibrate(pattern) Fes vibrar el dispositiu de l'usuari (si és compatible). Notificacions tàctils en aplicacions mòbils.

Exemples i casos d'ús

1. Detecció de connexió Online/Offline

Aquest és un cas d'ús molt important per a les aplicacions offline.

JavaScript
function comprovarEstatConnexio() {
    if (navigator.onLine) {
        console.log("Estàs connectat a Internet. Sincronitzant dades...");
    } else {
        console.log("Estàs fora de línia. Les dades es desaran localment.");
    }
}

// També pots utilitzar esdeveniments per reaccionar als canvis
window.addEventListener('online', () => {
    console.log("Connexió RESTABLIDA.");
});
window.addEventListener('offline', () => {
    console.log("Connexió PERDUDA.");
});

2. Geolocalització (navigator.geolocation)

Permet obtenir la posició de l'usuari amb el seu consentiment.

JavaScript
function obtenirPosicio() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(
            // Funció d'èxit
            (posicio) => {
                const latitud = posicio.coords.latitude;
                const longitud = posicio.coords.longitude;
                console.log(`Posició: ${latitud}, ${longitud}`);
            },
            // Funció d'error
            (error) => {
                console.error(`Error de geo-localització: ${error.code}`);
            }
        );
    } else {
        console.error("El teu navegador no suporta la geolocalització.");
    }
}

3. Detecció de llengua i configuració

Per oferir la versió correcta de la pàgina.

JavaScript
const idiomaPreferit = navigator.language; // Ex: 'ca-ES'
const idiomaBase = idiomaPreferit.split('-')[0]; // Ex: 'ca'

if (idiomaBase === 'ca') {
    console.log("Mostrant contingut en català.");
} else if (idiomaBase === 'es') {
    console.log("Mostrant contingut en castellà.");
} else {
    console.log("Utilitzant l'anglès com a idioma per defecte.");
}

4. Detecció de dispositius tàctils

Per oferir controls més grans o una interfície diferent.

JavaScript
// La propietat 'maxTouchPoints' és un bon indicador, però hi ha altres mètodes
const esTactil = navigator.maxTouchPoints > 0;

if (esTactil) {
    document.body.classList.add('interficie-tactil');
    console.log("Interfície optimitzada per a tàctil.");
} else {
    console.log("Interfície per a ratolí/teclat.");
}

5. Accedir càmera navigator.mediaDevices (Càmera i Micròfon). 

L'objecte mediaDevices proporciona accés als dispositius d'entrada multimèdia (càmera i micròfon) mitjançant l'API MediaDevices. El mètode clau és getUserMedia(), que sol·licita permís a l'usuari.

JavaScript
// Obté l'element <video> del DOM
const videoElement = document.getElementById('myVideo');

function activarCamera() {
    if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
        // Sol·licita accés al vídeo
        navigator.mediaDevices.getUserMedia({ video: true, audio: false })
            .then(stream => {
                // Connecta el flux de vídeo a l'element <video>
                videoElement.srcObject = stream;
                videoElement.play();
                console.log("Càmera activada correctament.");
            })
            .catch(error => {
                // Gestió d'errors (p. ex., usuari denega el permís)
                console.error("No s'ha pogut accedir a la càmera: ", error);
            });
    } else {
        console.error("El navegador no suporta MediaDevices API.");
    }
}

// Cas d'ús: En una aplicació de videoconferència o un escàner de codis QR.
// Però caldria afegir un `<button onclick="activarCamera()">Activar Càmera</button>`

6. Porta-retalls navigator.clipboard 

L'API Clipboard permet llegir i escriure text al porta-retalls del sistema de manera asíncrona, requerint el permís de l'usuari en la majoria dels casos per raons de seguretat. Exemple: Escriure (Copiar) al Porta-retalls

JavaScript
const textACopiar = "Aquesta és l'URL que vull compartir.";

function copiarAlPortaRetalls(text) {
    if (navigator.clipboard) {
        // Utilitza el mètode asíncron writeText
        navigator.clipboard.writeText(text)
            .then(() => {
                alert(`"${text}" copiat al porta-retalls!`);
            })
            .catch(err => {
                console.error('No s\'ha pogut copiar el text: ', err);
            });
    } else {
        // Fallback per a navegadors antics (utilitzant document.execCommand)
        console.warn("Clipboard API no suportada. Utilitzant mètode antic.");
    }
}

// Cas d'ús: Implementar un botó de "Copiar enllaç" o "Copiar codi" fàcil.
// copiarAlPortaRetalls(textACopiar);

7. Gestió emmagatzematge navigator.storage

L'emmagatzemament persistent en el context d'una aplicació web es refereix a la capacitat d'una pàgina web o una aplicació web progressiva (PWA) de sol·licitar al navegador que protegeixi les dades emmagatzemades localment (com les bases de dades IndexedDB, l'API Cache o Web Storage) per evitar que siguin eliminades automàticament pel navegador en situacions de baixa memòria o d'espai d'emmagatzematge limitat. A diferència de l'emmagatzemament normal, que es considera "millor esforç" (best effort) i pot ser esborrat sense previ avís, l'emmagatzemament persistent (navigator.storage.persist()) garanteix que les dades crucials d'una aplicació (com el contingut offline o la configuració d'usuari) romanguin segures al dispositiu de l'usuari a llarg termini, millorant la fiabilitat de l'experiència offline.

L'objecte storage proporciona mètodes per gestionar l'emmagatzematge del lloc web, com ara el càlcul de la quota d'emmagatzematge i la sol·licitud d'emmagatzematge persistent. Exemple: Comprovar la Quota d'Emmagatzematge

JavaScript
function comprovarQuota() {
    if (navigator.storage && navigator.storage.estimate) {
        // Utilitza el mètode estimate() per obtenir l'ús actual i la quota total
        navigator.storage.estimate()
            .then(estimacio => {
                const usMB = (estimacio.usage / 1024 / 1024).toFixed(2);
                const quotaMB = (estimacio.quota / 1024 / 1024).toFixed(2);
                
                console.log(`Ús actual: ${usMB} MB`);
                console.log(`Quota total: ${quotaMB} MB`);
                
                const percentatgeUs = ((estimacio.usage / estimacio.quota) * 100).toFixed(2);
                console.log(`Usat: ${percentatgeUs}%`);
            });
    } else {
        console.warn("El mètode navigator.storage.estimate() no està disponible.");
    }
}

// Cas d'ús: Aplicacions web progressives (PWA) que necessiten emmagatzemar dades 
// grans offline (IndexedDB, Cache API) i comprovar si tenen espai per guardar-les.
// comprovarQuota();

8. Informació navegador (navigator.userAgent) 

La cadena userAgent és un identificador enviat pel navegador a cada servidor web, i actua com el "document d'identitat" digital del client. La seva estructura és històricament complexa i sovint poc precisa a causa de les necessitats de compatibilitat (spoofing). En una cadena userAgent típica, hi podem trobar diverses seccions clau que proporcionen informació sobre:

Informació del navegador i motor de renderització

La major part de la cadena se centra en identificar el programari utilitzat per l'usuari per visualitzar el contingut web:

  • Identificador de Compatibilitat (Legacy): Gairebé sempre comença amb Mozilla/5.0. Això es manté per raons històriques, ja que molts llocs antics requerien el navegador Netscape (Mozilla) per funcionar.

  • Motor de Renderització: Indica el motor que utilitza el navegador per interpretar l'HTML i el CSS. Per exemple:

    • AppleWebKit/XXX: Utilitzat per navegadors basats en Chromium (Chrome, Edge, Opera) i Safari.

    • Gecko/XXX: Utilitzat per Firefox.

  • Nom i Versió del Navegador: Es pot trobar el nom real del navegador i la seva versió, tot i que sovint s'emmascaren:

    • Chrome/XXX (per a Google Chrome o Edge basat en Chromium).

    • Firefox/XXX (per a Mozilla Firefox).

    • Safari/XXX (per a Apple Safari).


Informació del SSOO i Plataforma

Aquesta secció especifica l'entorn de programari i hardware on s'executa el navegador:

  • Sistema Operatiu (OS): Identifica l'OS. Exemples:

    • Windows NT 10.0 (per a Windows 10/11).

    • Macintosh; Intel Mac OS X 10_15 (per a macOS).

    • X11; Linux x86_64 (per a sistemes Linux).

  • Tipus de Dispositiu: Indica si és un dispositiu mòbil, de taula, o una tauleta:

    • Mobi (una etiqueta comú per a dispositius mòbils).

    • Android XXX (per a telèfons/tauletes Android).

Exemple userAgent

Aquí hi ha un exemple típic de cadena userAgent desglossada:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Segment Informació Significat
Mozilla/5.0 Compatibilitat Identificador històric.
(Windows NT 10.0; Win64; x64) Sistema Operatiu Windows 10/11, arquitectura 64-bit.
AppleWebKit/537.36 Motor de Renderització Usant el motor WebKit.
(KHTML, like Gecko) Compatibilitat Més referències històriques per dir "sóc compatible amb tot".
Chrome/120.0.0.0 Navegador Principal És Google Chrome, versió 120.
Safari/537.36 Identificador Secundari S'inclou per compatibilitat amb llocs que busquen Safari.

Casos d'Ús: Històricament, es feia servir per oferir contingut específic a cada navegador o dispositiu, però avui dia s'utilitza principalment per a anàlisi i logging de trànsit web i errors. Per detectar funcionalitats (com la càmera o la geolocalització), és molt més recomanable utilitzar la detecció de característiques (p. ex., comprovant si navigator.geolocation existeix).

La propietat userAgent retorna la cadena que el navegador envia al servidor per identificar-se. Tot i que està desaconsellada per a la detecció de funcionalitats (és millor fer detecció de característiques, no de navegadors!), segueix sent útil per a registres i certes necessitats. Exemple: Analitzar la Cadena userAgent

JavaScript
const userAgentString = navigator.userAgent;
let missatge = `La cadena de l'agent d'usuari és: ${userAgentString}`;

// Cas d'ús: Detecció simple (i sovint imprecisa) de mòbil.
// NOTA: Per a detecció de mòbil, és millor fer-ho basat en mitjans CSS o altres propietats
// com navigator.maxTouchPoints.

if (userAgentString.includes('Mobi') || userAgentString.includes('Android')) {
    missatge += "\nSembla que l'usuari està utilitzant un dispositiu mòbil.";
} else {
    missatge += "\nSembla que l'usuari està utilitzant un escriptori.";
}

console.log(missatge);

// Cas d'ús: Enviar aquesta informació al servidor juntament amb els logs d'error
// per entendre l'entorn on s'ha produït un problema.