Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
地理位置提供对与托管设备相关联的地理位置信息的访问。
本节描述本 文档在发布时的状态。当前 W3C 发布物列表及本技术报告的最新修订版可在 W3C 标准及草案索引中查阅。
Geolocation 于 W3C 于 2022年9月1日作为推荐标准发布。2026年3月,规范回归候选推荐阶段, 以便工作组能更高效地对实质性更改进行迭代,并持续添加新功能。
在发布时,设备与传感器工作组仍按照 2020年9月15日版 W3C 专利政策运行。
本文档由设备与传感器工作组与 Web 应用工作组以 推荐标准流程 的候选推荐快照形式发布。
作为候选推荐发布,并不代表 W3C 及其成员的认可。候选推荐快照已 经过广泛审查 ,旨在汇集 实现经验, 并获得工作组成员就实现 免版税许可 的承诺。
本候选推荐预计不会早于2026年4月31日进展为推荐。
本文档由 按照W3C 专利政策运作的工作组制定。 W3C 维护一份 有关任何专利披露的公开列表(设备与传感器工作组) 以及 有关任何专利披露的公开列表(Web 应用工作组) ,与各组的交付物相关;这些页面也包含 专利披露的说明。若个人实际得知专利且认为该专利包含 必要声明 ,必须按照 W3C 专利政策第6节披露相关信息。
本文档受 2025年8月18日 W3C 流程文件 管辖。
本节为非规范性内容。
Geolocation 定义了一个高级接口,用于访问仅与承载该实现的设备相关联的位置信息。 常见的位置来源包括全球定位系统 (GPS) 以及从网络信号(例如 IP 地址、RFID、WiFi 和 Bluetooth MAC 地址、GSM/CDMA 小区 ID)推断的位置信息,或用户输入。该 API 本身对底层位置来源保持中立,并且不保证该 API 返回的是设备的实际位置。
如果终端用户 授予权限, Geolocation:
GeolocationPosition
接口提供以纬度、经度、海拔、速度和航向表示的位置数据,以及获取到的位置数据的精度和获取位置的大致时间。
getCurrentPosition()
方法进行“一次性”位置更新请求,并支持通过 watchPosition()
方法在承载设备的位置发生显著变化时接收更新。
PositionOptions 的 maximumAge,
允许应用请求一个其年龄不超过指定值的缓存位置(仅缓存最后一个位置)。
GeolocationPositionError
的形式接收错误更新,帮助您弄清可能出现的问题。
enableHighAccuracy,支持请求“高精度”位置数据,但该请求可能会被用户代理忽略。
本节为非规范性内容。
本规范仅限于提供用于检索与承载设备相关联的地理位置信息的脚本 API。地理位置信息以世界大地测量系统坐标 [WGS84] 表示。它不包括提供任何形式的标记语言,也不包括为构建识别地理位置的 URL 定义新的 URL 方案。
本节为非规范性内容。
该 API 旨在同时支持“一次性”位置请求和重复的位置更新。以下示例说明了常见用例。
本节为非规范性内容。
请求用户的当前位置。如果用户允许,您将收到一个位置对象。
本节为非规范性内容。
请求监视用户的当前位置。如果用户允许,您将连续收到用户位置的更新。
本节为非规范性内容。
通过调用 clearWatch() 方法停止监视位置变化。
本节为非规范性内容。
当发生错误时,watchPosition() 或
getCurrentPosition()
方法的第二个参数将以 GeolocationPositionError
错误的形式被调用,这有助于您判断可能出了什么问题。
本节为非规范性内容。
默认情况下,只要用户代理具有先前获取的位置,API 总是尝试返回缓存的位置。在本例中,我们接受年龄不超过 10 分钟的位置。如果用户代理没有足够新的缓存位置对象,它会自动获取一个新位置。
本节为非规范性内容。
如果您需要在时间敏感的情况下获取位置信息,可以使用 PositionOptions 的 timeout 成员来限制您愿意等待获取位置的时间。
本节为非规范性内容。
默认允许列表(default allowlist)中的
'self'
允许同源嵌套框架中使用该 API,但阻止第三方内容使用该 API。
可以通过在
allow="geolocation"
属性添加到
iframe
元素来有选择地启用第三方使用:
或者,可以通过指定 HTTP 响应头在第一方上下文中禁用该 API:
有关 Permissions-Policy HTTP 头的更多详细信息,请参阅 Permissions Policy。
本节为非规范性内容。
本规范中定义的 API 用于检索承载设备的地理位置。在几乎所有情况下,该信息也会透露设备用户的位置,从而可能危及用户的隐私。
本节为非规范性内容。
Geolocation 是一项需要在将任何位置信息与 Web 应用共享之前从终端用户获得明确许可的强大功能。此要求通过 检查权限
步骤在规范上得到强制执行,getCurrentPosition()
和
watchPosition() 方法依赖这些步骤。
终端用户通常会通过用户界面给予明确许可,该界面通常会呈现一系列权限时长供终端用户选择。权限时长在不同用户代理之间有所不同,但通常基于时间(例如“24 小时”)、或直到浏览器关闭,或用户甚至可以选择永久授予该权限。权限的时长决定了用户代理在该权限自动恢复为默认权限状态之前授予该权限的时长,在后续使用时会提示终端用户做出新的选择。
虽然权限时长的粒度因用户代理而异,但本规范敦促用户代理默认将时长限制为单次浏览会话(参见 3.4 检查使用该 API 的权限 中的规范性要求)。
本节为非规范性内容。
本节适用于“接收者”,通常指使用 Geolocation 的开发者。尽管用户代理或本规范无法强制执行这些要求,但开发者需认真阅读本节并尽最大努力遵守以下建议。开发者需要意识到其司法管辖区内可能存在适用于用户位置信息使用和访问的隐私法律。
接收者应仅在必要时请求位置信息,并且仅将位置信息用于提供给他们时所指定的任务。完成该任务后,接收者应当丢弃位置信息,除非用户明确允许保留。接收者还需要采取措施保护这些信息,防止未经授权的访问。如果存储了位置信息,应允许用户更新和删除这些信息。
位置信息的接收者在未经用户明确许可的情况下,应避免转发位置信息。转发时应谨慎,建议使用加密。
接收者应明确且显著地披露他们正在收集位置信息、收集目的、数据保留时长、数据如何被保护、如有共享则如何共享、用户如何访问、更新和删除数据以及用户对数据的其他选择。本披露应包括对上述指南的任何例外情况的说明。
本节为非规范性内容。
建议实现者考虑以下可能对用户隐私产生负面影响的方面:在某些情况下,用户可能会无意中授予用户代理向网站披露其位置的权限。在其他情况下,托管在某个 URL 的内容发生变化,以至于之前授予的位置权限在用户看来不再适用。或者用户可能会改变主意。
预测或阻止这些情况本质上很困难。缓解和深入的防御措施是实现者的责任,而非本规范所规定。然而,在设计这些措施时,建议实现者提高用户对位置共享的意识,并提供用户界面以便撤销权限。
Geolocation 是由 默认强大功能 标识的功能,其名称(name)为
"geolocation"。
当 检查权限 以使用该 API 时,用户代理 MAY 建议基于时间的权限 时长,例如“24 小时”、“1 周”,或选择记住该权限的永久授予。然而,强烈建议用户代理优先将权限的权限 时长限制为单次会话:例如,在 realm 被销毁、终端用户从该 origin 导航离开,或相关浏览器标签被关闭之前。
在本规范发布时,与 Geolocation 相关没有任何安全性考虑。不过,建议读者阅读 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]] |
A GeolocationPosition,
initialized to null. It's a reference
to the last acquired position and serves as a cache. A user agent
MAY evict [[cachedPosition]] by resetting
it to
null at any time for any reason.
|
| [[watchIDs]] |
Initialized as an empty list
of unsigned long
items.
|
The getCurrentPosition(successCallback,
errorCallback, options)
方法步骤如下:
Document is not fully active:
POSITION_UNAVAILABLE。
The watchPosition(successCallback,
errorCallback, options)
方法步骤如下:
Document is not fully active:
POSITION_UNAVAILABLE。
unsigned long,且其值大于零。
[[watchIDs]]。
When clearWatch() is invoked, the user agent MUST:
[[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 大于 0:
maximumAge
成员的值。
timestamp
的值大于
cacheTime,且
cachedPosition 的 [[isHighAccuracy]]
等于 options.enableHighAccuracy:
report"。
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;
};
The enableHighAccuracy 成员提供了一个提示,
表示应用希望接收尽可能精确的位置数据。
该成员的预期用途是允许应用告知实现它们不需要高精度的地理定位结果,因此实现 可以 避免使用
消耗大量电力的定位提供者(例如 GPS)。
The timeout 成员表示以毫秒为单位的最长等待时间,
在该时间之后 获取位置 操作便会过期。
等待文档变为可见以及 获取使用该
API 的权限 所花费的时间
不包括在 timeout
成员所覆盖的期间内。timeout 成员仅在
开始获取位置 时生效。
The maximumAge 成员指示 Web 应用愿意接受一个其年龄不大于
指定毫秒数的缓存位置。
WebIDL[Exposed=Window, SecureContext]
interface GeolocationPosition {
readonly attribute GeolocationCoordinates coords;
readonly attribute EpochTimeStamp timestamp;
[Default] object toJSON();
};
The coords 属性包含地理坐标。
The timestamp 属性表示获取设备地理位置的时间。
The toJSON() 方法返回 GeolocationPosition
对象的 JSON 表示。
GeolocationPosition 的实例
使用下表所示的内部槽创建:
| Internal slot | Description |
|---|---|
| [[isHighAccuracy]] |
A boolean,记录在创建该
GeolocationPosition 时
enableHighAccuracy
成员的值。
|
下列 task source 由本规范定义。
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();
};
The latitude 和 longitude 属性表示位置,单位为度的实数,使用 [WGS84] 坐标系。
The accuracy 属性表示位置精度半径,单位为米。
The altitude 属性表示位置的高度,
以相对于 [WGS84] 椭球体的米为单位。
The altitudeAccuracy 属性表示以米为单位的海拔精度(例如 10 米)。
The heading 属性表示承载设备的行驶方向,以度为单位指定,且满足 0° ≤ heading <
360°,按顺时针方向相对于真北计。
The speed 属性表示承载设备当前速度的水平分量的大小,单位为米每秒。
The toJSON() 方法返回 GeolocationCoordinates 对象的 JSON 表示。
一个新的
GeolocationPosition 使用 map
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'。
为了用户代理自动化和应用测试的目的,本文档定义了地理位置仿真(geolocation emulations)。
每个 顶级可遍历体 都有一个关联的 模拟位置数据,
该数据表示 GeolocationCoordinates、
GeolocationPositionError 或 null,初始为
null。
要 设置模拟位置数据,给定 可导航对象 navigable 和一个 emulatedPositionData:
GeolocationCoordinates,或为 GeolocationPositionError。
要 获取模拟位置数据,给定 Geolocation
geolocation:
Document 的 节点可导航对象。
除被标注为非规范性的章节之外,本规范中的所有创作指南、图表、示例和注释均为非规范性。规范中的其他所有内容均为规范性。
本文档中关键字 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.1
altitude
用于 GeolocationCoordinates 的属性
§9.2
altitudeAccuracy 用于
GeolocationCoordinates 的属性
§9.2
[[cachedPosition]] 用于
Geolocation 的内部槽
§6.1
clearWatch() 用于
Geolocation 的方法
§6.4
code 用于
GeolocationPositionError 的属性
§10.2
coords 用于
GeolocationPosition 的属性
§8.1
enableHighAccuracy 用于
PositionOptions 的成员
§7.1
geolocation 用于
Navigator 的属性
§5.1
Geolocation 接口
§6.
"geolocation"
§3.4
GeolocationCoordinates
接口
§9.
GeolocationPosition 接口
§8.
GeolocationPositionError
接口
§10.
getCurrentPosition
用于 Geolocation 的方法
§6.2
heading 用于
GeolocationCoordinates 的属性
§9.3
[[isHighAccuracy]] 用于
GeolocationPosition 的内部槽
§8.4
latitude 用于
GeolocationCoordinates 的属性
§9.1
longitude 用于
GeolocationCoordinates 的属性
§9.1
maximumAge 用于
PositionOptions 的成员
§7.3
message 用于
GeolocationPositionError 的属性
§10.3
PERMISSION_DENIED
§10.1
POSITION_UNAVAILABLE
§10.1
PositionCallback
§6.
PositionErrorCallback
§6.
PositionOptions 字典
§7.
speed 用于
GeolocationCoordinates 的属性
§9.4
timeout 用于
PositionOptions 的成员
§7.2
TIMEOUT
§10.1
timestamp 用于
GeolocationPosition 的属性
§8.2
[[watchIDs]] 用于
Geolocation 的内部槽
§6.1
watchPosition 用于
Geolocation 的方法
§6.3
EpochTimeStamp
allow 属性(用于 iframe 元素)
Document)
iframe
元素
Document)
list(Append)
list)
map
的每一项(For each)
list)
list
中移除(Remove)
permission)
permission)
name(用于 PermissionDescriptor)
PermissionDescriptor
boolean
类型
[Clamp] 扩展属性
[Default] 扩展属性
DOMString 接口
double
类型
[Exposed] 扩展属性
long
类型
object
类型
[SameObject] 扩展属性
[SecureContext] 扩展属性
undefined 类型
unsigned long 类型
unsigned short 类型
本节为非规范性内容。
本规范建立在行业内早期工作的基础之上,包括 Aza Raskin 的研究、Google Gears 地理定位 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, and Mohamed Zergaoui。
本节为非规范性内容。
Since publication as a W3C Recommendation in 2022, Geolocation has received the following normative changes:
Since First Public Working Draft in 2021, until it was published as a W3C Recommendation in 2022, Geolocation received the following normative changes:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Since publication of the Second Edition in 2016, this specification received the following substantive changes:
errorCallback is now nullable.
callbacks are no longer treated as "EventHandler" objects
(i.e., objects that have a .handleEvent() method), but are now
exclusively treated as IDL callback functions.
[NoInterfaceObject], so Geolocation and other interface of this
spec are now in the global scope. Also, the interfaces were renamed
from NavigatorGeolocation* to just Geolocation*.
See the commit history for a complete list of changes.