1

私がやろうとしていて、ほとんど達成したことは、スパンでラップされたアンカータグのURLのタグパラメーターを変更することです。それはうまく機能しています。何が起こっているのかというと、最初のアンカータグhrefをプルし、すべてのアンカータグを同じhrefに置き換えています。ループを通過するときに、毎回varが新しいhrefに置き換えられると思いました。提案?

    <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> 

これが、アンカータグのタグパラメータを置き換える私のコードです。その機能は正常に機能しています。私の問題は関数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
4

2 に答える 2

1

これを行うためにループを変更します

$('span a').each(function(k,v){

var href = $(v).attr("href");

//do something to the href

//then re-apply 
$(v).attr("href",theNewString);


});
于 2012-09-21T14:46:17.597 に答える
1

既存のコードを使用して反復する場合:

var NumberSpans = document.getElementsByTagName('span');

for (var i=0; i < NumberSpans.length; i++) {
    var old_fulladdr = $('span a').attr('href');
}

変数old_fulladdr常にhref最初の変数になり<a>ます。これは、で設定した変数だから$('span a').attr('href')です。そのセレクターは、ページ内の任意の場所に祖先を持つすべてのa要素を取得するようにjQueryに指示しています。span

代わりに、毎回<a>要素の下を選択する必要があります。NumberSpans[i]例えば:

var old_fulladdr = $(NumberSpans[i]).find('a').attr('href');

同様に、newを設定するときは、次のようにループ内の現在のスパンの下hrefに設定する必要があります。a

$(NumberSpans[i]).find('a').attr('href',old_addr_parts[0] + '?' + new_query_string);

$(NumberSpans[i]).find('a')変数として抽出できることに注意してください。

最後に、span最初に要素を選択するときは、ドキュメント全体のすべてのスパンを選択しているvar NumberSpans = document.getElementsByTagName('span');ため、リスト内のスパンが予期したものでない場合、ループでエラーが発生する可能性があります。

質問の一部ではありませんが、いくつかのアドバイス...

jQueryの一部を使用していることは承知していますが、ライブラリを使用すると、たとえば、要素のコレクションの選択と反復を簡単にすることもできます。

var NumberSpans = document.getElementsByTagName('span');

for (var i=0; i < NumberSpans.length; i++) {
    // do things
}

.each()jQueryの関数を使用できます

$('.changeparam a').each(function(k, v) { // select all `a` with ancestor class="changeparam"
    // here k = the index of each element so will be 0, 1, 2, 3, 4
    // and the v will be each element, i.e. the first <a>, second <a>, etc...
    console.log(k, v);
});

これはコードを単純化するかもしれません。

于 2012-09-21T16:08:06.750 に答える