根据 href 更改 <a> 的 target 为 "_blank"

4

我正在尝试整理页面上的链接,并根据它们的URL使一些链接在新窗口中打开。这是我拥有的代码。但它似乎不起作用。你能看出原因吗?

function MakeMenuLinksOpenInNewWindow() {
    var links = document.getElementsByTagName("a");
    for (var i = 0; i < links.length; i++) {
        if (links[i].href == "http://testtesttest.org/")
            links[i].target = "_blank";
    }
}
MakeMenuLinksOpenInNewWindow();

1
你能展示一些相关的HTML代码吗? - Pekka
你试过使用 links[i].setAttribute('target', '_blank') 而不是 links[i].target = "_blank" 吗?也许那样会起作用。 - Zoidberg
1
不会的。请不要在编写HTML文档脚本时使用getAttribute/setAttribute。它们比普通的DOM Level 1 HTML属性(如href=)难以阅读,并且在IE中存在错误。 - bobince
使用 example.com (org、net 或 edu)作为示例。 - David Murdoch
4个回答

3

您最好不要设置这个 JavaScript。而是使用 HTML。

但如果您必须这样做...

function MakeMenuLinksOpenInNewWindow() {
    var links = document.getElementsByTagName("a");
    for (var i = 0, l = links.length; i < l; i++) {
        if (links[i].href === "http://www.example.com/")
            links[i].target = "_blank";
    }
}
window.onload = MakeMenuLinksOpenInNewWindow;

我把这个代码放到我的 .js 文件中,但好像没有起作用。我还需要做什么吗? - Christian
另外,您可能正在覆盖window.onload事件。 - David Murdoch
function MakeMenuLinksOpenInNewWindow() { var linkies = document.links; for (var i = 0; i < linkies.length; i++) { if (linkies[i].href == "http://byupas.org/") linkies[i].target = "_blank"; } alert("HEY SUCKA"); } window.onload = MakeMenuLinksOpenInNewWindow;这个函数明显没有被调用,因为警告框没有显示出来。 - Christian
使用Firebug,我可以看到onload处理程序正在捕获函数,但DOM检查器说“__onloadStarted”和“onLoadCompleteStarted”是假的,在页面加载后很长一段时间。 - Christian

2
使用jQuery.js。它会让你的生活变得更轻松:
$("a[href='http://testtesttest.org/']").attr("target", "_blank");

13
他的 JavaScript 很好,让他用相应的 jQuery 代替它并不能解决他的问题。 - lincolnk

2

确保在调用此函数时DOM已被加载:

window.onload = MakeMenuLinksOpenInNewWindow;

或者:

<body onload="MakeMenuLinksOpenInNewWindow();">

你的函数无法正常工作的原因是因为DOM(因此a链接)尚未加载,因此你的脚本没有任何操作。Darin的代码所做的就是将你的函数绑定到文档的onload事件的执行上(换句话说,一旦DOM加载完毕并准备好,你的函数就会执行)。如果你将他建议的第一个代码片段添加到你的.js文件中,一切都应该可以正常工作。 - Moses
是的,请尝试我的第一个建议:window.onload = MakeMenuLinksOpenInNewWindow; - Darin Dimitrov
除此之外,这个函数还不错吧?这是我现在在.js文件中的代码:function MakeMenuLinksOpenInNewWindow() { var links = document.getElementsByTagName("a"); for (var i = 0; i < links.length; i++) { if (links[i].href == "http://byupas.org/") links[i].setAttribute('target', '_blank'); } window.onload = MakeMenuLinksOpenInNewWindow(); } - Christian
你可以把 .js 文件作为页面最后一个元素加载,而不是使用 onload。 - David Murdoch
2
@christian:应该是 window.onload = MakeMenuLinksOpenInNewWindow;,而不是 window.onload = MakeMenuLinksOpenInNewWindow(); - David Murdoch
显示剩余6条评论

0

你的 JavaScript 看起来很好。假设你在修改链接元素之前它们不存在,那么你需要像其他帖子中提到的那样延迟运行你的方法。我喜欢的方法是将脚本内容移动到页面末尾。

由于看起来你正在使用外部 JS 文件,你的页面可能会像这样:

    ... 
    <a href="http://testtesttest.org/" >whatever</a>
    ... 
    <script src="myscriptfile.js"></script>
</body>
</html>

如果你仍然遇到问题,你需要发布一个更完整的示例。

编辑:另一个要点。如果你仍然遇到问题,请确保你在 href 属性中期望的 URL 没有被重写。例如,如果你没有提供它,IE 会在 .com URL 的末尾添加一个尾随的 /,这将导致你的比较失败。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接