как заменить параметры анкорной ссылки на jquery?

Я сейчас изучаю jquery. Я хочу заменить параметры URL-адреса другим при загрузке страницы. Например вот мой код

 <div class="changeparam">
<a href="http://demo.org/post.php?i=123&p=456&s=789">Link</a>
 </div> 

Теперь мне нужно изменить значение параметров i, p и s на разные значения, скажем, abc, def, ghi соответственно. Как я могу сделать это при загрузке страницы?


person user632347    schedule 26.04.2012    source источник
comment
Хотя это возможно, это не идеально. Где генерируется URL? Не могли бы вы изменить его на этом уровне?   -  person Rory McCrossan    schedule 26.04.2012
comment
@RoryMcCrossan: его можно изменить на уровне генерации URL. Но проблема в том, что мы должны кэшировать содержимое страницы. Поэтому в следующий раз, когда другой пользователь загрузит контент, будет загружен кеш. Таким образом, это может привести к передаче неверной информации о пользователе и содержимом.   -  person user632347    schedule 26.04.2012
comment
В этом случае вам следует заняться исправлением вашей системы кэширования.   -  person Rory McCrossan    schedule 26.04.2012
comment
@RoryMcCrossan: У вас есть предложения по этому поводу? Как я могу заменить параметры из файла кеша?   -  person user632347    schedule 26.04.2012


Ответы (2)


Вам нужно знать старые ценности? Если нет, вы не можете сделать что-то вроде следующего (это предполагает простой случай, когда все ссылки будут иметь одну и ту же строку запроса и должны быть расширены, если это не так):

$(document).ready( function ( ) {
    // Get the full address from the original link
    var old_fulladdr = $('div.changeparam a').attr('href');

    // split it to get the actual file address
    var old_addr_parts = old_fulladdr.split('?');

    // This may need something more complex...
    var new_querystring = 'i=abc&p=def&g=ghi';

    // This changes the href of the link to the new one.
    $('div.changeparam a').attr('href',old_addr_parts[0] + '?' + new_querystring);

});​

ОБНОВЛЕНИЕ: я создал более гибкую функцию, которая принимает строку запроса, массив элементов для замены и массив значений замены, а затем выводит новую строку запроса. Взгляните на этот jsfiddle: http://jsfiddle.net/LWzZR/1

Кроме того, я согласен с комментаторами по вашему вопросу - хотя это возможно, это не рекомендуется :)

person n00dle    schedule 26.04.2012
comment
Мне не нужны старые параметры. Я просто хочу обновить параметры при загрузке страницы. Что, если я просто хочу обновить только один параметр? - person user632347; 26.04.2012
comment
Дай мне 5 минут, я возьму скрипку. - person n00dle; 26.04.2012
comment
благодаря. Пожалуйста, рассмотрите вариант, чтобы при необходимости я мог сохранить значение i таким же и изменить только p и s. - person user632347; 26.04.2012
comment
Пожалуйста, посмотрите jsfiddle, который я только что связал в своем ответе. - person n00dle; 26.04.2012
comment
большое спасибо. Эта скрипка сработала. Теперь проблема в том, что у меня есть несколько таких div на моем сайте с одним и тем же именем класса. Теперь, когда я запускаю скрипт jquery, он заменяет все ссылки на первую ссылку. Как я могу запустить его для отдельных ссылок? - person user632347; 26.04.2012
comment
ianhales: Почему вы все это не рекомендуете? - person user632347; 26.04.2012
comment
Как бы вы различали ссылки? Если вы можете это сделать, просто примените функцию к каждому отдельно (возможно, используйте $('div.changeparam a').each(). Это не рекомендуется, потому что гораздо лучше делать это на стороне сервера. Что, если у вашего пользователя отключен javascript? - person n00dle; 26.04.2012
comment
Спасибо за комментарий. У меня это работает сейчас. Мой сайт уже использует много функций jquery lib. Поэтому, если пользователь отключит js, он не сможет использовать и другие функции. ТАК им нужно включить js. - person user632347; 27.04.2012

Попробуйте использовать jQuery BBQ. Это значительно упрощает работу со строками запросов.

Я думаю, ты захочешь попробовать

$(document).ready(function(){
    $.param.querystring($(".changeparam").attr("href"), {i:123, p:456, s:789})
});

В нем есть много интересных вещей для манипулирования строками запросов, и вам не нужно изобретать велосипед здесь.

person tedski    schedule 26.04.2012