如何在URL参数中提交哈希键?

tvi*_*alw 5 javascript urlencode

我有一个Spring-MVC应用程序,Freemarker作为视图组件.

在我的模板中,生成了几个指向我的应用程序的链接,其中包含包含哈希键(#)的URL参数.

例:

参数: Q#106368 11

Freemarker使用编码的参数生成的URL: testurl.html?key=Q%23106368%2011

我使用JavaScript重定向到这个URL(原因:我使用JS来同时管理2帧的加载).

重定向方法很简单:

    function redir(url) {
        window.location.href = url;
    }
Run Code Online (Sandbox Code Playgroud)

Freemarker生成的JS调用看起来像

<a href="javascript:redir('http://localhost:8080/testappp/testurl.html?key=Q%23106368%2011');">test</a>
Run Code Online (Sandbox Code Playgroud)

我的问题是浏览器/ Javascript转换回URL编码参数,认为有一个#并切断那里.

当我window.location.href='http://...'直接使用它的工作原理.只有在使用方法参数时,它似乎是神奇的URL解码,然后重定向失败,因为URL被切断了#.

有没有一种简单的方法来正确传输参数?

我知道我可以在模板中替换#例如with $$$hash$$$,并再次在服务器端进行替换.但是有很多地方我不得不改变......

tvi*_*alw 13

正如Marc B评论的那样,有必要再次进行URL编码.方法是encodeURI().但是,此方法不对#符号进行编码.对于我的特定用例,我必须在编码后替换#符号%23.

重定向JS方法最终看起来像:

    function redir(url) {
        url = encodeURI(url);
        url = url.replace(/#/g, '%23');
        window.location.href = url;
    }
Run Code Online (Sandbox Code Playgroud)

比较escape(),encodeURI()和encodeURIComponent()


Fir*_*row 8

encodeURIComponent/decodeURIComponent 比 encodeURI 更彻底,它将解码/编码 '#' 和事件 '/'