JavaScript检测国家代码切换货币时页面反复刷新问题求助
问题根因
你的代码触发了无限刷新死循环:表单提交后页面刷新,JS会重新加载执行,再次请求IP接口、修改下拉值触发提交,往复循环。return 仅能终止当前单次函数的执行,无法阻止页面刷新后逻辑重新运行,所以无法解决问题。另外你的代码中AR、CA两个国家分支仅给下拉框赋值,没有触发change事件,不会提交表单更新货币,属于功能缺失bug。
修复方案
- 用sessionStorage做状态标记,货币设置完成后写入标记,页面重新加载时先判断标记存在就跳过IP检测逻辑,避免循环提交
- 统一所有国家分支的处理逻辑,赋值后判断当前值和目标值是否一致,不一致再触发change事件,避免无效提交
- 简化多分支判断逻辑,提升可维护性
修复后代码
// 页面加载先判断是否已经设置过货币,已经设置过就跳过IP检测逻辑 if (!sessionStorage.getItem('currency_has_set')) { $.ajax({ url: "https://ipinfo.io/json", type: "GET", success: function(location) { const $currencySelect = $(".shopify-currency-form select"); let targetCurrency = ''; switch(location.country) { case 'AU': targetCurrency = 'AUD'; break; case 'AR': targetCurrency = 'ARS'; break; case 'CA': targetCurrency = 'CAD'; break; case 'US': targetCurrency = 'USD'; break; // 其他国家默认逻辑可在此补充 default: return; } // 只有当前值和目标值不一致的时候才修改并提交 if ($currencySelect.val() !== targetCurrency) { $currencySelect.val(targetCurrency).change(); // 标记已经设置过货币,刷新后不再执行 sessionStorage.setItem('currency_has_set', '1'); } } }); } $('.shopify-currency-form select').on('change', function() { $(this).parents('form').submit(); });
如果需要用户手动修改货币后下次打开还生效,可将sessionStorage替换为localStorage,同时补充用户手动切换货币时更新存储值的逻辑即可。
内容的提问来源于stack exchange,提问作者user1924165
相关产品推荐
相关产品推荐

