1

Dojo プラグインで Struts 2.1.6 を使用しています。アプリ全体に ajax リンク (sx:a) があります。

戻るボタンの機能と特定のコンテンツへのリンクの実装に成功した人はいますか?

誰も実装方法の経験がありますか? 私は(まだ良い解決策がない場合)次のようなものを実装する予定です:

  • js を使用してアドレス バー リンクを変更 (パラメータを追加) すると、適切なコンテンツを読み取って取得し、notifyTopics で公開できます。

それとも、jQuery プラグインを使用するようにアプリ全体を変更する必要がありますか? jQueryには、戻るボタンとajaxページへのリンクに対する適切なソリューションがありますか?

4

4 に答える 4

1

Dojo で Struts 2 を使用して、戻るボタンを実装しようとしました。あなたはすでに Struts 2 の ajax 実装をはるかに超えています。彼らは主にシンプルで迅速な ajax 関数呼び出しを記述するためにそれを使用および作成しましたが、より広範な用途にはあまり適していません。さらに、 s:head theme='ajax' tag; を実行すると、struts は、必要な「可能性がある」すべての ajax js ファイルをインポートするため、読み込み時間が長くなります。

1. dojo を学び、struts とは独立したライブラリーを使用する 2. または 2. jQuery を入手して、比較的単純な戻るボタン機能を実装することができました (struts 2 theme='ajax' よりもそうです)。

于 2009-12-08T15:30:40.447 に答える
1

頭のてっぺんから2つの簡単な方法を考えることができます:

<s:form action="actionName">
    <input type="hidden" value="<s:property value="someProperty"/>" name="someProperty"/>
    <input type="hidden" value="<s:property value="someProperty2"/>" name="someProperty2"/>
    <s:submit value="Back" />
</s:form>

また

<s:url name="backURL" action="actionName">
    <s:param name="someProperty" value="someProperty"/>
    <s:param name="someProperty2" value="someProperty2"/>
</s:url>
<a href="<s:property value="#backURL"/>">Back</a>

クエリ文字列パラメーターが既にある場合:

<a href="#" onclick="javascript.window=document.referrer;">Back</a>

また

<input type="button" value="Back" onclick="javascript.window=document.referrer;"/>
于 2009-12-08T15:11:15.237 に答える
0

すべてのリンクは、パラメータ menuId (もちろん、表示する必要があるメニューの ID) を探す 1 つのアクションを通過します。

このアクションから、応答を返す前に、1 つの JavaScript 関数を呼び出すように設定しました。

setBackMenuId(menuId,sometext) 

MenuId は ID であり、sometext はそのメニューの名前であるため、ブラウザのログ履歴が改善されます。

function setBackMenuId(id,subtekst) {
 window.location.hash = "menuId="+id;
 document.title = subtekst;
 selectedHash = document.location.hash;
 if(intervalHashSearch == '') {
    initializeHashSearch();
 } 
}

次に、他の必要な js 関数:

function publishLinkTarget() {
    var param = window.location.hash;
    if(param) {
        if(param.indexOf("menuId") > 0) {
            var id = param.split("=", 2);
            if(id[1]) {
                setCookie('backMenuId',id[1],1,false);
                setTimeout('publishLayoutContent()', 100);
            }
        }
    }
}

var selectedHash = '';
var intervalHashSearch = '';
function initializeHashSearch() {
    intervalHashSearch = window.setInterval('checkHash()', 500);
}

function stopHashSearch() {
    window.clearInterval(intervalHashSearch);
    intervalHashSearch = '';
}

function checkHash() {
    var currentHash = document.location.hash;
    if(selectedHash != currentHash) {
        selectedHash = currentHash;
        publishLinkTarget();
    }
}

function publishLayoutContent() {
    dojo.event.topic.publish("layoutContentTarget");
}

見てみると、まず「setBackMenuId」という名前で、アドレスバーにハッシュとパラメータを追加してタイトルを変更し、このハッシュを記憶しているので、区間ハッシュ検索で違いがわかります。次に、このハッシュ検索を初期化します。

「checkHash」は 500 ミリ秒ごとに実行され、ハッシュが変更されたかどうかをチェックしています (つまり、戻るボタンが押され、新しいリンクがクリックされたわけではありません (setBackMenuId が selectedHash を設定します)。true の場合 (戻る/進むボタンが押された) 関数publishLinkTarget' が呼び出され、ハッシュからパラメーターが読み取られ、問題がなければ、まず Cookie を設定して、HttpServletRequest から読み取って、どのメニュー ID リンクのメニュー ID かを調べることができます。 「publishLayoutContent」で作成したコンテンツも公開する必要があります。

アクション クラス (これは MenuAction、メソッド ビューであり、 で公開されているものと同じです) では、これだけが重要です。

    Integer menuId = null;
    if(request.getParameter("menuId") != null) {
        menuId = Integer.valueOf(request.getParameter("menuId"));
    } else {
        menuId = getIntCookie("hiddenMenuId");
    } 

そのため、パラメーターからメニュー ID を取得しない場合 (リンクをクリック)、Cookie (戻る/進むボタン) から取得します。

そして、このターゲットを持つ JSP:

<s:url var="layoutContentUrl" action="Menu-view" namespace="/public" />
    <sx:div showLoadingText="false" indicator="ajaxIndicator"
        id="layout-content" href="%{layoutContentUrl}" theme="ajax"
        listenTopics="layoutContentTarget" preload="false"
                    afterNotifyTopics="/ajaxAfter">
</sx:div>

注: これは、すべてが 1 つのパラメーターを介して接続されている場合の特殊なケースですが、他のターゲットを発行する他のパラメーターを使用して簡単に拡張できます。私はそれをどこかで公開するのに十分な一般的なものにしようとしますが、これは(私が推測する)長い道のりです:)

ご不明な点がございましたら、投稿してください。

于 2009-12-15T12:48:20.880 に答える