16

編集:

一部の人々は、フォーム上で直接 submit を呼び出すことを提案しています。これは私が達成しようとしているものではありません。具体的には、input type='submit' で click() イベントを呼び出して、通常どおりにフォームを送信できるようにしたいと考えています。jQuery UI ダイアログは、この通常の動作を妨げているようです。私が作成した jsFiddle リンクを確認してください。問題はそこで再現可能です。


(まず、StackOverflow でこの質問を既に見ましたが、私の状況では答えが機能しません: jQuery UI Dialog with ASP.NET ボタン ポストバック)

望ましい動作:

私のページには、非表示フィールドと送信ボタン (CSS で非表示) の両方があります。

私がやりたいことは、JavaScript を使用してプログラムでこのボタンをクリックし、フォームを送信することです。最も重要なのは.... jQuery UIダイアログ内からこれらすべてをトリガーしたいです。基本的に、ユーザーは jQuery UI ダイアログ内で選択を行い、ページ全体が送信されてリロードされます。

問題文

このようにボタンのクリックをトリガーすると、通常はフォームを送信するのに問題なく動作します。ただし、アクションが jQuery UI ダイアログ内からトリガーされると失敗します。

jsFiddle コードでわかるように、送信ボタンで jQuery の click() 関数を呼び出しますが、フォームは実際には送信されません! ボタンは確かに JavaScript によってクリックされますが、「フォーム送信動作」自体は発生しません。ページは掲載されていません。

jQuery UI ダイアログが、プログラムでクリックしようとしているボタンのフォーム送信動作に干渉していると思います。

ボタンのクリックをプログラムでトリガーしたい理由:

ダイアログ内にあるボタンを送信ボタン自体にすることはできません。私の場合、jQuery UI ダイアログをラップする再利用可能な JavaScript コントロールを作成しました。この JS コントロールにより、ユーザーは従業員を選択できます。ただし、従業員が選ばれたとき、望ましい動作が必ずしもフォーム送信になるとは限りません。(選択した従業員をページに表示し、まだ送信を実行したくない場合があります。)

追加の詳細:

この問題は ASP.NET に固有のものではありませんが、私がこれを試みている理由を説明するのに役立つ追加の詳細をいくつか示します。.NET 4.5 を使用して ASP.NET Web フォーム アプリを作成しています。ページで JavaScript をますます使用するようになりましたが、この特定のページでは、サーバーへの実際のポストバックをトリガーして、ASP.NET ページのライフ サイクルからボタン クリック イベントを処理し、GridView にデータを設定できるようにしたいと考えています。そのため、JavaScript を使用して asp:button をクリックし、フォーム送信を実行できるようにしたいと考えています。

そして最も重要なことは...自分で試してみてください-->以下のjsFiddleリンクを参照してください.....

繰り返しますが、これは ASP.NET に固有の問題ではありません。通常の HTML と jQuery UI を使用して、JsFiddle で同じ問題を再現できました。JsFiddle リンクは次のとおりです。

http://jsfiddle.net/fENyZ/18/

コードでわかるように、jQuery DOM 操作を介してフォーム内で jQuery UI ダイアログを移動する「修正」を使用しようとしました。これは問題を解決していないようです。

ありがとう!どんな助けにも感謝します!

HTML

<html>
<head></head>
<body>

    <form action="http://www.google.com/index.html" method="post">

        <input type="button" value="Open jQuery dialog" id="btnOpenDialog" />
        <br /><br /><br />

        The button below submits the form correctly if you click it.<br />
        However, when I try to trigger click() event on this button <u>from within the jQuery UI Dialog above</u> then the form <b>fails to be submitted.
        </b><br />

        <input type="submit" value="Submit Form" id="btnSubmitForm" />  
        <input type="hidden" id="hdnEmployeeChosen" value="" />            
    </form>    


    <div id="divPopup" class="dialogClass" style="display: none;">
        Picking an employee below <b>ought to</b> cause the form to submit, but sadly it does not...
        <br /><br />

        <div class="divOptions">
            <input type="button" value="Pick" class="pickButton" employeeName="Weird Al" />
            Weird Al Yankovic
        </div>
        <div class="divOptions">            
            <input type="button" value="Pick" class="pickButton" employeeName="Dracula" />
            Count Dracula
        </div>
        <div class="divOptions">          
            <input type="button" value="Pick" class="pickButton" employeeName="David" />
            David Copperfield
        </div>        
    </div>

</body>

JavaScript

$(document).ready(function ()
{
    var jqueryDialog = $('#divPopup')
                .dialog({
                    autoOpen: false,
                    modal: true,
                    title: 'My Dialog',
                    width: 300,
                    height: 300,
                    draggable: false,
                    resizable: false
                });

    // This "fix" does not appear to help matters..........
    jqueryDialog.parent().appendTo($("form:first"));

    $('#btnOpenDialog').click(function () {
        jqueryDialog.dialog('open');    
    });    

    $('.pickButton').click(function () {

        // Put picked value into hidden field
        var pickedEmployee = $(this).attr('employeeName');
        $('#hdnEmployeeChosen').val(pickedEmployee);

        // Try to cause a submit (ASP.NET postback in my case)        
        // THIS PART DOES NOT WORK.................
        $('#btnSubmitForm').click();

        //alert($('#hdnEmployeeChosen').val());
    });    

});

CSS

form {
margin: 5px;
    border: 1px solid black;
    background-color: #EEE;
    padding: 15px 5px;
}

.dialogClass {
 border: 1px solid black;
padding: 5px;
margin: 5px;
    background-color: LightBlue;
    font-size: 14px;
}

.pickButton {
  margin-right: 5px;   
}

.divOptions {
   margin-bottom: 3px;   
}
4

13 に答える 13

4

私は同じ問題を抱えていましたが、次の一連の提案が役に立ちました。

  1. ダイアログをフォームに追加する$(this).parent().appendTo("form:first");
  2. openダイアログのオプション内でダイアログをフォームに追加します

功績は、Homamと別の質問に対する彼のコメントにあります。

以下の JavaScript を参照してください

    var jqueryDialog = $('#divPopup')
        .dialog({
            autoOpen: false,
            modal: true,
            title: 'My Dialog',
            width: 300,
            height: 300,
            draggable: false,
            resizable: false,
            open: function() {
                $(this).parent().appendTo('form:first');
            }
        });
于 2015-02-10T17:18:54.390 に答える
2

LouD が述べたように、修正は、ボタンを「クリック」する前にダイアログを閉じることです。これで何かが修正される理由については、JQuery UI ソースを掘り下げる必要があります。バージョン 1.8.9 には、モーダル オーバーレイ用の次のコードがあります。

events: c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","), function (a) {
    return a + ".dialog-overlay"
}).join(" "),

...

c(document).bind(c.ui.dialog.overlay.events, function (d) {
    if (c(d.target).zIndex() < c.ui.dialog.overlay.maxZ) return false
})

preventDefault()その「下」の要素のすべての入力イベントに対してfalse (基本的に) を返します。ユーザーが「オーバー」してクリックするのを防ぐのは、巨大な div だけではありません。また、ユーザーまたは JS が生成したかどうかに関係なく、すべての入力イベントを手動でブロックしています。

モーダル ダイアログを閉じるとオーバーレイが破棄され、JS クリック イベントが完全に伝播され、フォームが送信されます。

于 2014-07-14T20:00:48.140 に答える
2

誰かがまだ答えを探しているなら、ここに私のために働いたものがあります.

setTimeout("$('#" + id + "').click();", 0);

id は e.currentTarget.id で、イベントは送信ボタンのクリックです。その ID を、クリック イベントをトリガーする必要があるメソッドに渡します。

.trigger("click") はポストバックをトリガーしませんが、上記のコードはトリガーします。

于 2013-03-29T02:17:46.343 に答える
1

id 属性をフォームに割り当てます。

<form id="myForm" action="http://www.google.com/index.html" method="post">

次に、フォームを送信します。

$('.pickButton').click(function (e) {
  e.preventDefault();
  $('#myForm').submit();
  // more code
}
于 2012-10-18T23:23:08.177 に答える
0

問題は、id 要素をセレクターとして使用することによって引き起こされます... jquery ui ダイアログが呼び出されると、目的のブロックが生成されたコンテナーにコピーされます。これは、#form_name などの特定の識別子が重複して jquery セレクターを混乱させることを意味します。 ...

私の解決策は、クラス識別子に切り替えてから、より具体的なパスを使用してボタンを選択することです ex: $(jQuery_dialog_box. class name).submit() (または click() )

于 2013-12-09T23:46:54.157 に答える
0

デフォルトでは、Jquery UI ダイアログは、ボタンが送信されないようにします (少なくともこれまでの私の経験に基づいています)。そうは言っても、Visual Studioを介して任意のボタンの「送信動作」を「False」に変更すると、機能することがわかりました。これが本来あるべきこととはまったく逆であることはわかっていますが、これを行うと、JQuery UI ダイアログ内のボタンがポストバックして機能します。

また、数時間後、Jquery UI ダイアログ オブジェクトで destroy メソッドを呼び出さない限り、JQUI ダイアログ内のフィールドがポスト バック時に ASP.net で認識されないことがわかりました。

私はこのコントロールが本当に好きでしたが、実際のアプリケーションでそれを使用するための細かい詳細に入るまでは、基本的なポップアップを除いて、このコントロールがまだ完全に準備が整っているかどうかはわかりません.

于 2013-12-11T00:25:49.417 に答える
0

私は非常によく似た問題でここに到着しましたが、この問題で数時間を失ったので、将来の読者のために投稿します.

このコードにはいくつかの問題があります。

  1. ダイアログがモーダルの場合、ダイアログ外の他の要素のイベントをトリガーできないようです。オプション modal : false を使用してダイアログを作成すると、トリガーは正常に機能します。ダイアログをモーダルにしたいので、この解決策はオプションではありません。

  2. ダイアログはモーダルであるため、ダイアログ内にボタンを配置する必要があります。それを非表示にして、クラス化されたボタンを介してトリガーできます。私は javacript セクションを変更し、フィドルを試してみましたが、あなたのケースで動作します。

HTML

<form action="http://www.google.com/index.html" method="post">

    <input type="button" value="Open jQuery dialog" id="btnOpenDialog" />
    <br /><br /><br />

    The button below submits the form correctly if you click it.<br />
    However, when I try to trigger click() event on this button <u>from within the jQuery UI Dialog above</u> then the form <b>fails to be submitted.
    </b><br />


    <input type="hidden" id="hdnEmployeeChosen" value="" />            

    <div id="divPopup" class="dialogClass" style="display: none;">
    Picking an employee below <b>ought to</b> cause the form to submit, but sadly it does not...
    <br /><br />

    <div class="divOptions">
        <input type="button" value="Pick" class="pickButton" employeeName="Weird Al" />
        Weird Al Yankovic
    </div>
    <div class="divOptions">            
        <input type="button" value="Pick" class="pickButton" employeeName="Dracula" />
        Count Dracula
    </div>
    <div class="divOptions">          
        <input type="button" value="Pick" class="pickButton" employeeName="David" />
        David Copperfield
    </div>     

       <input type="submit" value="Submit Form" id="btnSubmitForm" style="display:none"/>  
</div>

</form>    




</body>

ジャバスクリプト

$(document).ready(function ()
{
var jqueryDialog = $('#divPopup')
            .dialog({
                autoOpen: false,
                modal: true,
                title: 'My Dialog',
                width: 300,
                height: 300,
                draggable: false,
                resizable: false
            });

// This "fix" does not appear to help matters..........
jqueryDialog.parent().appendTo($("form:first"));

$('#btnOpenDialog').click(function () {
    jqueryDialog.dialog('open');    
});    

$('.pickButton').click(function () {

    // Put picked value into hidden field
    var pickedEmployee = $(this).attr('employeeName');
    $('#hdnEmployeeChosen').val(pickedEmployee);

    console.log("click button dialog");
    // Try to cause a submit (ASP.NET postback in my case)        
    // THIS PART DOES NOT WORK.................
    $('#btnSubmitForm')[0].click();

    console.log("after click");        
    //alert($('#hdnEmployeeChosen').val());
});    

});

ここでフィドルを見ることができます

于 2015-02-05T17:11:07.970 に答える
0

送信ボタンクリックされています。次のコードをスクリプトに追加しました...

$("#btnSubmitForm").on("click", function() {
    console.log("submit!");
});

ボタンがクリックされたことを示します。

Sushanthが言ったようsubmit()に、フォームの方法を使用するか、asp.netのポストバックをトリガーしたい場合は調べてください__doPostBack()

__doPostBack() の使い方

于 2012-10-18T23:10:23.743 に答える
0

この問題の簡単な解決策は、ダイアログが開かれた後に送信イベントを設定することです。submit イベントが発生する前にダイアログを閉じる必要はありません。

.open() メソッド中にダイアログがオーバーレイされると、すべてのイベントが無効になります。ダイアログを開いた後に必要なイベントを設定します。

$('#btnOpenDialog').click(function () {
        jqueryDialog.dialog('open');   
     // now setup events 
        $('#btnSubmitForm').on('click', function() {
            // process submit event 
        });
}); 
于 2016-08-26T16:33:18.930 に答える
0

送信ボタンの Click イベントのコードが表示されません。

それ以外の

$('#btnSubmitForm').click();

試す

$('form').submit();

または、送信ボタンのクリック イベント ハンドラーでフォームを送信します。

于 2012-10-18T23:08:48.017 に答える
0

これはバグである可能性があり、jQuery のバージョンによって異なります。

同じ問題についてこの記事を見てください

どのような場合でも、フォームを送信したいので、最短の方法は.submit()メソッドを使用することです。

于 2012-10-18T23:16:52.200 に答える