我使用Java Server Faces, JQuery和JavaScript。我想我在火狐浏览器里发现了一个bug。下面的JavaScript代码被触发:
var list = jQuery('input.myclass');
var item = list.eq(0);
item.click();
top.location.reload(true);
点击将击中a4j:commandButton,它与我的操作方法'mybean.myaction()'相关。如果我用的是firefox19或firefox18,按钮可能会被点击。总之,页面的重新加载速度太快了。我可以通过在mybean.myaction()中设置eclipse断点来看到这一点——该断点从未被到达。
如果我使用的是firefox17, InternetExplorer就像预期的那样工作,Javascript被触发,点击发生,bean方法调整bean的状态,页面被重新加载。
提前感谢你给我一些想法,如何澄清这种行为的原因。如果合适的话,我会在Firefox bugzilla中提交一个bug。
更新:这是a4j:commandButton被JQuery点击;
<a4j:commandButton action="#{mybean.myaction}" value="setMyVal" styleClass="hidden myclass">
<a4j:actionparam name="myparamname" value="MY_VAL" assignTo="#{mybean.myattr}" /></a4j:commandButton>
UPDATE-2:我试着隔离问题。我在块周围放置了一个try-catch语句,而且我还替换了reload(),以便能够跟踪javascript的执行。现在,我可以看到,如果我输入top.location.host,我将跳转到catch块,但我的errorText是' undefined '。这是怎么发生的?我该怎么做,才能找到更多的例外呢?
try{ ...
item.click();
// Firefox-Bug in Version ab 18.0.1
var res = top.location.host; //top.location.reload(true);
} catch (e) {
var errorText = e.message; // errorText is undefined!
alert("Exception: " + errorText);
}
UPDATE-3:它变得越来越奇怪…如果我在item.click()和top.location.reload(true)之间设置firebug断点;一切都很顺利!因此,问题可能出在a4j上。也许今天放弃是明智的。感谢您一直以来的帮助!
这不是对问题的完全回答,而是对如何解决问题的一个建议。因此,您可以在操作完成后使用commandButton的oncomplete属性重新加载页面:
<a4j:commandButton action="#{mybean.myaction}" value="setMyVal" styleClass="hidden myclass" oncomplete="top.location.reload(true);">
<a4j:actionparam name="myparamname" value="MY_VAL" assignTo="#{mybean.myattr}" />
</a4j:commandButton>
这种方式序列化事件:首先调用操作,然后重新加载页面。当然,你需要从你的javascript代码中删除top.location.reload(true);
。
编辑:思考更多的问题…在我看来,这不是虫子。Firefox不需要在任何地方等待单击事件(在Richfaces的情况下是一个复杂的操作)在服务器上被处理。它将点击事件分派给Richfaces javascript,并继续执行下一个语句:top.location.reload(true);
。你需要防止这个问题。