function getLocation() {
if (navigator.geolocation) {
// 浏览器支持,可以尝试获取位置
navigator.geolocation.getCurrentPosition(showPosition, showError);
} else {
// 浏览器太老,不支持
alert("很抱歉,您的浏览器不支持地理定位功能。请考虑升级浏览器。");
}
}
navigator.geolocation:这是浏览器提供的对象,有它就说明支持定位功能。
getCurrentPosition(successCallback, errorCallback, options):这是核心方法,用于请求当前位置。
successCallback:获取位置成功时调用的函数,会传入一个包含位置信息的对象。
errorCallback:获取位置失败时调用的函数,会传入一个错误对象。
options (可选):可以设置一些参数,比如超时时间、要求高精度等(本文示例未使用)。
function showPosition(position) {
console.log("完整位置信息:", position); // 可以在开发者工具控制台查看所有信息
// 从位置对象中提取纬度和经度
var latitude = position.coords.latitude; // 纬度
var longitude = position.coords.longitude; // 经度
console.log('纬度: ' + latitude + ', 经度: ' + longitude);
// 通常,我们会在这里做点事情,比如显示在地图上,或者调用下一步的地址转换
// 例如: convertToAddress(latitude, longitude);
}
position.coords.latitude:用户位置的纬度。
position.coords.longitude:用户位置的经度。
position.coords 对象还可能有其他信息,比如精度(accuracy)、海拔(altitude)等,但纬度和经度是最基本也最可靠的。
function showError(error) {
console.warn("定位错误 (CODE: " + error.code + "):", error.message);
switch(error.code) {
case error.PERMISSION_DENIED:
alert("定位失败:您拒绝了位置共享请求。请检查浏览器设置或页面权限。");
break;
case error.POSITION_UNAVAILABLE:
alert("定位失败:暂时无法获取您的位置信息。可能是网络问题或定位服务(如手机GPS)未开启。");
break;
case error.TIMEOUT:
alert("定位失败:获取位置信息超时。请确保网络畅通并重试。");
break;
case error.UNKNOWN_ERROR:
alert("定位失败:发生未知错误。请稍后再试。");
break;
}
}
error.code:错误代码,告诉我们具体是什么原因失败。
error.message:更详细的错误描述(主要用于开发调试)。
通过 switch 语句,我们可以根据不同的错误代码,给用户更友好、更明确的提示。
重要提示:
必须申请API Key: 使用百度或谷歌的地图API都需要注册开发者账号并申请一个专属的Key(通常叫AK或API Key),替换下面代码中的 YOUR_BAIDU_API_KEY 和 YOUR_GOOGLE_API_KEY。没有有效的Key,API调用会失败。
加载jquery: 下面的示例使用了jQuery的 $.ajax 方法发起网络请求,所以你的页面需要先引入jQuery库(例如:<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>)。
HTTPS限制: 谷歌地图API强烈要求使用HTTPS。百度API在HTTPS下也更安全可靠。
function convertToAddressWithBaidu(lat, lng) {
// 拼接经纬度字符串
var latlon = lat + ',' + lng;
// 构建请求百度API的URL (替换 YOUR_BAIDU_API_KEY 为你的真实Key)
var baiduUrl = "https://api.map.baidu.com/reverse_geocoding/v3/?ak=YOUR_BAIDU_API_KEY&output=json&coordtype=wgs84ll&location=" + latlon;
// 发起请求
$.ajax({
type: "GET",
dataType: "jsonp", // 百度API通常使用JSONP跨域
url: baiduUrl,
success: function(data) {
console.log("百度API返回:", data);
if (data.status === 0) { // 百度API状态码0表示成功
var formattedAddress = data.result.formatted_address; // 结构化地址
console.log('百度解析地址:', formattedAddress);
// 显示在页面上某个元素里,例如 id="address-result"
$("#address-result").text(formattedAddress);
} else {
console.error('百度API错误:', data.message);
$("#address-result").text("地址解析失败: " + data.message);
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.error("百度API请求失败:", textStatus, errorThrown);
$("#address-result").text("请求地址服务失败,请检查网络或Key。");
}
});
}
coordtype=wgs84ll:指定传入的经纬度是标准的WGS84坐标(GPS使用的标准)。
data.result.formatted_address:百度API返回的结构化地址字符串。
function convertToAddressWithGoogle(lat, lng) {
// 拼接经纬度字符串
var latlon = lat + ',' + lng;
// 构建请求谷歌Geocoding API的URL (替换 YOUR_GOOGLE_API_KEY 为你的真实Key)
var googleUrl = "https://maps.googleapis.com/maps/api/geocode/json?latlng=" + latlon + "&language=zh-CN&key=YOUR_GOOGLE_API_KEY";
// 发起请求
$.ajax({
type: "GET",
dataType: "json", // 谷歌API支持CORS,可以用json
url: googleUrl,
success: function(data) {
console.log("谷歌API返回:", data);
if (data.status === "OK") { // 谷歌API状态"OK"表示成功
// 通常第一个结果是最精确的地址
var formattedAddress = data.results[0].formatted_address;
console.log('谷歌解析地址:', formattedAddress);
// 显示在页面上某个元素里,例如 id="address-result"
$("#address-result").text(formattedAddress);
} else {
console.error('谷歌API错误:', data.status, data.error_message);
$("#address-result").text("地址解析失败: " + (data.error_message || data.status));
}
},
error: function(jqXHR, textStatus, errorThrown) {
console.error("谷歌API请求失败:", textStatus, errorThrown);
$("#address-result").text("请求地址服务失败,请检查网络或Key。");
}
});
}
language=zh-CN:指定返回结果的语种为简体中文。
data.results[0].formatted_address:谷歌API返回的第一个(通常也是最相关的)地址的格式化字符串。
function showPosition(position) {
var lat = position.coords.latitude;
var lng = position.coords.longitude;
console.log('纬度: ' + lat + ', 经度: ' + lng);
// 选择使用百度或者谷歌的转换函数
convertToAddressWithBaidu(lat, lng); // 或者 convertToAddressWithGoogle(lat, lng)
}
用户授权是核心: 必须清晰地向用户说明为什么需要位置信息,并在用户拒绝时优雅处理。
HTTPS是标配: 线上环境务必使用HTTPS,否则定位功能和某些地图API可能无法正常工作。
申请API Key: 使用百度或谷歌地图服务进行地址转换是免费的(通常有配额限制),但必须注册并获取你自己的API Key,不要使用示例中的占位符。
选择合适的API: 百度地图更适合国内用户,谷歌地图全球覆盖更广。根据你的用户群体选择。
处理错误和超时: 网络请求和API调用都可能出错,做好错误处理和用户提示。
隐私政策: 如果你的网站或应用收集用户位置信息,请务必制定并遵守相关的隐私政策。
调用时机: 可以在页面加载时自动调用 getLocation()(注意用户可能反感),或者在用户点击一个按钮(如“查找附近”、“获取我的位置”)时触发,后者体验更好。
动手试试吧!
把上面的代码片段组合起来,替换掉 YOUR_BAIDU_API_KEY 或 YOUR_GOOGLE_API_KEY 为你自己申请的Key,放到一个HTML文件中,通过HTTPS服务器(或本地localhost)打开,就能看到效果了。理解每一步的原理,你就能在自己的项目中灵活运用HTML5的地理定位功能了。
我们经常碰到的需求是希望页面某个元素固定在浏览器的一个位置,无论如何滚动滚动条,位置不变,就例如经常看到的弹出广告。方法一般是使用js控制,或者使用css。这里我写的是css的控制方法。在IE7以上版本及firefox、opera、safari里
html + bootstrap布局画3个面板。监听面板的的 mousedown事件。记录当前对应面板的位置target_index,设置面板透明拖动。监听当前被拖动的面板的mousemove事件。
JS 有3种书写位置,分别为行内、内嵌和外部。可以将单行或少量 JS 代码写在HTML标签的事件属性中(以 on 开头的属性),如:onclick,注意单双引号的使用:在HTML中我们推荐使用双引号, JS 中我们推荐使用单引号
在前端项目开发中,页面的滚动条是经常出现的,那么js如何获取滚动条位置呢?pageXOffset 和 pageYOffset 属性返回文档在窗口左上角水平和垂直方向滚动的像素。
当内部内容大于外部元素高度时,写入overflow:auto,就会产生滚动条,在所溢出去的就是滚动条;获取元素范围矩形 其中包括距离视口的距离,已经元素的宽高,还有left,top,bottom,right
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!