从a标签的href中获取查询字符串参数

5个回答

3

不要使用substr,而是分割参数并处理它们。以下是一个详细的示例以帮助理解。

var url = 'http://www.domain.com/page/other.jsf?fruit=apple&tree=pine&rock=sedimentary';

/**
* Gets params from url as an object
* @param {String} url
* @return {Object}
*/
var getParams = function (url) {
    var params = {};
    var match = url.match(/\?(.*)$/);

    if (match && match[1]) {
        match[1].split('&').forEach(function (pair) {
            pair = pair.split('=');
            params[pair[0]] = pair[1];
        });
    }

    return params;
};

/**
* Converts an object of params into a query string.
* @param {Object} params
* @return {String}
*/
var paramsToString = function (params) {
    return Object.keys(params || {}).map(function (key) {
        return key + '=' + params[key];
    }).join('&');
};

/**
* Replaces url params.
* @param {String} url
* @param {Object} newParams
* @return {String}
*/
var changeParams = function (url, newParams) {
    var params = getParams(url);

    Object.assign(params, newParams);
    return url.replace(/\?(.*)$/, function () {
        return '?' + paramsToString(params);
    });
};

var urlWithNewParams = changeParams(url, {
    fruit: 'banana',
    weasel: 'yes',
});

console.log(urlWithNewParams); // http://www.domain.com/page/other.jsf?fruit=banana&tree=pine&rock=sedimentary&weasel=yes

1
我使用了这个函数来完成这个任务:

function getQueryParameters (str) {
  return (str || document.location.search).replace(/(^\?)/,'').split("&").map(function(n){return n = n.split("="),this[n[0]] = n[1],this}.bind({}))[0];
}

var queryParams = getQueryParameters(myUrl);

结果:
{
    "fruit": "apple",
     ...
}

1
这是我用来提取URL参数的方法!
var getUrlParameter = function(sParam,url) {
    var sPageURL = url;
    if(typeof(sPageURL) === 'undefined' || sPageURL == ''){
        sPageURL = decodeURIComponent(window.location.search.substring(1));
    }
    var sURLVariables = sPageURL.split('&'), sParameterName, i;

    for (i = 0; i < sURLVariables.length; i++) {
        sParameterName = sURLVariables[i].split('=');

        if (sParameterName[0] === sParam) {
            return sParameterName[1] === undefined ? true : decodeURI(sParameterName[1]);
        }
    }
};

使用方法

 getUrlParameter('fruit',url_after_question_mark);

你的问题的第二部分!如果你的参数已知或者至少有一个已知的集合,你总是可以使用新值重构URL。

例如: var params = ['fruit','tree','some_other','some_other2'];//所有可能参数的超集。

现在,你可以遍历该数组,并对每个参数调用getUrlParameter函数以查看它是否存在。如果它存在,则使用新值重构你的URL。

仅供澄清,getUrlParameters函数将对任何未找到的参数返回undefined,根据undefined的typeof丢弃它,然后使用你的新值重构URL。


1
你可以使用 属性包含选择器 [name*="value"] "a[href*=fruit]" 来选择包含 "fruit"a 元素在 href 属性中,.attr(attributeName, function)String.prototype.replace() 用于将 "apple" 替换为 "orange"

$("a[href*=fruit]").attr("href", function(_, href) {
  return href.replace(/apple/, "orange")
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<a href="http://www.domain.com/page/other.jsf?fruit=apple&tree=pine&rock=sedimentary">click me</a>


我非常喜欢这个;它很简洁,解决了整个问题。 - tymothytym

0
较新的浏览器支持非常简单的const params = new URL(href).searchParams。然后可以使用params.get("query")检索值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接