0

ユーザーがデータを保存していない状態でページを離れようとした場合に警告するページがあります。このダイアログは、「保存されていないデータがあります。続行しますか?」という意味です。

ここに画像の説明を入力

問題は、ユーザーがリンクをクリックして先に進み、ダイアログが表示されると、フォームの値が空白になることです。ユーザーが実際に続行しないことを選択しても、フォームに入力されたものをそのままにしておくことができるように、その場に留まるように値を形成したいと考えています。

現在のコードは、フォームにダーティ データがあり、それが隠し変数であるかどうかを示すフラグを保持するようになっています。

<input type="hidden" name="saveStatus" value="<%=saveStatus%>" />

フォームに触れると、この隠し変数がonclickとで設定されますonkeypressed

サーバーには、データがダーティかどうかをチェックするロジックがあります。

public boolean returnToUnsavedData(ISessionHandler sessionHandler,
        Action action) {
    String saveStatus = sessionHandler.getRequestParameter("saveStatus");

    if (saveStatus != null && !saveStatus.trim().equals("")) {
        setHasUnsavedData(true);
    } else {
        setHasUnsavedData(false);
    }

    if (hasUnsavedData()) {
        if (!"menuHasUnsavedDataOk".equalsIgnoreCase(action
                .getActionCommand())
                && !action.getActionName().equals("Administrera")) {
            ResourceBundle messages = ResourceBundle.getBundle("messages");
            UserMessage um;
            if (action.getActionCommand().equals("fastsearch")) {

                um = new ExtendedUserMessage(
                        messages.getString("PV24"), UserMessage.TYPE_WARNING,
                        "Varning", action.getActionName(),
                        action.getActionCommand(), sessionHandler.getRequest().getParameter("fastsearch"));
            } else {
             um = new ExtendedUserMessage(
                    messages.getString("PV24"), UserMessage.TYPE_WARNING,
                    "Varning", action.getActionName(),
                    action.getActionCommand());
            }
            action.addUserMessage(um);
            action.setReturnPage(action.getCurrPage());
            setLatestActionTarget(action.getActionTarget());
            return true;
        } else {
            setHasUnsavedData(false);
        }
    }

    return false;
}

これは、サーバーサイドで変数をチェックしてすべてを再入力し、上記のような手法を隠し変数で使用してフォームの値を保持できる場所だと思います。

このアイデアはうまくいくと思いますか、それとも別の解決策を提示できますか?

4

1 に答える 1

1

ここではサーバー側の関与は必要ないと思います。次を使用するだけでこれを実現できますjavascript

<input type="hidden" id="saveStatus" name="saveStatus" value="<%= saveStatus %>"/>

ページがアンロードされる前にオブザーバーを登録しsaveStatus、そこで変数を確認します。

window.onbeforeunload = function() { 
    if (document.getElementById('saveStatus').value) {
        return 'You have unsaved changes, are you sure you want to leave the page?'); 
    }
};

ただし、これを使用すると、独自の「カスタム」確認画面が表示されず、ブラウザーの組み込みの確認が使用されます (stack-overflow と同様)。

于 2012-10-03T09:24:11.073 に答える