为什么%26会被解码到&;当从链接作为参数传递给JavaScript函数时?
我们在out web应用程序中有一个菜单,它使用为什么%26会被解码到&;当从链接作为参数传递给JavaScript函数时?,javascript,html,Javascript,Html,我们在out web应用程序中有一个菜单,它使用标记在主框架中加载页面 菜单中的典型项目如下所示: <a target="mainframe" href="/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3¶m3=val4">Menu Item 1</a> 它是给予: /servlet1?param1=val1&parma2=servlet2?s2p1=val2**&**s2p2
标记在主框架中加载页面
菜单中的典型项目如下所示:
<a target="mainframe" href="/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3¶m3=val4">Menu Item 1</a>
它是给予:/servlet1?param1=val1&parma2=servlet2?s2p1=val2**&**s2p2=val3¶m3=val4(注意在上述函数调用中的粗体
&
,它是%26
)
%26
在被传递到JS函数时被转换为&
,这通常不会发生,直到请求被转发到Servlet2
。由于%26
已更改为&
,s2p2
请求参数由servlet1
而不是servlet2
拾取
基本上,我的问题是,如果执行onClick=“validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3¶m3=val4')”
如您所料,它保持为
%26
?否,%26
在HTML文件首次读入浏览器时(正确地)解释为&而不是在传递到JavaScript函数时。如果您想要字符“百分之二六”的文字序列,则必须将其编码为%2526
,javascript:
协议仍然被视为有效的URL,因此浏览器对其进行了正确编码。在Javascript中很容易解码它
alert(decodeURIComponent(href));
它本身就是一个URL。尽管是javascript:
pseudo-URL,但您永远不应该使用它。它被解码为JavaScript命令:
validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2&s2p2=val3¶m3=val4')
此时您已经丢失了%26。现在,当您将其用作URL本身时,它将失败
通过将脚本移出到JavaScript块(或外部脚本)而不是HTML属性中,避免多个编码问题:
<a target="mainframe" class="validateme" href="/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3&param3=val4">Menu Item 1</a>
然后在验证函数中,只要返回
true
就可以了,如果一切正常并且您希望链接被跟踪,或者返回false
停止链接。URL中不应该有两个“?”,第二个“?”只是参数2的一部分,其值是servlet2?s2p1=val2%26s2p2=val3
,我已经检查过了。如果是这样的话,那么为什么在我进行上述更改之前,单击链接并检查Servlet1中param2的值会显示servlet2=s2p1=val2%26s2p2=val3
,并且s2p2
参数正确地通过servlet2?同样,如果我将鼠标悬停在链接上,状态栏中仍然会显示%26。这对我帮助很大!非常感谢。它已经在JavaScript中解码,因此函数中的decodeURIComponent(href)=href。感谢您对其发生原因的清晰解释-因为浏览器将其视为伪URL,单击时会对其进行解码。我不想在URL中使用javascript:但由于使用了第三方库来生成问题中所述的菜单,我认为除了向库提供调用该函数的更新链接之外,我没有其他方法可以做到这一点。你的例子向我展示了一个更好的方法。谢谢。谢谢你的解释,我也碰到了这个问题,我不知道发生了什么。请注意,双URL编码也可以工作(即%2526)
<a target="mainframe" href="javascript:validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3¶m3=val4')">Menu Item 1</a>
javascript:validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3¶m3=val4')
validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2&s2p2=val3¶m3=val4')
<a target="mainframe" class="validateme" href="/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3&param3=val4">Menu Item 1</a>
// find 'validateme' links and add event handler
//
for (var i= document.links; i-->0;)
if (document.links[i].className==='validateme')
document.links[i].onclick= validate;