0

我正在使用 Java Server Faces、JQuery 和 JavaScript。我想我在 Firefox 中检测到了一个错误。此 JavaScript 代码被触发:

var list = jQuery('input.myclass');
var item = list.eq(0);
item.click();
top.location.reload(true);

单击将点击与我的操作方法“mybean.myaction()”相关的 a4j:commandButton。如果我使用的是 Firefox 19 或 Firefox 18,则可能会单击该按钮。无论如何,页面的重新加载发生得太快了。我可以通过在 mybean.myaction() 中设置一个 Eclipse 断点来看到这一点——断点永远不会到达。

如果我使用的是 Firefox 17,InternetExplorer 一切都像预期的那样工作,Javascript 被触发,点击发生,bean-method 调整 bean 的状态并重新加载页面。

提前感谢您给我一些想法如何澄清这种行为的原因。如果合适,我将在 Firefox bugzilla 中提交一个错误。

更新:这是被 JQuery 点击的 a4j:commandButton;

<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-block,但我的 errorText 是“未定义”。这怎么可能发生?我该怎么做才能找到更多关于这个异常的信息?

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-Breakpoint; 一切顺利!因此,问题可能出在 a4j 上。也许今天退出是明智之举。感谢您迄今为止的所有帮助!

4

1 回答 1

2

这不是问题的答案,而是关于如何解决问题的建议。因此,您可以在操作完成后使用 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>

这样您就可以序列化事件:首先调用该操作,并且仅在重新加载页面之后。当然,您需要top.location.reload(true);从您的 javascript 代码中删除。

编辑:更多地思考这个问题......在我看来这不是一个错误。Firefox 不需要在任何地方等待服务器上处理您的点击事件(对于 Richfaces 来说是一个复杂的操作)。它将 click 事件分派给 Richfaces javascript 并继续执行下一条语句:top.location.reload(true);. 你需要防止这个问题。

于 2013-03-12T17:26:35.310 回答