这似乎是一个非常简单的问题:
我有一个程序,有人在表单中输入字符串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...
。
我觉得我在这里遗漏了一些东西。在这两种情况下,有没有办法使这项工作相同?
答案 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&sortmethod1=147')
这就是你结束的原因:
<a href="javascript:AJAX_Get('http://10.0.0.195/program.exe?Qry147=M%2526S&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&S')">anchor</a>
<a onclick="myQuery('M&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块的应用程序的任何部分可能仍然存在问题,但是在核心代码中进行此解决方案是一个小小的改动,所以我现在正在使用此路由。
编辑:刚刚在这里发现了我的答案,并意识到这个解决方案造成的问题多于解决的问题。我最终抽出时间将其更改为正常工作(因此它在正确的时间使用正确的转义方法。