You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript下拉选距离筛选附近地点的功能故障排查求助

问题修复建议

1. 下拉菜单变更时重新触发筛选

当前代码仅在首次获取地理位置时执行一次距离筛选,下拉菜单切换后不会重新计算。需要给下拉菜单添加事件监听,每次选择新距离时重新执行筛选逻辑:

// 页面加载完成后绑定下拉菜单事件
document.addEventListener('DOMContentLoaded', function() {
  const distanceSelect = document.getElementById('distance');
  distanceSelect.addEventListener('change', function() {
    if (window.userPosition) {
      filterLocationsByDistance(window.userPosition);
    }
  });
});

// 将筛选逻辑抽为独立函数
function filterLocationsByDistance(position) {
  const select = document.getElementById("distance");
  const maxDistance = parseFloat(select.value); // 转成数字避免字符串比较错误

  const latitudes = [45.830527, 45.879442, 46.017065, 46.045482];
  const longitudes = [9.029344, 8.979577, 8.931969, 8.978964];
  
  for (let i = 0; i < latitudes.length; i++) {
    const latLocation = latitudes[i];
    const lonLocation = longitudes[i];
    const latUser = position.coords.latitude;
    const lonUser = position.coords.longitude;
    
    // 计算距离(保留原有逻辑)
    const R = 6371;
    const dLat = deg2rad(latLocation - latUser);
    const dLon = deg2rad(lonLocation - lonUser);
    const a = Math.sin(dLat / 2)**2 + Math.cos(deg2rad(latUser)) * Math.cos(deg2rad(latLocation)) * Math.sin(dLon / 2)**2;
    const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    const distance = R * c;

    const locationEl = document.getElementById(i);
    locationEl.setAttribute("data-index", distance);
    
    // 数字比较,展示/隐藏符合条件的地点
    locationEl.style.display = distance <= maxDistance ? "block" : "none";
  }
}

// 修改初始定位函数,保存位置并调用筛选
function mia_posizione(position) {
  window.userPosition = position;
  filterLocationsByDistance(position);
}

2. 修复字符串比较逻辑错误

dataset.index和下拉菜单value默认是字符串类型,直接比较会按字典序(比如"10" < "2"),导致筛选结果完全错误。上面的代码已经通过parseFloat将值转为数字,用数值大小进行比较。

3. 修复HTML重复ID问题

HTML中<li id=1>内部还有<div id=1>,ID必须唯一,否则getElementById会返回第一个匹配元素,导致操作错误。修改内部ID为唯一名称:

<li class="index" data-index="1" id=1>
  <div id="location-div-1"> </div>
  <!-- 其他内容不变 -->
</li>
<li class="index" data-index="3" id=2>
  <h3 id="location-h3-2"> </h3>
  <!-- 其他内容不变 -->
</li>

同时,<ul>内直接放<br>不符合规范,改用CSS控制列表项间距:

#list .index {
  margin-bottom: 1.5rem;
}

然后删除HTML中所有<br>标签。

4. 点击Find按钮时重新筛选并排序

当前SortData仅排序不筛选,修改后先执行筛选再排序:

function SortData() {
  // 先重新应用筛选
  if (window.userPosition) {
    filterLocationsByDistance(window.userPosition);
  }
  // 排序时用数字比较
  const indexes = document.querySelectorAll("[data-index]");
  const indexesArray = Array.from(indexes);
  const sorted = indexesArray.sort((a, b) => {
    const distA = parseFloat(a.dataset.index);
    const distB = parseFloat(b.dataset.index);
    return distA - distB;
  });
  sorted.forEach(el => document.querySelector("#list").appendChild(el));
}

5. 修复aprox函数的区间判断错误

0.1 < x < 1在JS中是无效写法,会先判断0.1 < x得到布尔值,再和1比较,永远为true。修改为:

function aprox(x) {
  if (x > 0.1 && x < 1) { // 正确的区间判断
    const k = x * 10;
    const m = Math.ceil(k);
    const t = m * 100;
    return t + " m";
  } else {
    return Math.ceil(x) + " km";
  }
}

内容的提问来源于stack exchange,提问作者Adry_1909

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:48:23