web-dev-qa-db-ja.com

onclientclickがfalseのときにonclickの起動を停止しますか?

ボタンのonclientclickプロパティを使用して、クライアント側のチェックを行うことは可能ですか?チェックがtrueを返す場合、onclickイベントを発生させます。クライアント側のチェックがfalseを返す場合、onclickイベントを発生させないでください。

それは可能ですか?

更新:

これら2つの機能:

Stops the form from submitting:
OnClientClick="return false;"

Allows the form to submit:
OnClientClick="return true;"

次の2つは機能しません。

// in js script tag
function mycheck() {
    return false;
}

// in asp:button tag
OnClientClick="return mycheck();"

// in js script tag
function mycheck() {
    return true;
}

// in asp:button tag
OnClientClick="return mycheck();"

フォームを2回送信します。

何故ですか?

25
oshirowanen

関数が呼び出された後、OnClientClick内にreturnを追加します。それ以外の場合、関数がfalseを返してもボタンはポストバックします。

<asp:button ID="Button1" runat="server" OnClick="Button1_Click" 
    OnClientClick="return checkValidation()" Text="Submit" />

<script type="text/javascript">
    function checkValidation() {
        return confirm('Everything ok?');
    }
</script>
42
Win

確かに。 OnClientClick内でreturn falseを使用すると、ナビゲーションができなくなります。したがって、コードは次のようになります。

<asp:LinkButton runat="server" OnClientClick="if(!ValidatePage()) { return false;}" />
7
Steven V

はい、できます。onclientClick関数呼び出しでpreventDefault()を使用します

function onclientClickFun(e)
{
  if(!IsValidationSuccess)
 {
   e.preventDefault();
 }

}

[〜#〜] or [〜#〜]

function onclientClickFun(e)
{
  if(!IsValidationSuccess)
 {
   return false;
 }

}
2
Subin Jacob

サーバーページでボタンを作成

var button1 = new Button();  
button1.ServerClick += new EventHandler(button1_ServerClick);
button1.OnClientClick = SetJsForSaveBtn();
button1.Attributes.Add("UseSubmitBehavior", "false");
panel.Controls.Add(button1 );

//サーバーコードを含む

private void saveBtn_ServerClick(object sender, EventArgs e)
{
   //do something if ClientClick returns true
}

//ページのJSコードを含む

LiteralControl js = new LiteralControl();
panel.Controls.Add(js);
js.Text =@"<script type='text/javascript'> 
$(document).ready(function(){
 function CheckValidationOnClient(){
   if(!ValidatePage()){
    return false;
   }
   else{
    return true;
   }
 };
});
</script>   ";

private string SetJsForSaveBtn()
{
  var jsfunc = @" return CheckValidationOnClient()";
  return jsfunc ;
}
1
chri3g91

私もこの問題に出会いました。すべてのリンクボタンにOnClientClick = return falseを設定する必要はありませんでした。シンプルなページでは、アンカーを使用するのが簡単で、aspがhrefを埋めるのを避けることができます。

ただし、これは常に可能とは限りません。したがって、単純な結論は、LinkBut​​tonを継承し、AutoPostBackのような変数を追加することです。 falseの場合、出力をhtmlでオーバーライドするか、OnClientClickを追加するだけです。インラインタグはあまり好きではありません。

namespace My.WebControls {
    [ToolboxData("<{0}:LinkButton runat=server ID=btn></{0}:LinkButton>"), ParseChildren(true), ToolboxItem(true)]
    public class LinkButton : System.Web.UI.WebControls.LinkButton {

         private bool _postback = true;
         [Bindable(true), Category("Behavior"), DefaultValue(true), Description("Gets or Sets the postback click behavior")]
         public bool AutoPostBack { get { return _postback; } set { _postback = value; } }


         protected override void Render(System.Web.UI.HtmlTextWriter writer) {
             if(!AutoPostBack){
                 this.OnClientClick = "return false";
             }
             base.Render(writer);
         }
    }
}

多くの属性をViewStateで処理する必要がありますが、この場合、私たちは良いと思います。

1
Mike