У меня есть выпадающий список с идентификатором, сопоставленным со значениями. В событии onChange я хочу перенаправить на тот же URL-адрес, но с добавлением 'id = value' к строке запроса.
Как проверить, что этой опции 'id' еще нет в строке запроса (я не хочу нескольких значений), и заменить / добавить, если необходимо.
Как я могу проверить, если '?' уже находится в строке запроса и добавьте к URL, если его нет.
Есть ли простой способ сделать это с помощью jquery?
Он должен сделать нечто подобное под колпаком для вызовов $().ajax(url, {options})
. Я надеялся, что смогу сделать $().redirect( url, { id : $(this).val() })
или еще что-нибудь.
Заранее спасибо.
Примечание. На этой странице может быть или не быть передано несколько различных параметров запроса (которые устанавливают значения по умолчанию для других параметров формы), поэтому замена всей строки запроса невозможна.
<html>
<head><script type="text/javascript" src="/jquery-1.3.2.min.js"></script></head>
<body>
<script>
$(function(){
$('#selector').change(function(){
// problem if 'id' option already exists
var url = location.href + '?;id=' + $(this).val();
location.assign( url );
});
});
</script>
<a href="#" onclick="location.assign( location.pathname )">reset</a>
<form>
<select id='selector' name='id'>
<option value='1'>one</option>
<option value='2'>two</option>
<option value='3'>three</option>
</select>
</form>
</body>
</html>
Я оказался сопоставлением Regexp, чтобы переопределить параметры. jquery.param принимает хеш и сериалии его к запросу Но это не предоставляет обратную (расставаемую Query_String).
// put function into jQuery namespace
jQuery.redirect = function(url, params) {
url = url || window.location.href || '';
url = url.match(/\?/) ? url : url + '?';
for ( var key in params ) {
var re = RegExp( ';?' + key + '=?[^&;]*', 'g' );
url = url.replace( re, '');
url += ';' + key + '=' + params[key];
}
// cleanup url
url = url.replace(/[;&]$/, '');
url = url.replace(/\?[;&]/, '?');
url = url.replace(/[;&]{2}/g, ';');
// $(location).attr('href', url);
window.location.replace( url );
};
Тогда в HTML
$('#selector').change(function(){
$.redirect( location.href, { id : $(this).val() })
})
благодаря всем, которые ответили.
Установка Window.location.Search
будет обновлять строку запроса URL (и перезаписать значение, если это уже выходит)
$('#selector').change(function(){
window.location.search = "id=" + $(this).val();
});
Это работает как очарование:
jQuery.redirect = function( url ) {
window.location.replace( url );
};
$( "#selector" ).change( function() {
var href = window.location.href.substring( 0, window.location.href.indexOf( '?' ) );
$.redirect( href + '?id=' + $( this ).val() );
} );
Попробуйте использовать функцию split:
var url = location.href.split('?')[0] + '?;id=' + $(this).val();
split
возвращает список, состоящий из строки, разделенной строкой (например, '?'), с удаленной строкой.
Я подозреваю, что предполагаемое решение не работает с конкретными именами переменных. В частности, строка:
RegExp( ';?' + key + '=?[^&;]*', 'g' )
Если ключ представляет собой последовательность символов, присутствующую в другом месте в строке запроса, это вхождение также будет ошибочно заменено (попробуйте одну букву, например, 'a'). Это связано с тем, что регулярное выражение оставляет границы строки открытыми (ведущие ';' и завершающие '=' необязательны). Может быть, epxression лучше выглядит примерно так:
RegExp( '[;&]' + key + '=?[^&;]*', 'g' )
Хотя я еще не тестировал.