使用&符号编码URL组件。

时间:2010-07-02 15:43:37

标签: javascript html url encoding

这似乎是一个非常简单的问题:

我有一个程序,有人在表单中输入字符串M&S并运行查询。我理解&是一个保留字符,因此必须进行编码。问题是它似乎需要在某些情况下编码两次。

如果在javascript onClick事件中使用该URL,则正常的URL编码似乎工作正常(此处操作员可以单击列标题进行排序):

<td onClick="AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%26S&sortmethod1=161')">

但是,如果在锚中使用了URL(虽然锚实际上使用了AJAX),它似乎需要编码两次:

<a href="javascript:AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147')" title='Refresh'>Refresh</a>

上述两个例子都可以正常使用。但它们是手工生成的测试用例。不幸的是,在应用程序中,当我实际生成URL时,我不知道它将如何使用。

如果我对网址参数进行一次编码(M%26S),则可以在onClick中正常工作。但是在锚中使用这种方式,服务器将URL视为...Qry147=M&S&sortmethod1=147... - 因此在返回服务器之前它必须是未编码的。

如果我将其编码两次(M%2526S),则锚点有效,但对于onClick,服务器会看到...Qry147=M%2526S...

我觉得我在这里遗漏了一些东西。在这两种情况下,有没有办法使这项工作相同?

3 个答案:

答案 0 :(得分:8)

如果使用简单的步骤构建整个HTML文本,一些困难就会消失。因此,通过举例来说,您希望对以下查询参数进行编码:

M&S

当您将此字符串作为查询参数嵌入到网址中时,您必须对其进行urlencode,如您所知。 urlencoded字符串为M%26S。完整的URL如下所示:

http://10.0.0.195/program.exe?Qry147=M%26S&sortmethod1=147

现在这个URL嵌入在JavaScript代码中,在这种情况下,您只需要两端的单引号:

'http://10.0.0.195/program.exe?Qry147=M%26S&sortmethod1=147'

整个JavaScript代码如下所示:

AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147')

现在整个文本用于解释为URL的HTML上下文中,因此您需要再次对其进行urlencode:

AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&sortmethod1=147')

最后,由于您将此文本嵌入HTML中,因此需要对其进行htmlescape:

AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&amp;sortmethod1=147')

这就是你结束的原因:

<a href="javascript:AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&amp;sortmethod1=147')" title='Refresh'>Refresh</a>

我通常不会将字符串M&S直接放入onclick事件或锚点来避免这些编码挑战。通常,您不能以相同的方式对onclick事件和锚进行编码,因为两者的解码过程都不同:

onclick: html -> js -> url
anchor: html -> url -> js -> url

但是等等......如果你写这样的辅助函数,它可以工作:

function myQuery(q) {
    var encodedQ = encodeURIComponent(q); // TODO: which character encoding is used here?
    var url = 'http://10.0.0.195/program.exe?Qry147=' + encodedQ + '&sortmethod1=147';
    var response = AJAX_Get(url);
    // TODO: handle errors
}

现在你可以写:

<a href="javascript:myQuery('M&amp;S')">anchor</a>
<a onclick="myQuery('M&amp;S')">event</a>

这个技巧有效,因为在锚案例中不再有%

答案 1 :(得分:1)

我建议将参数以未编码的形式存储,然后在使用它时进行编码,无论是在onClick事件还是锚点。

答案 2 :(得分:0)

我从其他地方得到了一些解决方案,但它运作得相当好。

简单地替换:

&lt; a href =“javascript:AJAX_Get(...)”&gt;

使用:

&lt; a href =“javascript:void(0);”的onClick = “AJAX_Get(...)” &GT;

onClick操作在锚点和其他元素上的工作方式相同。显然,编写自己的HTML块的应用程序的任何部分可能仍然存在问题,但是在核心代码中进行此解决方案是一个小小的改动,所以我现在正在使用此路由。

编辑:刚刚在这里发现了我的答案,并意识到这个解决方案造成的问题多于解决的问题。我最终抽出时间将其更改为正常工作(因此它在正确的时间使用正确的转义方法。