我的网页上有一系列<a>
链接,如下所示:
<a href="http://www.domain.com/page/other.jsf?fruit=apple&tree=pine&rock=sedimentary">click me</a>
这些参数以较小的方式操纵链接到(&#34; other.jsf&#34;)的最终页面的内容。
作为A / B / n测试的一部分,我想根据包含链接的页面上的用户行为更改href中的参数。因此,例如,我想将fruit参数更改为&#34; orange&#34;点击之前。
我的问题是参数更改了字符串中的位置,或者某些链接可能根本不存在,而.param()函数似乎只适用于网址。
到目前为止(基于另一个问题的答案)我有这个,但它没有考虑到可能没有&#34; end_pos&#34;或者如果&#34; fruit =&#34;在href中缺少(尽管第二位看起来更容易修复if 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页面答案 0 :(得分: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 :(得分: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);
问题的第2部分! 如果您的参数是已知的或至少是已知的集合,则您始终可以使用新值重建网址。
e.g。 var params = ['fruit','tree','some_other','some_other2']; //所有可能参数的超集。
现在你可以遍历这个数组并使用每个参数调用getUrlParameter函数来查看它是否存在。如果存在,则使用新值重建您的网址。
为了澄清,函数getUrlParameters将为未找到的任何param返回undefined,根据typeof undefined丢弃它,然后使用新值重构url
答案 2 :(得分:1)
您可以使用Attribute Contains Selector [name*="value"]
"a[href*=fruit]"
在a
属性,.attr(attributeName, function)
,"fruit"
选择包含href
的{{1}}元素用String.prototype.replace()
"apple"
"orange"
&#13;
$("a[href*=fruit]").attr("href", function(_, href) {
return href.replace(/apple/, "orange")
})
&#13;
答案 3 :(得分:1)
而不是substr
,split这些参数分开并与它们一起工作。这是一个详细的例子来帮助。
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