web-dev-qa-db-ja.com

OnclientClickとOnClickが同時に機能していませんか?

次のようなボタンがあります

<asp:Button ID="pagerLeftButton" runat="server" OnClientClick="disable(this)" onclick="pager_Left_Click" Text="<" />

そのようなボタンを使用すると、onclickが起動しません。 OnClientClickを削除すると、onclickが発生します。

私がする必要があるのは、ポストバック中にボタンを無効にし、ポストバックが終了した後に有効にすることです。

編集:追加情報:

起動関数にブレークポイントを追加しました。c#部分であり、デバッグ中です。それらは確実に起動しません。これらの機能は

protected void pager_Left_Click(object sender, EventArgs e)
{
//Do smthing.
}
protected void pager_Right_Click(object sender, EventArgs e)
{
//Do smthing.
}

ボタンをクリックすると、1〜2秒間無効になり、自動的に有効になりますが、なぜ有効になっているのかわかりません。再度有効にするための部分は追加しませんでした。

53
stckvrflw

これから web.archive.orgの記事

秘Theは、ボタンコントロールのOnClientClickおよびUseSubmitBehaviorプロパティを使用することです。属性を追加するためにサーバー側のコードを使用する他の方法がありますが、この方法でそれを行う単純さがはるかに魅力的だと思います:

<asp:Button runat="server" ID="BtnSubmit"  OnClientClick="this.disabled = true; this.value = 'Submitting...';"   UseSubmitBehavior="false"  OnClick="BtnSubmit_Click"  Text="Submit Me!" />

OnClientClickを使用すると、クライアント側のOnClickスクリプトを追加できます。この場合、JavaScriptはボタン要素を無効にし、そのテキスト値を進行メッセージに変更します。ポストバックが完了すると、新しくレンダリングされたページは、追加の作業なしでボタンを元の状態に戻します。

クライアント側で送信ボタンを無効にすると、ブラウザの送信がキャンセルされ、ポストバックがキャンセルされるという落とし穴があります。 UseSubmitBehaviorプロパティをfalseに設定すると、ブラウザーのフォーム送信動作に依存するのではなく、ポストバックを起動するために必要なクライアントスクリプトを挿入するように.NETに指示します。この場合、挿入するコードは次のようになります。

__doPostBack('BtnSubmit','')

これは、OnClientClickコードの最後に追加され、このレンダリングされたHTMLを提供します。

<input type="button" name="BtnSubmit"  onclick="this.disabled = true; this.value ='Submitting...';__doPostBack('BtnSubmit','')"  value="Submit Me!" id="BtnSubmit" />

これにより、ポストバックが完了している間、ニースボタンが無効になり、テキストが処理されます。

97
Vinay Pandey

OnClientClickは、OnClickと共に使用すると非常にうるさいようです。

次の使用例で失敗しました:

OnClientClick="return ValidateSearch();" 
OnClientClick="if(ValidateSearch()) return true;"
OnClientClick="ValidateSearch();"

しかし、動作しませんでした。以下は動作しました:

<asp:Button ID="keywordSearch" runat="server" Text="Search" TabIndex="1" 
  OnClick="keywordSearch_Click" 
  OnClientClick="if (!ValidateSearch()) { return false;};" />
12
Gaʀʀʏ

Vinay(上記)は効果的な回避策を提供しました。 実際にボタンのOnClickイベントが機能しない原因 OnClientClickイベント関数に続いて、MSが定義し、ボタンが無効になると(OnClientClickイベントによって呼び出される関数で)、ボタン「honorsこれは、OnClickイベントの定義済みメソッドを呼び出してボタンのアクティビティを完了しようとしないことによります。

私はこれを理解しようとして数時間苦労しました。 OnClientClick関数内にある送信ボタンを無効にするステートメントを削除すると、OnClickメソッドは問題なく呼び出されました。

Microsoft、リスニングしている場合ボタンをクリックすると、このアクティビティの途中で無効になっている場合でも、割り当てられたアクティビティを完了する必要があります。クリックしても無効になっていない限り、割り当てられたすべてのメソッドを完了する必要があります。

6
Patrick

ここには2つの問題があります。

クライアント側のボタンを無効にすると、ポストバックが防止されます

これを克服するには、JavaScript onclickイベントのボタンafterを無効にします。これを行う簡単な方法は、 this answer で示唆されているようにsetTimeoutを使用することです。

また、ASP.NET検証が失敗してもOnClientClickコードが実行されるため、Page_IsValidのチェックを追加することをお勧めします。これにより、検証が失敗してもボタンが無効になりません。

OnClientClick="(function(button) { setTimeout(function () { if (Page_IsValid) button.disabled = true; }, 0); })(this);"

質問が示すように、このJavaScriptコードのすべてを独自の関数に入れるとすてきです。

OnClientClick="disable(this);"

function disable(button) {
    setTimeout(function () {
        if (Page_IsValid)
            button.disabled = true;
    }, 0);
}

クライアント側でボタンを無効にしても、サーバー側では無効になりません

これを克服するには、サーバー側のボタンを無効にします。たとえば、OnClickイベントハンドラーでは:

OnClick="Button1_Click"

protected void Button1_Click(object sender, EventArgs e)
{
    ((Button)sender).Enabled = false;
}

最後に、重複するボタンの押下を防止しても、2人の異なるユーザーが同じデータを同時に送信することを防止できないことに注意してください。サーバー側でそのことを確認してください。

6
Sam

ボタンをすぐに無効に設定せずに、setTimeoutで遅延させるとどうなりますか? 「無効化」機能が戻り、送信が続行されます。

2
Hans Kesting

このページですべてを破損する可能性のある他のスクリプトを実行していない限り、JavaScriptは正常です。これは Firebug を使用して確認できます。

私は今少しテストしましたが、ASP.netは無効なコントロールを無視しているようです。基本的にポストバックが発行されますが、おそらく無効なボタンはポストバックを発生させることができないと想定しているため、フレームワークはそのようなイベントを無視します。これは私の個人的な理由に過ぎません。Reflectorを使用して、これをより詳細に確認できます。

解決策として、後で無効にすることを実際に試みることができます。基本的に、control.disabled = "disabled" JavaTimerまたはその他の機能を使用して呼び出します。この方法では、JavaScript関数によってコントロールが無効にされる前に、サーバーへの最初のポストバックが発行されます。これをテストしませんでしたが、動作する可能性があります

1
Juri

関数UpdateClick(btn){

    for (i = 0; i < Page_Validators.length; i++) {

        ValidatorValidate(Page_Validators[i]);

        if (Page_Validators[i].isvalid == false)

            return false;
    }

    btn.disabled = 'false';

    btn.value = 'Please Wait...';

    return true;
}
0
user3783446