2

複数の異なるキーワードでオンラインで検索した後、問題の解決策を見つけることができませんでした。

キャンセルする1分前にセッションを更新するようにユーザーに求めるメッセージをポップアップする方法を探すことから始めました。私が使用することにした解決策は、マスターページでjavascriptタイマーを実行し、Masterpage.Page_Load()で呼び出されるようにすることでした。このようにして、ユーザーがページ間を移動するたびに、タイマーがリセットされます。ただし、ユーザーが使用するページの多くにはupdatepanelがあり、非同期で更新されるため、使用している関数に到達していますが、スキップされています(デバッガーによると)。

私が使用している関数は次のとおりです。

ScriptManager.RegisterStartupScript(main, this.GetType(), "callTimer", "callTimer();", true);

この関数は、通常のポストバック、またはマスターページの非同期ポストバック(マスターページの更新パネルでポストバックを実行してタイマーを更新します)では正常に実行されますが、非同期ポストバックではスキップされます。

マスターページの関数PageまたはUpdatePanel、または子ページのupdatepanelを制御するために、いくつかのことを試しました。このコードを子ページにも入れてみましたが、これらの変更によってタイマーがリセットされますが、javascriptcodeが複数回実行され、カウントダウンを表示するラベルをめぐって争います。

私はここで本当に途方に暮れています。考えられる解決策は、startupscriptのコントロールを変更し、そのコードの前に実行されているすべてのjavascriptを再度終了することだと思います。ただし、JavaScript関数をプログラムで終了、キャンセル、または停止する方法を検索しても、有用な結果は得られません。

もう1つの解決策は、マウスの動きでタイマーをリセットすることですが、IE8用に設計しているため、ウィンドウの焦点が合っていない限り、これは機能しません。

4

2 に答える 2

0

問題の解決策を見つけました。現在の date.time を数値として JavaScript 関数に送信することで、これを解決できました。そこから、カウントダウン ラベルの値を date.time に設定します。そこで、タイマー中に、ラベルの date.time が関数が開始されたものと一致しないことがわかった場合、関数は返されて関数を終了します。これは、関数の最新のインスタンスのみが常に実行され続けることを意味していました。

于 2012-12-17T20:47:21.977 に答える
0

ScriptManager部分的なポストバックの場合は、スクリプトを挿入する必要があります。そうしないと、再実行されません。インジェクション ロジックを処理するためのユーティリティ関数 (vb.net) を次に示します。

Public Shared Sub InjectScript(ByVal containingPage As Page, ByVal scriptKey As String, ByVal scriptText As String)
    Dim sManager = ScriptManager.GetCurrent(containingPage)

    If sManager IsNot Nothing AndAlso sManager.IsInAsyncPostBack Then
        //the page is being partially-posted back by an Ajax control (e.g. UpdatePanel)
         ScriptManager.RegisterStartupScript(containingPage, GetType(Page), scriptKey, scriptText, True)
    Else
        //standard postback
        containingPage.ClientScript.RegisterStartupScript(GetType(Page), scriptKey, scriptText, True)
    End If
End Sub
于 2012-12-14T16:45:13.193 に答える