0

私はJavaServerFaces、JQuery、JavaScriptを使用しています。Firefoxでバグを検出したと思います。このJavaScriptコードがトリガーされます:

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

クリックすると、アクションメソッド'mybean.myaction()'に関連するa4j:commandButtonがヒットします。Firefox19またはFirefox18を使用している場合は、ボタンがクリックされる可能性があります。とにかく、ページのリロードが速すぎます。これは、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-statementを配置し、さらにjavascript-executionに従うことができるreload()を置き換えました。これで、top.location.hostと入力すると、catch-blockにジャンプすることがわかりますが、errorTextは「undefinded」です。これはどのように起こりますか?この例外の詳細を調べるには、何をする必要がありますか?

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コードから削除する必要があります。

編集:問題についてもっと考えて...そしてそれは私にはバグではないようです。クリックイベント(Richfacesの場合は複雑な操作)がサーバーで処理されるまで、Firefoxを待つ必要はありません。クリックイベントをRichfacesjavascriptにディスパッチし、次のステートメントに進みますtop.location.reload(true);。この問題を防ぐ必要があります。

于 2013-03-12T17:26:35.310 に答える