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

Get query string parameters from href in a tag

本文关键字:获取 查询 字符串 参数 href      更新时间:2023-09-26

我有一个页面,上面有一系列<a>链接,看起来像这样:

<a href="http://www.domain.com/page/other.jsf?fruit=apple&tree=pine&rock=sedimentary">click me</a>

这些参数以次要方式操作链接到("other.jsf")的最终页面的内容。

作为 A/B/n 测试的一部分,我想根据包含链接的页面上的用户行为更改 href 中的参数。因此,例如,我想在单击水果参数之前将其更改为"橙色"。

我的问题是参数会更改字符串中的位置,或者对于某些链接可能根本不存在,并且 .param() 函数似乎仅适用于 url。

到目前为止(基于另一个问题答案)我有这个,但它没有考虑到可能没有"end_pos"或 href 中是否缺少"fruit="的可能性(尽管这第二位似乎更容易修复 if undefined-type 函数):

$('a').each(function () {
    if ($(this).attr('href').indexOf('other') > -1) {
        var hrefStr = $(this).attr('href');
        var start_pos = hrefStr.indexOf('fruit=') + 1;
        var end_pos = hrefStr.indexOf('&',start_pos); //works as long as fruit=apple is in the middle or front of the string
        var fruit = hrefStr.substring(start_pos,end_pos);
        ...
        //put modified href back in <a>
    }
});

我的第二个问题是确定原始 href 的相同部分以将新字符串放回原处。不过,在首先了解提取它的方法后,我可能会得到这个。

我还应该说,除了通过JavaScript之外,我无法控制.jsf页面

而不是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

您可以使用属性包含选择器 [name*="value"] "a[href*=fruit]"选择a包含 "fruit" 的元素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>

我使用这个函数来做到这一点:

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",
     ...
}

这是我用来提取 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);

问题的第 2 部分!如果您的参数是已知的或至少是已知的集合,则始终可以使用新值重建 url。

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

现在,您可以遍历此数组并使用每个参数调用 getUrlParameter 函数以查看它是否存在。如果存在,请使用新值重建您的 URL。

只是为了澄清,函数getUrlParameters将为任何未找到的参数返回undefined,根据未定义的类型丢弃它,然后用新值重建url

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