1

さまざまな入力テキスト コントロール (動的に作成されたものを含む) から同じ jQuery ダイアログを開く必要があります。これは、ページが初めて読み込まれたときに表示されるものです。ここに画像の説明を入力 ユーザーが「追加」ボタンを押すと、新しい行がテーブルに追加されます ここに画像の説明を入力

ここまでは順調ですね。ユーザーが入力にテキストを入力できるようにするダイアログを開く必要があるときに問題が発生します(ダイアログはクリックすると表示されます)最初は、すべてのコントロールにクラスを追加してから使用するだけでよいと思いましたクラスセレクターはダイアログを呼び出すだけです。残念ながら、動的コントロールでは「.on」を使用してイベントを添付する必要があることを知りました。これらの困難を乗り越えると、まだ解決できていない問題に出くわします。これは、初期化時にダイアログを自動的に開かないようにする場合は、「autoOpen」を false に設定する必要があるということです。私はそうしましたが、得られた唯一の結果は、入力のどれも機能しなかったということでした。ダイアログに関して、すべてのコードを入れてみましたが、

var dialog= $( "#dialog" )

しかし、私はいくつかの可能な解決策を試しましたが、まだうまくいきませんでした。

編集:ここにフィドルがあるので、私が話していることをよりよく理解できます:

http://jsfiddle.net/3BXJp/

フルスクリーンの結果: http://jsfiddle.net/3BXJp/embedded/result/

aspx ページ (Default.aspx) の HTML コードは次のとおりです。

 <form id="form1" runat="server">
    <div>
        <fieldset>
            <legend>Expression Builder</legend>
            <table id="myTable" class="order-list">
                <thead>
                    <tr>
                        <td colspan="2">
                        </td>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td style="text-align: right;">
                            IF(<input type="text" name="condition1" class="showDialog" />
                            :
                        </td>
                        <td>
                            <input type="text" name="trueValue" class="showDialog" />
                            )
                        </td>
                        <td>
                            <a class="deleteRow"></a>
                        </td>
                    </tr>
                </tbody>
                <tfoot>
                    <tr>
                        <td colspan="5" style="text-align: left;">
                            <input type="button" id="addrow" value="+ Add" />
                        </td>
                    </tr>
                    <tr>
                        <td colspan="">
                            ELSE (
                            <input type="text" name="else" id="else" class="showDialog" />)
                        </td>
                    </tr>
                </tfoot>
            </table>
        </fieldset>
        <br />
        <input type="button" id="btnEnviar" value="Send" />
    </div>
    <div id="dialog-form" title="Add New Detail">
        <p>
            All the fields are required.</p>
        <table>
            <tr>
                <td>
                    <label for="condition" id="lblcondition">
                        Condition</label>
                </td>
                <td>
                    <input type="text" name="condition" id="condition" class="text ui-widget-content ui-corner-all" />
                </td>
            </tr>
            <tr>
                <td>
                    <label for="returnValue" id="lblreturnValue">
                        Return Value</label>
                </td>
                <td>
                    <input type="text" name="returnValue" id="returnValue" class="text ui-widget-content ui-corner-all" />
                </td>
            </tr>
        </table>
    </div>
    </form>

ここにJavaScriptコードがあります:

<script type="text/javascript">
    $(document).ready(function () {
        var counter = 0;
        $("button, input:submit, input:button").button();
        $('input:text').addClass("ui-widget ui-state-default ui-corner-all");
        var NewDialog = $("#dialog-form");
        NewDialog.dialog({ autoOpen: false });
        var Ventana = $("#dialog-form");
        $("#addrow").on("click", function () {

            var counter = $('#myTable tr').length - 2;

            $("#ibtnDel").on("click", function () {
                counter = -1
            });

            var newRow = $("<tr>");
            var cols = "";

            cols += '<td>ELSE IF(<input type="text" name="condition' + counter + '" class="showDialog1" /> </td>';
            cols += '<td>: <input type="text" name="TrueValue' + counter + '" class="showDialog1" />)</td>';

            cols += '<td><input type="button" id="ibtnDel"  value="-Remove"></td>';
            newRow.append(cols);
            var txtCondi = newRow.find('input[name^="condition"]');
            var txtVarlorV = newRow.find('input[name^="TrueValue"]');
            newRow.find('input[class ="showDialog1"]').on("click", function () {

                //Seleccionar la fila
                $(this).closest("tr").siblings().removeClass("selectedRow");
                $(this).parents("tr").toggleClass("selectedRow", this.clicked);

                Ventana.dialog({
                    autoOpen: true,
                    modal: true,
                    height: 400,
                    width: 400,
                    title: "Builder",
                    buttons: {
                        "Add": function () {
                            txtCondi.val($("#condition").val());
                            txtVarlorV.val($("#returnValue").val());
                            $("#condition").val("");
                            $("#returnValue").val("");
                            $(this).dialog("destroy");
                        },
                        Cancel: function () {
                            //dialogFormValidator.resetForm();
                            $(this).dialog("destroy")
                        }

                    },

                    close: function () {
                        $("#condition").val("");
                        $("#returnValue").val("");
                        $(this).dialog("destroy")
                    }
                });
                return false;

            });

            $("table.order-list").append(newRow);
            counter++;
            $("button, input:submit, input:button").button();
            $('input:text').addClass("ui-widget ui-state-default ui-corner-all");


        });


        $("table.order-list").on("click", "#ibtnDel", function (event) {
            $(this).closest("tr").remove();
        });
        $("#btnEnviar").click(function () {

            //Armo el objeto que servira de parametro, para ello utilizo una libreria JSON
            //Este parametro mapeara con el definido en el WebService
            var params = new Object();
            params.Expresiones = armaObjeto();
            $.ajax({
                type: "POST",
                url: "Default.aspx/Mostrar",
                data: JSON.stringify(params),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (data, textStatus) {
                    if (textStatus == "success") {
                        loadMenuVar(data);
                    }
                },
                error: function (request, status, error) {
                    alert(jQuery.parseJSON(request.responseText).Message);
                }

            });

        });

        $(".showDialog").click(function () {

            Ventana.dialog({
                autoOpen: true,
                modal: true,
                height: 400,
                width: 400,
                title: "Constructor",
                buttons: [
                    { text: "Submit", click: function () { doSomething() } },
                    { text: "Cancel", click: function () { $(this).dialog("destroy") } }
                          ],

                close: function () {
                    $(this).dialog("option", "autoOpen", false);
                    $(this).dialog("destroy")

                }
            });
            return false;
        });            

    });

これは解決策に最も近いものですが、入力がクリックされるまでダイアログを非表示のままにすることはできません

ここに画像の説明を入力

アドバイスやガイダンスをいただければ幸いです。PS 下手な英語でごめんなさい

4

1 に答える 1

3

ダイアログdestroy()ではなくを使用しているためだと思います。close()現時点では、毎回ダイアログを作成および破棄しているように見えますが、そうしないでください。一度ダイアログを作成し、ダイアログ機能を別の関数に分離してから、その上でopen()andを使用close()する必要があります (値を適切なフィールドに取得するには、追加の作業を行う必要があります)。

ダイアログのスタイルを非表示にすると、現在のコードが動作しなくなります。これを HTML に追加します ( 内<HEAD>):

<style>
#dialog-form {
    display: none;
}
</style>

おそらく、そのスタイルを含む別のスタイルシート ファイルを含める必要があります。同様に、すべての JS を別のファイルに配置する必要があります (まだ配置されていない場合)。

しかし、上記のガイドラインに従うように全体を書き直すことを検討したいと思います。将来的にサポートしやすくするために、もっと簡単にすることができるようです。

編集

これは、私がどのように行うかを示す単純化されたバージョンです。

脚本:

var counter = 1; // Counter for number of rows
var currentRow = null; // Current row selected when dialog is active

// Create the dialog
$("#dialog-form").dialog({
    autoOpen: false,
    dialogClass: "no-close", // Hide the 'x' to force the user to use the buttons
    height: 400,
    width: 400,
    title: "Builder",
    buttons: {
        "OK": function(e) {
            var currentElem = $("#"+currentRow); // Get the current element
            currentElem.val($("#d_input").val()); // Copy dialog value to currentRow
            $("#d_input").val(""); // Clear old value
            $("#dialog-form").dialog('close');
        },
        "Cancel": function(e) {
            $("#d_input").val(""); // Clear old value
            $("#dialog-form").dialog('close');
        }
    }
});

// This function adds the dialog functionality to an element
function addDialog(elemId) {
    elem = $("#"+elemId);
    elem.on('click', function() {
        currentRow = $(this).attr('id');
        $("#dialog-form").dialog('open');
    });

}

// Add functionality to the 'add' button
$("#addRow").on('click', function () {
    counter = counter + 1;
    var newId = "in"+counter;
    var newRow = "<tr><td><input id='"+newId+"' class='showDialog'></td></tr>";
    $('TBODY').append(newRow);
    // add the dialog to the new element
    addDialog(newId);
});

// add the dialog to the first row
addDialog("in1");

HTML:

<div>
    <fieldset>
        <legend>Expression Builder</legend>
        <table id="myTable" class="order-list">
            <tbody><tr>
                <td><input id='in1' class='showDialog'></td>
               </tr>
            </tbody>
         </table>
            <input type='button' id='addRow' value='add'></input>                
    </fieldset>
    <br />
    <input type="button" id="btnEnviar" value="Send" />
</div>
<div id="dialog-form" title="Add New Detail">
  <input type="text" id="d_input" />
</div>

フィドル

これにより、さまざまな機能がさまざまな機能に分離されます。必要に応じて簡単に拡張できます。削除機能が必要な場合は、その行(およびボタン)を削除するトリガー関数を使用して、特定のクラスを持つすべての行に削除ボタンを配置することを検討します。次に、アクティブな行の数を個別に取得します。最初に、そのクラスのすべてのボタンのdisable()行を追加するときに、単一のボタンを無効にするために使用します。enable()行を削除してからボタンを無効にすると、existingRows <= 1 になります。

于 2013-09-13T12:07:22.197 に答える