我正在尝试做的并且主要完成的是更改包含在范围中的锚标签的URL中的tag参数。这工作正常。正在发生的事情是它拉出第一个锚标记href并且正在用相同的href替换所有锚标记。我认为,当它通过循环时,它将每次用新的href替换var。建议?
<div class="changeparam">
<span><a href="http://demo.org/post.php?i=17uh23&p=456&s=789&tag=asdf">Link</a></span>
<span><a href="http://demo.org/post.php?i=18uh23&p=456&s=789&tag=asdf">Link</a></span>
<span><a href="http://demo.org/post.php?i=19uh23&p=456&s=789&tag=asdf">Link</a></span>
<span><a href="http://demo.org/post.php?i=20uh23&p=456&s=789&tag=asdf">Link</a> </span>
<a href="www.test.com">test</a>
</div>
这是我的代码,它替换了锚标记中的tag参数。该功能工作正常。我的问题是在displayTextNumber()函数中。它存储它找到的第一个锚标记,并使用它来替换整个站点上的所有其他锚标记href。我想迭代每个标签。
function replaceQueryString( queryString, keys, newValues ) {
var parts = queryString.split('&');
// We're going to make an array of querystring key=value strings
var new_parts = [];
for( i in parts ) {
var keyValue = parts[i].split('=');
// Use jQuery to see if this key is in our desired set
var replacePos = $.inArray(keyValue[0],keys);
// If it is, it will give a non-negative integer, if not it'll give -1
if( replacePos >= 0 )
// We want to replace this key so make a new string for the key/value pair
new_parts.push( keyValue[0] + '=' + newValues[replacePos] );
else {
// This isn't the key we want to replace, so leave it alone
new_parts.push( parts[i] );
}
}
// glue all the parts together and return them
return new_parts.join('&');
}
function displayTextNumber(){
if(isNotBrandedTerm()){
var NumberSpans = document.getElementsByTagName('span');
for (var i=0; i < NumberSpans.length; i++) {
// Get the full address from the original link
var old_fulladdr = $('span a').attr('href');
var old_addr_parts = old_fulladdr.split('?');
// The keys you want to replace
var tobereplaced = ['tag'];
// The respective values you want to assign
var replacements = [getPhoneNumber()];
var new_query_string = replaceQueryString( old_addr_parts[1], tobereplaced, replacements );
//var new_querystring = 'i=abc&p=def&g=ghi';
$('span a').attr('href',old_addr_parts[0] + '?' + new_query_string);
}//CLOSE IF
} //CLOSE FOR
}//close isNotBrandedTerm
答案 0 :(得分:1)
更改循环以执行此操作
$('span a').each(function(k,v){
var href = $(v).attr("href");
//do something to the href
//then re-apply
$(v).attr("href",theNewString);
});
答案 1 :(得分:1)
使用现有代码进行迭代时:
var NumberSpans = document.getElementsByTagName('span');
for (var i=0; i < NumberSpans.length; i++) {
var old_fulladdr = $('span a').attr('href');
}
变量old_fulladdr
将始终成为第一个href
的{{1}},因为这是您使用<a>
设置的内容。该选择器指示jQuery在页面中的任何位置获取$('span a').attr('href')
祖先的所有a
元素。
相反,您应该每次都在元素span
下选择<a>
。例如:
NumberSpans[i]
同样,在设置新的var old_fulladdr = $(NumberSpans[i]).find('a').attr('href');
时,您需要在循环中的当前范围下的href
设置它,如:
a
请注意,$(NumberSpans[i]).find('a').attr('href',old_addr_parts[0] + '?' + new_query_string);
可以作为变量提取。
最后,当您最初选择$(NumberSpans[i]).find('a')
元素时,您正在使用span
选择整个文档中的所有跨度,因此如果列表中的某个范围不是您的,则您的循环可能会出错期待。
不是问题的一部分,而是一些建议......
我意识到你正在使用jQuery的部分,但是库也可以更简单地选择和迭代元素集合,而不是
var NumberSpans = document.getElementsByTagName('span');
你可以使用jQuery的.each()
函数
var NumberSpans = document.getElementsByTagName('span');
for (var i=0; i < NumberSpans.length; i++) {
// do things
}
可能会简化代码。