如何使用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
我最终使用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' )
虽然我还没有测试过。