早上好,
星期一早上,我很难理解为什么后续行在IE中工作而不在FF中。
<a class="button" href="#" onclick="setMaintenanceMode(false);">disable</a>
在IE和FF中,当您将鼠标悬停在按钮上时,网址为...
http://localhost:8080/mainapp/secure/gotoDevice.action?hardwareId=1&storeCode=2571#
单击该按钮时,将调用以下方法...
function setMaintenanceMode(enabled) {
var url = '<s:url action="secure/setMaintenanceMode"/>' + '&ModeEnabled=' + enabled;
document.location.href = url;
}
发送docuement的URL是(在两个浏览器中)......
/mainapp/secure/gotoDevice.action?hardwareId=1&storeCode=2571&ModeEnabled=false
问题是在IE中调用了struts动作'setSetCode()'的方法,但是从FF开始就不行了!如果我删除了以上FF的哈希值,但是IE没有(href =“#”)。
我尝试将'&ModeEnabled='
更改为'&ModeEnabled='
,但没有成功。
我看过google和struts论坛,但没有成功。
我很想撕掉所有的ahref,然后用Dojo按钮替换它们,看看它是否有效,但在我做之前,我只是想知道是否有人能说明原因。
我的猜测是使用ahref是错误的,但为什么呢?
如果有人能帮助我理解为什么会受到赞赏。
由于 杰夫波特
编辑:返回false是解决方案的一部分。问题似乎是网址..
/mainApp/secure/setMaintenanceMode.action?hardwareId=5&storeCode=2571&ModeEnabled=true
里面有&
,如果按原样转到这个url,那么它可以在IE中运行,但不能在FF中运行。
如果我将两者都更改为&
,那么它可以在IE&amp; FF。
如果我将两者都更改为&
,那么它仍然适用于IE但不适用于FF。
有什么想法吗?
注意:
似乎struts 2.0.9不支持escapeAmp
标记上的属性<s:url
:
默认情况下,请求参数将使用转义的&符号(即
&
)分隔。这对于XHTML合规性是必要的,但是,当使用此标记生成的带有<s:property>
标记的网址时,应使用escapeAmp
属性来禁用&符号转义。
灵魂:return false
on on on on on and and and and new new struts + set escapeAmp
param。
否则,url = url.replace("&", "&");
。
答案 0 :(得分:2)
尝试从javascript方法返回false
function setMaintenanceMode(enabled) {
var url = '<s:url action="secure/setMaintenanceMode"/>' + '&ModeEnabled=' + enabled;
document.location.href = url;
return false;
}
<a class="button" href="#" onclick="return setMaintenanceMode(false);">disable</a>
这应该会阻止javascript onclick事件到达浏览器。
答案 1 :(得分:2)
onclick="setMaintenanceMode(false); return false;"
onclick工作正常,但href也会立即执行。您需要从单击处理程序返回false以表示不应该遵循href。
IE可能会猜到你的意思,做错了。答案 2 :(得分:0)
网址中包含
&
,如果按原样转到此网址,则可以在IE中使用,但不能在FF中使用。
我对此表示怀疑 - 它也不应该奏效。它不依赖于浏览器,而是依赖于服务器。
字符串a=b&c=d
由服务器框架拆分为参数。 Servlet要求仅&
用于分隔参数,因此它将返回a
= b
和amp;c
= d
。后一个参数显然不会被期望c
的应用程序识别。
出于各种原因的HTML规范强烈建议允许;
作为分隔符,在这种情况下,您将获得a=b
,一个没有等号的流浪amp
毫无意义,被丢弃,c=d
。因此,尽管&符号编码错误,它仍然可以工作。不幸的是,Servlet忽略了这个建议。
亲爱的,亲爱的!多么的不幸。在将参数连接到URL时,不应该转义&符号。如果需要将完成的URL放入文本内容的属性值,则只需将参数与单个&符号连接,然后然后,对整个URL进行HTML编码。 Struts的默认行为在这里完全错误。默认情况下,请求参数将使用转义的&符号(即
&
)分隔。
在您的情况下,您没有将URL输出到属性值或文本内容,而是将其写入脚本块中的字符串文字:
var url = '<s:url action="secure/setMaintenanceMode"/>' + '&ModeEnabled=' + enabled;
在旧式HTML的脚本块中,HTML-escaping不适用。 (在原生XML的XHTML中它确实如此,但我们暂不考虑它。)
但是,您仍然需要考虑JavaScript转义。例如,如果setMaintenanceMode链接中有撇号怎么办?它会破坏字符串。或者,如果你在某个字符串中有一个</
序列,它就会破坏整个脚本块。
你真正想要做的是创建URL(没有任何&符号转义),然后在其上使用JavaScript字符串文字反斜杠转义。最好的方法是使用一个现有的JSON编码器,它将任何Java值转换为JavaScript文字,如果它是一个字符串,也会为你提供周围的引号。您也可以在大多数JSON编码器上告诉它JS转义<
和&
字符,这意味着如果您决定在将来将该页面作为XML提供服务,则不必担心XHTML解析。 / p>
我很想撕掉所有的ahref并用按钮替换它们
当然,如果你点击的东西不是指向另一个位置的链接,而只是通过脚本对页面做了一些事情,那么这不是一个真正的链接,你会更好地标记它最新为<button>
或<input type="button">
,并使用CSS重新设置,如果您不想要它,则不要看起来像按钮。
然而(再次),这一切似乎都毫无意义,因为此时您正在用行为替换链接的行为,这种行为就像链接一样不灵活。简单的问题是什么??
<a href="/mainApp/secure/setMaintenanceMode.action?hardwareId=5&storeCode=2571&ModeEnabled=false">disable</a>