JQuery在多个锚点上更改URL参数

时间:2012-09-21 14:40:37

标签: jquery for-loop

我正在尝试做的并且主要完成的是更改包含在范围中的锚标签的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

2 个答案:

答案 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
}

可能会简化代码。