如何使用jquery来操作查询字符串

我有一个选择下拉列表,其id映射到值。 在onChange事件中,我想重定向到相同的url,但是在查询字符串中附加了“id = value”。

如何检查此’id’选项是否已存在于查询字符串中(我不想要多个值)并根据需要替换/追加。

我如何检查’?’ 已经在查询字符串中,如果不是,则附加到url。

使用jquery有一个简单的方法吗?

对于$().ajax(url, {options})调用$().ajax(url, {options})它必须在引擎盖下做类似的事情。 我希望我可以做$().redirect( url, { id : $(this).val() })或者其他。

提前致谢。

注意:此页面可能会或可能不会传入一些不同的查询选项(在其他表单选项上设置默认值),因此无法替换整个查询字符串。

     $(function(){ $('#selector').change(function(){ // problem if 'id' option already exists var url = location.href + '?;id=' + $(this).val(); location.assign( url ); }); });  reset 
one two three

我最终使用RegExp匹配来覆盖选项。 jQuery.param接受一个哈希并将其序列化为query_string,但它不提供反向(分解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(); }); 

根据CoffeeMonster的回答:

当location.href包含哈希部分时出现问题:

www.example.com#hash成为www.example.com#hash?id=whatever结果是?id=whatever服务器未解释的内容。

通过删除url的url部分来修复它: url.split("#")[0];

 // put function into jQuery namespace jQuery.redirect = function(url, params) { url = url || window.location.href || ''; url = url.split("#")[0]; 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 ); }; 

现在www.example.com#hash成为www.example.com?id=whatever

这就像一个魅力:

 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() ); } ); 

尝试使用拆分function:

 var url = location.href.split('?')[0] + '?;id=' + $(this).val(); 

split返回一个由字符串拆分的字符串组成的列表(如’?’),删除该字符串。

我怀疑所谓的解决方案不适用于特定的变量名称。 特别是线路:

 RegExp( ';?' + key + '=?[^&;]*', 'g' ) 

如果key是查询字符串中其他位置存在的字符序列,则该错误也会被替换(尝试一个字母,例如’a’)。 这是因为正则表达式使字符串边界保持打开(前导’;’和尾随’=’都是可选的)。 也许epxression更像是:

 RegExp( '[;&]' + key + '=?[^&;]*', 'g' ) 

虽然我还没有测试过。