版权所有 © 2026 万维网联盟 (W3C)。W3C® 法律免责声明、商标及宽松文档许可规则适用。
地理位置 API (Geolocation) 提供对与宿主设备相关联的地理位置信息的访问。
本节描述了本文件发布时的状态。当前的 W3C 出版物列表和本技术报告的最新版本可以在 W3C 标准和草案索引中找到。
地理位置 API 最初作为 W3C 推荐标准于 2022 年 9 月 1 日发布。2026 年 3 月,该规范回归至候选推荐标准阶段,以便工作组能更高效地对实质性变更进行迭代,并持续添加新功能。
在本规范发布时,设备与传感器工作组仍根据 2020 年 9 月 15 日版本的 W3C 专利政策运行。
本文件由 设备与传感器工作组和 Web 应用工作组发布,作为候选推荐标准快照,使用 推荐标准流程 (Recommendation track)。
作为候选推荐标准发布并不意味着 W3C 及其成员的背书。候选推荐标准快照已经过 广泛评审,旨在收集 实现经验,并且工作组成员已承诺为相关实现提供 免版税许可。
预计本候选推荐标准在 2026 年 5 月 1 日之前不会进入推荐标准阶段。
本文件由遵循 W3C 专利政策的组别制定。W3C 维护了一份 专利披露公开列表(设备与传感器工作组) 和一份 专利披露公开列表(Web 应用工作组),其中包含与各组交付成果相关的专利披露;这些页面还包含了披露专利的说明。任何知悉包含 必要权利要求 (Essential Claim(s)) 的专利的个人,必须按照 W3C 专利政策第 6 节的要求披露该信息。
本文件受 2025 年 8 月 18 日 W3C 流程文档约束。
本节是非规范性的。
地理位置 API 定义了一个高级接口,用于获取仅与实现该接口的宿主设备相关联的地理位置信息。常见的地理位置信息源包括全球定位系统 (GPS),以及从网络信号推导出的位置信息(如 IP 地址、RFID、WiFi 和蓝牙 MAC 地址、GSM/CDMA 基站 ID)以及用户输入。API 本身对底层的地理位置信息源不置可否,且不保证 API 返回的是设备的实际位置。
如果最终用户 授予权限,地理位置 API
GeolocationPosition 接口)。getCurrentPosition() 方法进行“一次性”位置更新,并支持通过 watchPosition() 方法在宿主设备位置发生显著变化时接收更新。PositionOptions 的 maximumAge,允许应用请求一个生存时间不超过指定值的缓存位置(仅最后一次位置会被缓存)。GeolocationPositionError 形式)。enableHighAccuracy 支持请求“高精度”位置数据,尽管用户代理可以忽略该请求。本节是非规范性的。
本规范仅限于提供一个用于获取与宿主设备相关联的地理位置信息的脚本 API。地理位置信息以世界大地测量系统坐标 [WGS84] 的形式提供。它不包括提供任何类型的标记语言,也不包括定义用于构建标识地理位置的 URL 的新 URL 方案。
本节是非规范性的。
该 API 的设计旨在同时支持“一次性”位置请求和持续位置更新。以下示例展示了常见的用例。
本节是非规范性的。
请求用户的当前位置。如果用户允许,您将获得一个位置对象。
本节是非规范性的。
请求监听用户的当前位置。如果用户允许,您将获得用户位置的持续更新。
本节是非规范性的。
通过调用 clearWatch() 方法停止监听位置变化。
本节是非规范性的。
当发生错误时,watchPosition() 或 getCurrentPosition() 方法的第二个参数将调用一个 GeolocationPositionError 错误,这有助于确定可能出了什么问题。
本节是非规范性的。
默认情况下,只要 API 有之前获取到的位置,它总是尝试返回该缓存位置。在此示例中,我们接受生存时间不超过 10 分钟的位置。如果用户代理没有足够新的缓存位置对象,它会自动获取一个新位置。
本节是非规范性的。
如果您对位置信息有时间敏感的要求,可以使用 PositionOptions 的 timeout 成员来限制等待 获取位置 的时间。
本节是非规范性的。
'self' 的 默认允许列表 允许在同源嵌套框架中使用 API,但阻止第三方内容使用该 API。
通过在 iframe 元素上添加 allow="geolocation" 属性,可以选择性地启用第三方使用。
或者,可以通过指定 HTTP 响应头在第一方上下文中禁用 API。
有关 Permissions-Policy HTTP 头的更多详情,请参阅 权限策略。
本节是非规范性的。
本规范定义的 API 用于获取宿主设备的地理位置。在几乎所有情况下,此信息也会披露设备用户的位置,从而可能损害用户的隐私。
本节是非规范性的。
地理位置 API 是一项 强大功能,在将任何位置数据共享给 Web 应用之前,需要最终用户的 明确许可。此要求由 getCurrentPosition() 和 watchPosition() 方法所依赖的 检查权限 步骤强制执行。
最终用户通常会通过用户界面给予 明确许可,该界面通常提供一系列最终用户可以选择的权限 生命周期。生命周期的选择因用户代理而异,但通常是基于时间的(例如“一天”),或者直到浏览器关闭,甚至用户可能被给予无限期授予权限的选择。权限 生命周期 决定了用户代理在自动将权限恢复为默认 权限状态(提示最终用户在后续使用时做出新选择)之前 授予 权限的时长。
尽管权限 生命周期 的粒度在不同用户代理之间有所不同,但本规范强烈建议用户代理默认将生命周期限制为单个浏览会话(有关规范性要求,请参见 3.4 检查使用 API 的权限)。
本节是非规范性的。
本节适用于“接收者”,通常是指利用 地理位置 API 的开发者。虽然用户代理或本规范无法强制执行这些要求,但开发者需要仔细阅读本节并尽最大努力遵守以下建议。开发者需要意识到,其管辖区内可能存在规范用户位置数据使用和访问的隐私法律。
接收者应仅在必要时请求位置信息,并仅将位置信息用于提供该信息所针对的任务。除非明确获得用户允许保留,否则接收者应在任务完成后处理掉位置信息。接收者还需要采取措施保护该信息免受未经授权的访问。如果存储了位置信息,则需要允许用户更新和删除此信息。
位置信息的接收者需避免在未经用户明确许可的情况下重新传输位置信息。在重新传输时需特别小心,并鼓励使用加密技术。
接收者应清晰且显眼地披露其正在收集位置数据的事实、收集目的、数据保留时长、数据安全保障方式、若共享则数据如何共享、用户如何访问/更新/删除数据,以及用户对于该数据的任何其他选择权。此披露需要包括对上述指南中任何例外的解释。
本节是非规范性的。
建议实现者考虑可能对用户隐私产生负面影响的以下方面:在某些情况下,用户可能会无意中授予用户代理将位置信息泄露给网站的权限。在其他情况下,托管在特定 URL 上的内容发生了变化,使得先前授予的位置权限不再适用于用户所认为的情况。或者,用户可能只是改变了主意。
预测或预防这些情况本身就很困难。缓解措施和深入的防御性措施是实现的责任,而非由本规范规定。然而,在设计这些措施时,建议实现者启用位置共享的用户感知,并提供允许撤销权限的用户界面。
地理位置 API 是一个 默认强大功能,由 名称 "geolocation" 标识。
当 检查权限 以使用该 API 时,用户代理 可以 建议基于时间的 权限 生命周期,例如“24 小时”、“1 周”,或者选择无限期记住该 授权。然而,强烈建议 用户代理优先考虑将 权限 生命周期 限制为单个会话:例如,直到 领域 (realm) 被销毁、最终用户 导航 离开该 源 (origin) 或相关的浏览器标签页关闭。
本规范发布时,地理位置 API 没有相关的安全考量。但建议读者阅读 3. 隐私考量。
WebIDL[Exposed=Window]
interface Geolocation {
undefined getCurrentPosition (
PositionCallback successCallback,
optional PositionErrorCallback? errorCallback = null,
optional PositionOptions options = {}
);
long watchPosition (
PositionCallback successCallback,
optional PositionErrorCallback? errorCallback = null,
optional PositionOptions options = {}
);
undefined clearWatch (long watchId);
};
callback PositionCallback = undefined (
GeolocationPosition position
);
callback PositionErrorCallback = undefined (
GeolocationPositionError positionError
);
Geolocation 的实例使用下表中的内部插槽进行创建
| 内部槽位 | 描述 |
|---|---|
| [[cachedPosition]] | 一个初始化为 null 的 GeolocationPosition。它是对最后一次获取的位置的引用,并作为缓存使用。用户代理 可以 在任何时间因任何原因通过将其重置为 null 来清除 [[cachedPosition]]。 |
| [[watchIDs]] | 初始化为一个空的 列表,包含 unsigned long 项。 |
getCurrentPosition(successCallback, errorCallback, options) 方法的步骤如下
Document 未处于 完全活动状态POSITION_UNAVAILABLE。watchPosition(successCallback, errorCallback, options) 方法的步骤如下
Document 未处于 完全活动状态POSITION_UNAVAILABLE。unsigned long。[[watchIDs]]。当调用 clearWatch() 时,用户代理 必须
[[watchIDs]]。要 请求位置,需传入一个 Geolocation geolocation、一个 PositionCallback successCallback、一个 PositionErrorCallback? errorCallback、一个 PositionOptions options 以及一个可选的 watchId
[[watchIDs]]。Document。PERMISSION_DENIED。PERMISSION_DENIED。PermissionDescriptor,其 name 为 "geolocation"。PERMISSION_DENIED。要 获取位置,需传入 PositionCallback successCallback、一个 PositionErrorCallback? errorCallback、PositionOptions options 以及一个可选的 watchId。
[[watchIDs]] 不 包含 watchId,终止此算法。EpochTimeStamp。timeout 之和。[[cachedPosition]]。"geolocation" 的结果。GeolocationPositionError
GeolocationPosition,传入 emulatedPositionData、acquisitionTime 和 options.enableHighAccuracy。report"。maximumAge 大于 0maximumAge 成员的值。timestamp 的值大于 cacheTime,且 cachedPosition.[[isHighAccuracy]] 等于 options.enableHighAccuracy
enableHighAccuracy 的值。double,表示以米为单位的精度值,指示 95% 的置信水平。精度衡量测量坐标与真实位置的接近程度。double?,表示在 [WGS84] 椭球体之上的海拔(以米为单位),若不可用则为 null。海拔衡量海平面的高度。double?,表示海拔精度(若不可用则为 null),以米为单位,指示 95% 的置信水平。海拔精度衡量测量海拔与真实海拔的接近程度。double?,表示以度为单位的航向(若不可用或设备静止则为 null)。航向衡量设备相对于真北的移动方向。double,表示地表上以度为单位的纬度坐标,使用 [WGS84] 坐标系。纬度衡量某点距赤道的南北距离。double,表示地表上以度为单位的经度坐标,使用 [WGS84] 坐标系。经度衡量某点距本初子午线的东西距离。double?,表示以米每秒为单位的速度(若不可用则为 null)。速度衡量设备移动的快慢。GeolocationPosition,传入 positionData、acquisitionTime 和 options.enableHighAccuracy。[[cachedPosition]] 为 position。report"。
错误回调,传入 errorCallback 和 PERMISSION_DENIED。
TIMEOUT。POSITION_UNAVAILABLE。当被指示 进行错误回调 时,需提供一个 PositionErrorCallback? callback 和一个 unsigned short code
GeolocationPositionError 实例,其 code 属性初始化为 code。report"。WebIDLdictionary PositionOptions {
boolean enableHighAccuracy = false;
[Clamp] unsigned long timeout = 0xFFFFFFFF;
[Clamp] unsigned long maximumAge = 0;
};
enableHighAccuracy enableHighAccuracy 成员提供了一个提示,即应用希望接收最精确的位置数据。此成员的预期目的是允许应用告知实现其不需要高精度地理位置修正,因此实现 可以 避免使用消耗大量电能的地理位置提供商(例如 GPS)。
timeout timeout 成员表示 获取位置 过期前的最长时间,以毫秒为单位。
等待文档变得可见和 获取使用 API 的权限 所花费的时间不计入 timeout 成员所覆盖的周期中。timeout 成员仅在开始 获取位置 时适用。
maximumAge maximumAge 成员表示 Web 应用愿意接受生存时间不超过指定时间(以毫秒为单位)的缓存位置。
WebIDL[Exposed=Window, SecureContext]
interface GeolocationPosition {
readonly attribute GeolocationCoordinates coords;
readonly attribute EpochTimeStamp timestamp;
[Default] object toJSON();
};
coords 属性包含地理坐标。
timestamp 属性表示设备地理位置获取的时间。
toJSON() 方法返回 GeolocationPosition 对象的 JSON 表示。
GeolocationPosition 的实例使用下表中的内部插槽进行创建
| 内部槽位 | 描述 |
|---|---|
| [[isHighAccuracy]] | 一个 boolean,记录了当此 GeolocationPosition 被创建 时的 enableHighAccuracy 成员的值。 |
本规范定义了以下 任务源。
PositionCallback 和 PositionErrorCallback(在执行 位置请求 时)。WebIDL[Exposed=Window, SecureContext]
interface GeolocationCoordinates {
readonly attribute double accuracy;
readonly attribute double latitude;
readonly attribute double longitude;
readonly attribute double? altitude;
readonly attribute double? altitudeAccuracy;
readonly attribute double? heading;
readonly attribute double? speed;
[Default] object toJSON();
};
latitude 和 longitude 属性表示位置,以 [WGS84] 坐标系中以度为单位的实数指定。
accuracy 属性表示以米为单位的位置精度半径。
altitude 属性表示位置高度,指定为在 [WGS84] 椭球体之上的米数。
altitudeAccuracy 属性表示以米为单位的海拔精度(例如 10 米)。
heading 属性表示宿主设备的移动方向,以度为单位,其中 0° ≤ heading < 360°,相对于真北顺时针计数。
speed 属性表示宿主设备当前速度的水平分量大小,以米每秒为单位。
toJSON() 方法返回 GeolocationCoordinates 对象的 JSON 表示。
一个新的 GeolocationPosition 的构造方式为:传入 映射 positionData、EpochTimeStamp timestamp 和布尔值 isHighAccuracy,并执行以下步骤
GeolocationCoordinates 实例。GeolocationPosition 实例,其 coords 属性初始化为 coords,timestamp 属性初始化为 timestamp,且其 [[isHighAccuracy]] 内部插槽设置为 isHighAccuracy。WebIDL[Exposed=Window]
interface GeolocationPositionError {
const unsigned short PERMISSION_DENIED = 1;
const unsigned short TIMEOUT = 3;
readonly attribute unsigned short code;
readonly attribute DOMString message;
};
PERMISSION_DENIED (数值 1)POSITION_UNAVAILABLE (数值 2)TIMEOUT (数值 3)timeout 成员指定的时长已过期。message 属性是对 code 属性的开发者友好文本描述。
本规范定义了一个由 策略控制的功能,由标记字符串 "geolocation" 标识。其 默认允许列表 为 'self'。
出于用户代理自动化和应用测试的目的,本文件定义了地理位置模拟。
每个 顶层可遍历对象 (top-level traversable) 都有一个关联的 模拟位置数据 (emulated position data),它代表 GeolocationCoordinates、GeolocationPositionError 或 null,初始为 null。
要 设置模拟位置数据,需提供 可导航对象 (navigable) navigable 和一个 emulatedPositionData
GeolocationCoordinates 或 GeolocationPositionError。要 获取模拟位置数据,需提供 Geolocation geolocation
Document 的 节点可导航对象 (node navigable)。除了标记为非规范性的章节外,本规范中的所有创作指南、图表、示例和注释均为非规范性内容。本规范中的其他所有内容均为规范性内容。
本文档中的关键字 MAY (可以)、MUST (必须) 和 RECOMMENDED (推荐) 仅在全部大写时(如所示),按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释。
WebIDLpartial interface Navigator {
[SameObject] readonly attribute Geolocation geolocation;
};
[Exposed=Window]
interface Geolocation {
undefined getCurrentPosition (
PositionCallback successCallback,
optional PositionErrorCallback? errorCallback = null,
optional PositionOptions options = {}
);
long watchPosition (
PositionCallback successCallback,
optional PositionErrorCallback? errorCallback = null,
optional PositionOptions options = {}
);
undefined clearWatch (long watchId);
};
callback PositionCallback = undefined (
GeolocationPosition position
);
callback PositionErrorCallback = undefined (
GeolocationPositionError positionError
);
dictionary PositionOptions {
boolean enableHighAccuracy = false;
[Clamp] unsigned long timeout = 0xFFFFFFFF;
[Clamp] unsigned long maximumAge = 0;
};
[Exposed=Window, SecureContext]
interface GeolocationPosition {
readonly attribute GeolocationCoordinates coords;
readonly attribute EpochTimeStamp timestamp;
[Default] object toJSON();
};
[Exposed=Window, SecureContext]
interface GeolocationCoordinates {
readonly attribute double accuracy;
readonly attribute double latitude;
readonly attribute double longitude;
readonly attribute double? altitude;
readonly attribute double? altitudeAccuracy;
readonly attribute double? heading;
readonly attribute double? speed;
[Default] object toJSON();
};
[Exposed=Window]
interface GeolocationPositionError {
const unsigned short PERMISSION_DENIED = 1;
const unsigned short POSITION_UNAVAILABLE = 2;
const unsigned short TIMEOUT = 3;
readonly attribute unsigned short code;
readonly attribute DOMString message;
};accuracy 属性 (针对 GeolocationCoordinates) §9.1altitude 属性 (针对 GeolocationCoordinates) §9.2altitudeAccuracy 属性 (针对 GeolocationCoordinates) §9.2[[cachedPosition]] 内部插槽 (针对 Geolocation) §6.1clearWatch() 方法 (针对 Geolocation) §6.4code 属性 (针对 GeolocationPositionError) §10.2coords 属性 (针对 GeolocationPosition) §8.1enableHighAccuracy 成员 (针对 PositionOptions) §7.1geolocation 属性 (针对 Navigator) §5.1Geolocation 接口 §6."geolocation" §3.4GeolocationCoordinates 接口 §9.GeolocationPosition 接口 §8.GeolocationPositionError 接口 §10.getCurrentPosition 方法 (针对 Geolocation) §6.2heading 属性 (针对 GeolocationCoordinates) §9.3[[isHighAccuracy]] 内部插槽 (针对 GeolocationPosition) §8.4latitude 属性 (针对 GeolocationCoordinates) §9.1longitude 属性 (针对 GeolocationCoordinates) §9.1maximumAge 成员 (针对 PositionOptions) §7.3message 属性 (针对 GeolocationPositionError) §10.3PERMISSION_DENIED §10.1POSITION_UNAVAILABLE §10.1PositionCallback §6.PositionErrorCallback §6.PositionOptions 字典 §7.speed 属性 (针对 GeolocationCoordinates) §9.4timeout 成员 (针对 PositionOptions) §7.2TIMEOUT §10.1timestamp 属性 (针对 GeolocationPosition) §8.2[[watchIDs]] 内部插槽 (针对 Geolocation) §6.1watchPosition 方法 (针对 Geolocation) §6.3EpochTimeStamp
allow 属性 (针对 iframe 元素)
Document)
iframe 元素
Document)
list)
list)
map)
list)
list)
permission)
permission)
name (针对 PermissionDescriptor)
PermissionDescriptor (权限描述符)
boolean 类型
[Clamp] 扩展属性
[Default] 扩展属性
DOMString 接口
double 类型
[Exposed] 扩展属性
long 类型
object 类型
[SameObject] 扩展属性
[SecureContext] 扩展属性
undefined 类型
unsigned long 类型
unsigned short 类型
本节是非规范性的。
本规范基于业界的早期工作,包括 Aza Raskin、Google Gears Geolocation API 和 LocationAware.org 的研究。
同时也感谢 Alec Berntson、Alissa Cooper、Steve Block、Greg Bolsinga、Lars Erik Bolstad、Aaron Boodman、Dave Burke、Chris Butler、Max Froumentin、Shyam Habarakada、Marcin Hanclik、Ian Hickson、Brad Lassey、Angel Machin、Cameron McCormack、Daniel Park、Stuart Parmenter、Olli Pettay、Chris Prince、Arun Ranganathan、Carl Reed、Thomas Roessler、Dirk Segers、Allan Thomson、Martin Thomson、Doug Turner、Erik Wilde、Matt Womer 和 Mohamed Zergaoui 的贡献。
本节是非规范性的。
自 2022 年作为 W3C 推荐标准发布以来,地理位置 API 进行了以下规范性变更
自 2021 年首次公开工作草案以来,直至 2022 年发布为 W3C 推荐标准,地理位置 API 进行了以下规范性变更
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
引用自
自 2016 年发布第二版以来,本规范已进行以下实质性更改:
errorCallback 现在可以为空(nullable)。callbacks 不再被视为“EventHandler”对象(即具有 .handleEvent() 方法的对象),而是专门被视为 IDL 回调函数。[NoInterfaceObject],因此 Geolocation 及本规范的其他接口现在位于全局作用域中。此外,接口名称已从 NavigatorGeolocation* 重命名为 Geolocation*。参阅提交历史以获取完整更改列表。