firefox一个href#符号导致setter不被调用

时间:2010-01-18 09:37:16

标签: java javascript internet-explorer firefox struts2

早上好,

星期一早上,我很难理解为什么后续行在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&amp;storeCode=2571&ModeEnabled=false

问题是在IE中调用了struts动作'setSetCode()'的方法,但是从FF开始就不行了!如果我删除了以上FF的哈希值,但是IE没有(href =“#”)。

我尝试将'&ModeEnabled='更改为'&amp;ModeEnabled=',但没有成功。 我看过google和struts论坛,但没有成功。

我很想撕掉所有的ahref,然后用Dojo按钮替换它们,看看它是否有效,但在我做之前,我只是想知道是否有人能说明原因。

我的猜测是使用ahref是错误的,但为什么呢?

如果有人能帮助我理解为什么会受到赞赏。

由于 杰夫波特

编辑:返回false是解决方案的一部分。问题似乎是网址..

/mainApp/secure/setMaintenanceMode.action?hardwareId=5&amp;storeCode=2571&ModeEnabled=true

里面有&amp;,如果按原样转到这个url,那么它可以在IE中运行,但不能在FF中运行。

如果我将两者都更改为&,那么它可以在IE&amp; FF。

如果我将两者都更改为&amp;,那么它仍然适用于IE但不适用于FF。

有什么想法吗?

注意:

似乎struts 2.0.9不支持escapeAmp标记上的属性<s:url

  

默认情况下,请求参数将使用转义的&符号(即&amp;)分隔。这对于XHTML合规性是必要的,但是,当使用此标记生成的带有<s:property>标记的网址时,应使用escapeAmp属性来禁用&符号转义。

灵魂:return false on on on on on and and and and new new struts + set escapeAmp param。 否则,url = url.replace("&amp;", "&");

3 个答案:

答案 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)

  

网址中包含&amp;,如果按原样转到此网址,则可以在IE中使用,但不能在FF中使用。

我对此表示怀疑 - 它也不应该奏效。它不依赖于浏览器,而是依赖于服务器。

字符串a=b&amp;c=d由服务器框架拆分为参数。 Servlet要求仅&用于分隔参数,因此它将返回a = bamp;c = d。后一个参数显然不会被期望c的应用程序识别。

出于各种原因的HTML规范强烈建议允许;作为分隔符,在这种情况下,您将获得a=b,一个没有等号的流浪amp毫无意义,被丢弃,c=d。因此,尽管&符号编码错误,它仍然可以工作。不幸的是,Servlet忽略了这个建议。

  

默认情况下,请求参数将使用转义的&符号(即&amp;)分隔。

亲爱的,亲爱的!多么的不幸。在将参数连接到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&amp;storeCode=2571&amp;ModeEnabled=false">disable</a>