2011-05-06 46 views
0

我正在编写一个网页(在PHP中,虽然这个问题不涉及PHP本身),它存储URL并允许您将标签应用于它们,因此可以搜索URL通过标签。动态设置链接的目标什么都不做

我试图添加容量来设置一个复选框,以定义URL是否会在新选项卡中打开,或默认情况下在一堆JavaScript和Cookie中打开相同的选项卡。该复选框在页面加载之间正确保持其状态,但没有任何链接被赋予target =“_ blank”。

我已经给出了所有URL“出站”类,并且使用稍微未记录的document.getElementsByClassName()函数来获取与此类的所有链接,并且我已验证此部分是可用的,因为它正在返回一个链接数组,其大小与页面上的URL数量相同。

下面是我在做什么的例子:

function onload() { 
    newtab = readCookie("newtab"); 
    if (newtab == null) { 
     createCookie("newtab", "true"); 
     newtab = "true"; 
    } 
    newtab = (newtab == "true"); 
    updateLinks(newtab); 
} 
function updateLinks(newtab) { 
    if (newtab) 
     target="_blank"; 
    else 
     target=""; 
    for (link in document.getElementsByClassName("outbound")) { 
     link.target = target; 
    } 
} 
function checkboxToggled(checkbox) { 
    updateLinks(checkbox.checked); 
} 

我验证过“目标”在updateLinks()是正确设置它遍历所有环节之前。有人有什么可能失败的建议吗?

我已经在谷歌Chrome浏览器(我的主浏览器)和Firefox上测试过这个功能,但它也没有正常工作。 (奇怪的是,Firefox给了我一个“太多的递归”错误)

回答

1

您的in for循环中的链接不会引用该对象,它只是一个递增值。

for (link in document.getElementsByClassName("outbound")) { 
     document.getElementsByClassName("outbound")[link].target = target; 
    } 
+0

你根本不想使用'for..in' 。而且你真的不想在每次循环迭代中重复搜索。 – 2011-05-06 08:54:13

+0

同意,但它解决了他一直在挣扎的东西。 – 2011-05-06 09:08:19

2

有几个问题,并非最不重要的是你实际上没有在元素上设置target(你将它设置为临时字符串;下面的细节)。通过对象的所有枚举的属性

for (link in document.getElementsByClassName("outbound")) { 

for..in循环:

我强烈反对在NodeList使用for..in,这是你在这里做什么。 (和link将财产,而不是财产不分。)我走它明确:

var index, list; 
list = document.getElementsByClassName("outbound"); 
for (index = 0; index < list.length; ++index) { 
    link = list[index]; 
    // ... 
} 

还要注意的是getElementsByClassName不支持所有浏览器。

+0

Arg,信任JavaScript与其他语言不同。哦,还有什么不喜欢在列表中使用for..in? – Raceimaztion 2011-05-06 09:04:00

+0

@Raceimaztion:'for..in'在JavaScript中工作的方式非常强大和方便。 (一个单独的'foreach'会很好,但是没有发生;但是在ECMAScript5中有新的'Array#forEach'函数。)不要在'NodeList'上使用它:我不会信任所有主机对象所有环境都将它们的非数字道具实现为不可枚举的,也没有正确支持道具名称枚举('for..in'的作用)。一般来说,对于类似数组的对象,如果**你知道自己在做什么并采取正确的预防措施,那很好**:http://blog.niftysnippets.org/2010/11/myths-and-realities-of- forin.html – 2011-05-06 09:20:33

+0

回复@安德鲁的评论如下,他用调试器遍历事物的价值是非常正确的。不再有任何理由不用客户端JavaScript做到这一点:http://blog.niftysnippets.org/2011/03/no-excuse.html – 2011-05-06 09:22:10