Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么%26会被解码到&;当从链接作为参数传递给JavaScript函数时?_Javascript_Html - Fatal编程技术网

为什么%26会被解码到&;当从链接作为参数传递给JavaScript函数时?

为什么%26会被解码到&;当从链接作为参数传递给JavaScript函数时?,javascript,html,Javascript,Html,我们在out web应用程序中有一个菜单,它使用标记在主框架中加载页面 菜单中的典型项目如下所示: <a target="mainframe" href="/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3&param3=val4">Menu Item 1</a> 它是给予: /servlet1?param1=val1&parma2=servlet2?s2p1=val2**&**s2p2

我们在out web应用程序中有一个菜单,它使用
标记在主框架中加载页面

菜单中的典型项目如下所示:

<a target="mainframe" href="/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3&param3=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&param3=val4')
此时您已经丢失了%26。现在,当您将其用作URL本身时,它将失败

通过将脚本移出到JavaScript块(或外部脚本)而不是HTML属性中,避免多个编码问题:

<a target="mainframe" class="validateme" href="/servlet1?param1=val1&amp;parma2=servlet2?s2p1=val2%26s2p2=val3&amp;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&param3=val4')">Menu Item 1</a>
javascript:validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2%26s2p2=val3&param3=val4')
validate('/servlet1?param1=val1&parma2=servlet2?s2p1=val2&s2p2=val3&param3=val4')
<a target="mainframe" class="validateme" href="/servlet1?param1=val1&amp;parma2=servlet2?s2p1=val2%26s2p2=val3&amp;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;