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

时间:2011-07-08 16:43:00

标签: javascript urlencode

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

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

示例:

参数:Q#106368 11

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

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

重定向方法很简单:

    function redir(url) {
        window.location.href = url;
    }

Freemarker生成的JS调用看起来像

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

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

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

是否有一种简单的方法可以正确传输参数?

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

3 个答案:

答案 0 :(得分:11)

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

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

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

Comparing escape(), encodeURI(), and encodeURIComponent()

答案 1 :(得分:2)

您使用的浏览器是什么?我正在尝试使用FireFox 5,并且在我的测试中它不会将%23转换回#。当您将鼠标悬停在链接上或复制链接位置时,它有什么作用?您确定输出链接的是否正在进行转换?

<强>更新

这并不理想,但它似乎解决了这个问题:

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

似乎解码了href属性。当我将鼠标移到它上面时,我看到了#而不是%23

答案 2 :(得分:2)

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