Изменение параметров URL-адреса
У меня есть этот URL:
site.fwx?position=1&archiveid=5000&columns=5&rows=20&sorting=ModifiedTimeAsc
что мне нужно, так это иметь возможность изменить значение параметра url-адреса "строки" на то, что я указываю, скажем, 10. И если "строки" не существует, мне нужно добавить его в конец url-адреса и добавить значение, которое я уже указал (10).
19 ответов:
Я думаю, что вы хотите плагин запрос.
например:
window.location.search = jQuery.query.set("rows", 10);
Это будет работать независимо от текущего состояния строк.
я расширил код Sujoy, чтобы создать функцию.
Вызовы:/** * http://stackoverflow.com/a/10997390/11236 */ function updateURLParameter(url, param, paramVal){ var newAdditionalURL = ""; var tempArray = url.split("?"); var baseURL = tempArray[0]; var additionalURL = tempArray[1]; var temp = ""; if (additionalURL) { tempArray = additionalURL.split("&"); for (var i=0; i<tempArray.length; i++){ if(tempArray[i].split('=')[0] != param){ newAdditionalURL += temp + tempArray[i]; temp = "&"; } } } var rows_txt = temp + "" + param + "=" + paramVal; return baseURL + "?" + newAdditionalURL + rows_txt; }
var newURL = updateURLParameter(window.location.href, 'locId', 'newLoc'); newURL = updateURLParameter(newURL, 'resId', 'newResId'); window.history.replaceState('', '', updateURLParameter(window.location.href, "param", "value"));
обновленная версия, которая также заботится о якорях на URL.
function updateURLParameter(url, param, paramVal) { var TheAnchor = null; var newAdditionalURL = ""; var tempArray = url.split("?"); var baseURL = tempArray[0]; var additionalURL = tempArray[1]; var temp = ""; if (additionalURL) { var tmpAnchor = additionalURL.split("#"); var TheParams = tmpAnchor[0]; TheAnchor = tmpAnchor[1]; if(TheAnchor) additionalURL = TheParams; tempArray = additionalURL.split("&"); for (var i=0; i<tempArray.length; i++) { if(tempArray[i].split('=')[0] != param) { newAdditionalURL += temp + tempArray[i]; temp = "&"; } } } else { var tmpAnchor = baseURL.split("#"); var TheParams = tmpAnchor[0]; TheAnchor = tmpAnchor[1]; if(TheParams) baseURL = TheParams; } if(TheAnchor) paramVal += "#" + TheAnchor; var rows_txt = temp + "" + param + "=" + paramVal; return baseURL + "?" + newAdditionalURL + rows_txt; }
У Бена Альмана есть хороший плагин jQuery querystring / url здесь это позволяет легко манипулировать строкой запроса.
Как и просили -
перейти на его тестовую страницу здесь
в firebug введите в консоль следующее
jQuery.param.querystring(window.location.href, 'a=3&newValue=100');
он вернет вам следующую измененную строку url
http://benalman.com/code/test/js-jquery-url-querystring.html?a=3&b=Y&c=Z&newValue=100#n=1&o=2&p=3
обратите внимание, что значение строки запроса a изменилось с X на 3, и оно добавило новое значение.
затем вы можете использовать новую строку url, как вы хотите, например использование документа.расположение = newUrl или изменить привязку ссылки и т. д.
чтобы ответить на мой собственный вопрос 4 года спустя, узнав много нового. Тем более, что вы не должны использовать jQuery для все. Я создал простой модуль, который может анализировать / строчить строку запроса. Это упрощает изменение строки запроса.
можно использовать запрос-строку следующим образом:
// parse the query string into an object var q = queryString.parse(location.search); // set the `row` property q.rows = 10; // convert the object to a query string // and overwrite the existing query string location.search = queryString.stringify(q);
быстрое маленькое решение в чистом js, никаких плагинов не требуется:
function replaceQueryParam(param, newval, search) { var regex = new RegExp("([?;&])" + param + "[^&;]*[;&]?"); var query = search.replace(regex, "").replace(/&$/, ''); return (query.length > 2 ? query + "&" : "?") + (newval ? param + "=" + newval : ''); }
назовем это так:
window.location = '/mypage' + replaceQueryParam('rows', 55, window.location.search)
или, если вы хотите, чтобы остаться на той же странице и заменить несколько параметров:
var str = window.location.search str = replaceQueryParam('rows', 55, str) str = replaceQueryParam('cols', 'no', str) window.location = window.location.pathname + str
edit, спасибо люк: чтобы полностью удалить параметр, передайте
false
илиnull
значение:replaceQueryParam('rows', false, params)
. Так как0
тоже ложь, указать'0'
.
вы можете сделать это через обычный JS также
var url = document.URL var newAdditionalURL = ""; var tempArray = url.split("?"); var baseURL = tempArray[0]; var aditionalURL = tempArray[1]; var temp = ""; if(aditionalURL) { var tempArray = aditionalURL.split("&"); for ( var i in tempArray ){ if(tempArray[i].indexOf("rows") == -1){ newAdditionalURL += temp+tempArray[i]; temp = "&"; } } } var rows_txt = temp+"rows=10"; var finalURL = baseURL+"?"+newAdditionalURL+rows_txt;
современный подход к этому заключается в использовании встроенных стандартных URLSearchParams. Он поддерживается всеми основными браузерами, за исключением IE, где они являются polyfills скачать
const paramsString = "site.fwx?position=1&archiveid=5000&columns=5&rows=20&sorting=ModifiedTimeAsc" const searchParams = new URLSearchParams(paramsString); searchParams.set('rows', 10); console.log(searchParams.toString()); // return modified string.
была бы жизнеспособной альтернативой Строковой манипуляции, чтобы настроить html
form
и просто изменить значениеrows
элемент?так, с
html
что-то вроде<form id='myForm' target='site.fwx'> <input type='hidden' name='position' value='1'/> <input type='hidden' name='archiveid' value='5000'/> <input type='hidden' name='columns' value='5'/> <input type='hidden' name='rows' value='20'/> <input type='hidden' name='sorting' value='ModifiedTimeAsc'/> </form>
С помощью следующего JavaScript, чтобы отправить форму
var myForm = document.getElementById('myForm'); myForm.rows.value = yourNewValue; myForm.submit();
вероятно, не подходит для всех ситуаций, но может быть лучше, чем разбор строки URL.
вы можете использовать эту мою библиотеку, чтобы сделать работу: https://github.com/Mikhus/jsurl
var url = new Url('site.fwx?position=1&archiveid=5000&columns=5&rows=20&sorting=ModifiedTimeAsc'); url.query.rows = 10; alert( url);
Я написал небольшую вспомогательную функцию, которая работает с любым select. Все, что вам нужно сделать, это добавить класс "redirectOnChange" к любому элементу select, и это приведет к перезагрузке страницы с новым / измененным параметром querystring, равным идентификатору и значению select, например:
<select id="myValue" class="redirectOnChange"> <option value="222">test222</option> <option value="333">test333</option> </select>
приведенный выше пример добавит "?myValue=222" или"?myValue=333" (или с помощью"&", если существуют другие параметры) и перезагрузите страницу.
jQuery:
$(document).ready(function () { //Redirect on Change $(".redirectOnChange").change(function () { var href = window.location.href.substring(0, window.location.href.indexOf('?')); var qs = window.location.href.substring(window.location.href.indexOf('?') + 1, window.location.href.length); var newParam = $(this).attr("id") + '=' + $(this).val(); if (qs.indexOf($(this).attr("id") + '=') == -1) { if (qs == '') { qs = '?' } else { qs = qs + '&' } qs = qs + newParam; } else { var start = qs.indexOf($(this).attr("id") + "="); var end = qs.indexOf("&", start); if (end == -1) { end = qs.length; } var curParam = qs.substring(start, end); qs = qs.replace(curParam, newParam); } window.location.replace(href + '?' + qs); }); });
здесь я взял ответ Адиля Малика и исправил 3 проблемы, которые я идентифицировал с ним.
/** * Adds or updates a URL parameter. * * @param {string} url the URL to modify * @param {string} param the name of the parameter * @param {string} paramVal the new value for the parameter * @return {string} the updated URL */ self.setParameter = function (url, param, paramVal){ // http://stackoverflow.com/a/10997390/2391566 var parts = url.split('?'); var baseUrl = parts[0]; var oldQueryString = parts[1]; var newParameters = []; if (oldQueryString) { var oldParameters = oldQueryString.split('&'); for (var i = 0; i < oldParameters.length; i++) { if(oldParameters[i].split('=')[0] != param) { newParameters.push(oldParameters[i]); } } } if (paramVal !== '' && paramVal !== null && typeof paramVal !== 'undefined') { newParameters.push(param + '=' + encodeURI(paramVal)); } if (newParameters.length > 0) { return baseUrl + '?' + newParameters.join('&'); } else { return baseUrl; } }
еще один вариант ответа Суджоя. Просто изменил имена переменных и добавил оболочку пространства имен:
window.MyNamespace = window.MyNamespace || {}; window.MyNamespace.Uri = window.MyNamespace.Uri || {}; (function (ns) { ns.SetQueryStringParameter = function(url, parameterName, parameterValue) { var otherQueryStringParameters = ""; var urlParts = url.split("?"); var baseUrl = urlParts[0]; var queryString = urlParts[1]; var itemSeparator = ""; if (queryString) { var queryStringParts = queryString.split("&"); for (var i = 0; i < queryStringParts.length; i++){ if(queryStringParts[i].split('=')[0] != parameterName){ otherQueryStringParameters += itemSeparator + queryStringParts[i]; itemSeparator = "&"; } } } var newQueryStringParameter = itemSeparator + parameterName + "=" + parameterValue; return baseUrl + "?" + otherQueryStringParameters + newQueryStringParameter; }; })(window.MyNamespace.Uri);
использование выглядит так:
var changedUrl = MyNamespace.Uri.SetQueryStringParameter(originalUrl, "CarType", "Ford");
Я тоже написал a библиотека для получения и установки параметров URL-запроса в JavaScript.
вот пример его использования.
var url = Qurl.create() , query , foo ;
получить параметры запроса как объект, по ключу или добавить/изменить/удалить.
// returns { foo: 'bar', baz: 'qux' } for ?foo=bar&baz=qux query = url.query(); // get the current value of foo foo = url.query('foo'); // set ?foo=bar&baz=qux url.query('foo', 'bar'); url.query('baz', 'qux'); // unset foo, leaving ?baz=qux url.query('foo', false); // unsets foo
вот что я делаю. Используя мою функцию editParams (), вы можете добавить, удалить или изменить любой параметр, а затем использовать встроенную функцию replaceState () для обновления URL:
window.history.replaceState('object or string', 'Title', 'page.html' + editParams('sorting', ModifiedTimeAsc)); // background functions below: // add/change/remove URL parameter // use a value of false to remove parameter // returns a url-style string function editParams (key, value) { key = encodeURI(key); var params = getSearchParameters(); if (Object.keys(params).length === 0) { if (value !== false) return '?' + key + '=' + encodeURI(value); else return ''; } if (value !== false) params[key] = encodeURI(value); else delete params[key]; if (Object.keys(params).length === 0) return ''; return '?' + $.map(params, function (value, key) { return key + '=' + value; }).join('&'); } // Get object/associative array of URL parameters function getSearchParameters () { var prmstr = window.location.search.substr(1); return prmstr !== null && prmstr !== "" ? transformToAssocArray(prmstr) : {}; } // convert parameters from url-style string to associative array function transformToAssocArray (prmstr) { var params = {}, prmarr = prmstr.split("&"); for (var i = 0; i < prmarr.length; i++) { var tmparr = prmarr[i].split("="); params[tmparr[0]] = tmparr[1]; } return params; }
Я искал то же самое и нашел:https://github.com/medialize/URI.js что довольно приятно :)
-- Update
Я нашел лучший пакет:https://www.npmjs.org/package/qs он также имеет дело с массивами в get params.
Я знаю, это старый вопрос. Я улучшил функцию выше, чтобы добавить или обновить параметры запроса. Все еще чистое решение JS.
function addOrUpdateQueryParam(param, newval, search) { var questionIndex = search.indexOf('?'); if (questionIndex < 0) { search = search + '?'; search = search + param + '=' + newval; return search; } var regex = new RegExp("([?;&])" + param + "[^&;]*[;&]?"); var query = search.replace(regex, "").replace(/&$/, ''); var indexOfEquals = query.indexOf('='); return (indexOfEquals >= 0 ? query + '&' : query + '') + (newval ? param + '=' + newval : ''); }
моя функция поддерживает удаление param
function updateURLParameter(url, param, paramVal, remove = false) { var newAdditionalURL = ''; var tempArray = url.split('?'); var baseURL = tempArray[0]; var additionalURL = tempArray[1]; var rows_txt = ''; if (additionalURL) newAdditionalURL = decodeURI(additionalURL) + '&'; if (remove) newAdditionalURL = newAdditionalURL.replace(param + '=' + paramVal, ''); else rows_txt = param + '=' + paramVal; window.history.replaceState('', '', (baseURL + "?" + newAdditionalURL + rows_txt).replace('?&', '?').replace('&&', '&').replace(/\&$/, '')); }
Это современный способ сделать это:
function setGetParam(key,value) { if (history.pushState) { var params = new URLSearchParams(window.location.search); params.set(key, value); var newUrl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + params.toString(); window.history.pushState({path:newUrl},'',newUrl); } }
мой фрагмент с URI декодирования / кодирования:
function isDefined(object) { return object !== undefined && object !== null; } function isNotEmpty(string) { return isDefined(string) && string.length > 0; } /** * Update or add the specified URL parameter. * <p> * @param {String} name * @param {String} value */ function updateUrlParam(name, value) { // Get the path and the query var urlInfo = decodeURI(window.location.href).split('?'); var path = urlInfo[0]; var query = urlInfo[1]; // Build the query var params = ''; var anchor = null; if (isNotEmpty(query)) { var queryInfo = query.split('#'); query = queryInfo[0]; anchor = queryInfo[1]; queryInfo = query.split('&'); for (var i = 0; i < queryInfo.length; ++i) { if (queryInfo[i].split('=')[0] !== name) { params += '&' + queryInfo[i]; } } } else { var queryInfo = path.split('#'); query = queryInfo[0]; anchor = queryInfo[1]; if (isNotEmpty(query)) { path = query; } } query = '?' + name + '=' + value + params; if (isNotEmpty(anchor)) { query += '#' + anchor; } // Replace the URL window.history.replaceState('', '', encodeURI(path + query)); }