【问题标题】:How can I set or append different base hrefs to different links with JavaScript?如何使用 JavaScript 将不同的基本 href 设置或附加到不同的链接?
【发布时间】:2024-01-03 13:32:01
【问题描述】:

我想通过为超链接设置多个基本 href 来减少网页代码中的混乱。具有相同基本 href 的链接也具有相同的 CSS 类。使用 JavaScript,有没有办法将基本 href 附加到相对链接?这很难解释,但这里有一个例子:

<a class="blue" href="sad1.html">Sad 1</a>
<a class="blue" href="sad2.html">Sad 2</a>
<a class="red" href="angry1.html">Angry 1</a>
<a class="red" href="angry2.html">Angry 2</a>

我想为所有带有蓝色类的链接附加一个基本href,并为所有带有红色类的链接附加一个不同的基本href。我实际上将在文档中添加几个类,但如果有人可以提供工作示例,我可以完成代码。我的页面有数百个链接,我经常更新,所以我需要尽可能修剪 html。我精通 HTML 和 CSS,但我仍在努力学习 JavaScript。谢谢。

【问题讨论】:

  • 您知道并习惯使用 jQuery 吗?尽可能避免使用 jQuery 很好,但是使用 jQuery 来执行此操作的代码将是最简洁的。
  • @JamieButler “我对 HTML 和 CSS 很熟悉,但我仍在努力学习 JavaScript”我很确定 jQuery 不是一个选项 ;)

标签: javascript href


【解决方案1】:

function absolutizeHref(klass, base) {
  var nodes = document.querySelectorAll("." + klass + "[href]");
  Array.prototype.forEach.call(nodes, function(node) {
    var href = node.getAttribute("href");
    node.setAttribute("href", base + href);
  });
}


document.addEventListener("DOMContentLoaded", function(event) {
  absolutizeHref("blue", "http://example.com/blue/");
  absolutizeHref("red", "http://example.com/red/");
});
<a class="blue" href="sad1.html">Sad 1</a>
<a class="blue" href="sad2.html">Sad 2</a>
<a class="red" href="angry1.html">Angry 1</a>
<a class="red" href="angry2.html">Angry 2</a>

【讨论】:

  • 谢谢。这进入了一些我不理解的脚本,但它工作得很好。
  • 请注意,如果您依赖DOMContentLoaded,则它不会在某些较旧的浏览器(尤其是 IE8)上运行。最简单的方法是删除事件侦听器 sutff,只需将 absolutizeHere(...) 脚本添加到文档的 end (这样您要更改的每个锚点都已加载)。第二个最简单的方法是依赖像 jQuery 这样提供ready 方法的库。第三个最简单的方法,使用onload(但速度较慢,因为它等待图像和所有内容加载)。最难的选择实际上是重新发明热水,以向后兼容的方式正确实施。
【解决方案2】:

只是给你一个想法。像这样的:

var links = document.querySelectorAll('a');

for(var i = 0; i < links.length; i++) {
  links[i].href = links[i].className + links[i].pathname;
}
<a class="blue" href="sad1.html">Sad 1</a>
<a class="blue" href="sad2.html">Sad 2</a>
<a class="red" href="angry1.html">Angry 1</a>
<a class="red" href="angry2.html">Angry 2</a>

更新重读问题后,第一次没怎么注意到这行..

我想将一个基本 href 附加到所有带有蓝色类的链接,并且 为所有带有红色类的链接使用不同的基本 href。

要坚持这个想法,它仍然很简单

var links = {};

links.blue = document.querySelectorAll('a.blue');
links.blue.myPath = '/custom/blue/path';

links.red = document.querySelectorAll('a.red');
links.red.myPath = '/custom/red/path';

for (var key in links) {
  for(var i = 0; i < links[key].length; i++) {
    links[key][i].href = links[key].myPath + links[key][i].pathname;
  }
}
<a class="blue" href="sad1.html">Sad 1</a>
<a class="blue" href="sad2.html">Sad 2</a>
<a class="red" href="angry1.html">Angry 1</a>
<a class="red" href="angry2.html">Angry 2</a>

【讨论】:

  • 这会将基本 href 放入链接中,但它仍在插入相对链接的完整路径。例如,下面是这段代码的结果:file:///custom/blue/path/C:/Users/***/Desktop/sad1.html(我需要删除 C:/Users/***/桌面/它从相对链接中提取的部分)。
  • @selah 你可以试试links[key][i].href = '//' + links[key].myPath + links[key][i].pathname; 但我不认为这真的是你想要的。您应该使用绝对路径。如果您在某个阶段部署到服务器,则不会有C:/Users/***/Desktop/,所以不要为此烦恼。但是会有一条绝对路径。可以下载 XAMPP 或其他东西,以便您可以使用 localhost127.0.0.1 作为计算机上的绝对路径,不确定 Windows 的所有机会。但如果你用谷歌搜索它,你会找到一百万个结果。
【解决方案3】:

这里的另一个答案为此提供了 core-js 解决方案。

如果您乐于使用 jQuery,jQuery 将为您提供最简洁的解决方案。

如果您不熟悉 jQuery,但愿意使用它,可以在 here 找到快速入门指南

这是一个在 jQuery 中解决此问题的示例。该解决方案的优雅之处在于,您只需将键值对添加到 classToPrefixMap 即可对其进行扩展:

var classToPrefixMap = {
    green: '/path/to/green/',
    blue: '/path/to/blue/'
};

for(var key in classToPrefixMap) {
    $('.' + key).each(function(index, anchor) {
	$(anchor).attr('href', classToPrefixMap[key] + $(anchor).attr('href'));
    })
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a class="green" href="one.jpg">One</a>
<a class="green" href="two.jpg">Two</a>
<a class="blue" href="three.jpg">Three</a>
<a class="blue" href="four.jpg">Four</a>

【讨论】:

    最近更新 更多