Edge与IE浏览器中JS修改a标签href属性不生效问题求助
解决Edge和IE中a标签onclick修改href不生效的问题
这个问题我太熟悉了——Edge(尤其是旧版EdgeHTML内核的)和IE在处理a标签的点击事件时,默认的跳转动作会优先于你的JavaScript代码执行,导致你在onclick里修改href的操作还没完成,页面已经开始跳转到初始的URL了。咱们来一步步解决它:
问题根源
现代浏览器会先执行onclick里的代码,再触发默认跳转;但IE/旧Edge是先读取a标签的href准备跳转,再执行onclick,这就导致你的修改赶不上趟。
解决方案1:阻止默认行为,手动控制跳转
修改你的HTML和JS,让onclick先阻止默认跳转,修改完href后再手动打开目标链接:
修改后的HTML
<li><a id="fa1" href="https://www.google.com" onclick="return openlink()" target="_blank">{!$Label.FooterContactsTab}</a></li>
修改后的JavaScript
function openlink() { // 兼容IE的语言获取(IE用navigator.userLanguage) var ulang = navigator.language || navigator.userLanguage; var targetHref = "https://www.google.com"; // 默认链接 // 根据语言匹配目标URL(记得加https://,不然会当成相对路径) if (ulang.indexOf("es") > -1) { targetHref = "https://www.youtube.com"; } else if (ulang.indexOf("en") > -1) { targetHref = "https://www.gmail.com"; } else if (ulang.indexOf("zh") > -1) { targetHref = "https://www.w3schools.com"; } else if (ulang.indexOf("ja") > -1) { targetHref = "https://www.salesforce.com"; } // 更新href document.getElementById("fa1").href = targetHref; // 阻止默认跳转行为(兼容IE和现代浏览器) if (window.event) { window.event.returnValue = false; } // 手动打开新窗口,对应target="_blank" window.open(targetHref, "_blank"); return false; }
解决方案2:页面加载时提前修改href(更推荐)
既然我们是根据浏览器语言来设置链接,完全可以在页面加载完成后就直接修改href,不用等到点击时再处理——这样从根源上避免了事件执行顺序的问题:
HTML(去掉onclick)
<li><a id="fa1" href="https://www.google.com" target="_blank">{!$Label.FooterContactsTab}</a></li>
JavaScript(页面加载时执行)
window.onload = function() { var ulang = navigator.language || navigator.userLanguage; var link = document.getElementById("fa1"); var targetHref = "https://www.google.com"; if (ulang.indexOf("es") > -1) { targetHref = "https://www.youtube.com"; } else if (ulang.indexOf("en") > -1) { targetHref = "https://www.gmail.com"; } else if (ulang.indexOf("zh") > -1) { targetHref = "https://www.w3schools.com"; } else if (ulang.indexOf("ja") > -1) { targetHref = "https://www.salesforce.com"; } link.href = targetHref; };
额外注意点
- 一定要给URL加上
https://协议,不然浏览器会把它当成当前页面的相对路径,导致跳转错误。 - IE获取浏览器语言用
navigator.userLanguage,现代浏览器用navigator.language,所以代码里要做兼容。
内容的提问来源于stack exchange,提问作者AJoshi
相关产品推荐
相关产品推荐

