简体   繁体   English

如何正确地将搜索查询参数添加到JavaScript中包含哈希的网址?

[英]How to properly add search query param to url containing hash in javascript?

I want to add a base url and query parameters to each link: 我想向每个链接添加基本URL和查询参数:

function buildURL(relativePath) {
    var url = new URL('http://example.com/' + relativePath);
    url.searchParams.set('utm_source', 'app');
    return url.toString(); 
}

It works fine for most cases: 在大多数情况下都可以正常工作:

buildURL('search')
"http://example.com/search?utm_source=app"

buildURL('search?q=query&page=2')
"http://example.com/search?q=query&page=2&utm_source=app"

The problem starts when I add an anchor: 当我添加锚点时,问题开始了:

buildURL('search#anchor')
"http://example.com/search?utm_source=app#anchor"

buildURL('search#anchor?q=query')
"http://example.com/search?utm_source=app#anchor?q=query"

This is not a valid URL with an anchor. 这不是带有锚点的有效URL。

Any ideas on how to overcome that using URL? 关于如何克服使用URL的任何想法?

EDIT 编辑

The expected outcome is adding the query params after the anchor 预期结果是在锚点添加查询参数

 buildURL('search#anchor')
"http://example.com/search#anchor?utm_source=app"

buildURL('search#anchor?q=query')
"http://example.com/search#anchor?utm_source=app?q=query"

 function buildURL(relativePath) { var url = new URL('http://example.com/' + relativePath); url.searchParams.set('utm_source', 'app'); return url.toString(); } console.log(buildURL("search")); console.log(buildURL("search?q=query&page=1")); console.log(buildURL("search#anchor")); console.log(buildURL("search#anchor?q=query")); 

Don't pass in a hash in the search params. 不要在搜索参数中传递哈希。

But if you must, you can detect the hash, split it from the parameter, set the search param and add the hash 但是,如果必须,您可以检测到哈希,将其与参数分开,设置搜索参数并添加哈希

 function buildURL(relativePath) { var hash = ""; if (relativePath.indexOf("#")!=-1) { var parts = relativePath.split("#"); hash = encodeURIComponent(parts[1]); // optionally handle ? in the hash part relativePath=parts[0]; } var url = new URL('http://example.com/' + relativePath); url.searchParams.set('utm_source', 'app'); if (hash) url.hash=hash; return url.toString(); } console.log(buildURL("search")); console.log(buildURL("search?q=query&page=1")); console.log(buildURL("search#anchor")); console.log(buildURL("search#anchor?q=query")); 

This should work.. Pass the hash after the query params 这应该起作用。 在查询参数之后传递哈希

 function buildURL(path) { var relativePath = path.split('#') var url = new URL('http://example.com/' + relativePath[0]); url.searchParams.set('utm_source', 'app'); url.hash = relativePath[1] ? relativePath[1] : '' return url.toString(); } console.log(buildURL("search")); console.log(buildURL("search?q=query&page=1")); console.log(buildURL("search#anchor")); console.log(buildURL("search#anchor?q=query")); console.log(buildURL("searchr?q=query&q2=query2#anchor")); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM