【问题标题】:two submit buttons within the same form同一个表单中的两个提交按钮
【发布时间】:2016-12-01 02:46:28
【问题描述】:

我有一个带有两个提交按钮的表单,一个用于创建,一个用于编辑

<div class="modal-footer">
    <button name="add" class="companyCreateSubmitBtn ladda-button btn btn-primary" data-style="zoom-in" data-spinner-size="25" onclick="CompanyCreate()">Add</button>
    <button name="edit" class="companyEditSubmitBtn ladda-button btn btn-primary" data-style="zoom-in" data-spinner-size="25" onclick="CompanyEdit()">Save</button>
</div>

这是我的 onclick 函数:

function CompanyCreate() {
    //work experience create
    $("#companyForm").submit(function (event) {
        //validate form
        if (!$(this).valid()) {
            return;
        }

        //serialize the form
        serializedForm = $(this).serializeArray();
        cvId = $("#CVId").val();
        serializedForm.push({ name: "cvId", value: cvId });

        //ajax post
        $.ajax({
            url: "@Url.Action("CompanyCreate", "CV")",
            type: "POST",
            data: serializedForm,
            beforeSend: function () {
                l.ladda("start");
            },
            success: function (result) {
                if (result.success) {
                    //add row to table
                    cTable.fnAddData([
                        result.id,
                        result.name,
                        result.title,
                        result.city,
                        result.country,
                        $.datepicker.formatDate("dd/mm/yy", new Date(parseInt(result.startdate.substr(6)))),
                        $.datepicker.formatDate("dd/mm/yy", new Date(parseInt(result.enddate.substr(6)))),
                        result.description,
                        "<button class='companyEditBtn btn'' title='Edit Work Experience'><i class='icon-pencil'></i></button>" + " " + "<button class='companyDeleteBtn btn'><i class='icon-trash'></i></button>"
                    ]);

                    //success
                    toastrSuccess(result.message);
                } else {
                    //fail
                    toastrError(result.message);
                }
            },
            error: function (jqXHR, textStatus, errorThrown) {
                //fail
                toastrError(textStatus);
            },
            complete: function () {
                //stop ladda button loading
                l.ladda("stop");
                //hide modal
                $(".modal").modal("hide");
            }
        });

        //prevent default submit behaviour
        event.preventDefault();
        event.stopImmediatePropagation();
    });
}



function CompanyEdit() {
    //work experience edit
    $("#companyForm").submit(function (event) {
        //validate form
        if (!$(this).valid()) {
            return;
        }

        //serialize the form
        serializedForm = $(this).serialize();

        //ajax post
        $.ajax({
            url: "@Url.Action("CompanyEdit", "CV")",
            type: "POST",
            data: serializedForm,
            beforeSend: function () {
                l.ladda("start");
            },
            success: function (result) {
                if (result.success) {
                    //update row of table
                    cTable.fnUpdate([
                        result.id,
                        result.name,
                        result.title,
                        result.city,
                        result.country,
                        $.datepicker.formatDate("dd/mm/yy", new Date(parseInt(result.startdate.substr(6)))),
                        $.datepicker.formatDate("dd/mm/yy", new Date(parseInt(result.enddate.substr(6)))),
                        result.description,
                        "<button class='companyEditBtn btn'' title='Edit Work Experience'><i class='icon-pencil'></i></button>" + " " + "<button class='companyDeleteBtn btn' title='Delete Work Experience'><i class='icon-trash'></i></button>"
                    ], position);

                    toastrSuccess(result.message);
                } else {
                    toastrError(result.message);
                }
            },
            error: function (jqXHR, textStatus, errorThrown) {
                toastrError(textStatus);
            },
            complete: function () {
                //stop ladda button loading
                l.ladda("stop");
                //hide modal
                $(".modal").modal("hide");
            }
        });

        //prevent default submit behaviour
        event.preventDefault();
        event.stopImmediatePropagation();
    });
}

每次我点击保存按钮时,它都会转到 CompanyCreate() 函数而不是 CompanyEdit() 函数,我做错了什么?

【问题讨论】:

  • 您需要处理来自 jQuery 的单个按钮点击,而不是表单提交
  • 因为您处理表单.submit() 事件并且第一个函数调用CompanyEdit() 然后您使用preventDefault()stopImmediatePropagation() 所以第二个函数永远不会被调用。
  • @Stephen 你如何防止没有preventDefault的表单提交,因为我使用ajax提交表单
  • 使用&lt;button type="button" ... &gt; 并处理每个按钮.click() 事件。或者,您可以使用 this answer 之类的东西来测试单击了哪个按钮(您只需要一个 .submit() 函数)

标签: javascript jquery html forms


【解决方案1】:
<div class="modal-footer">
    <button type="button" id="CompanyCreate" name="add" class="companyCreateSubmitBtn ladda-button btn btn-primary" data-style="zoom-in" data-spinner-size="25">Add</button>
    <button type="button" id="CompanyEdit"  name="edit" class="companyEditSubmitBtn ladda-button btn btn-primary" data-style="zoom-in" data-spinner-size="25">Save</button>
</div>

jquery代码是

      $(document).ready(function () {


        $("#CompanyCreate").click(function () {
            //your code here
        });
        $("#CompanyEdit").click(function () {
            //your code here
        });
    });

【讨论】:

  • 试过这个,同样的事情
【解决方案2】:

我使用的简单模式(基于 MVC): 1. 创建自定义属性

[AttributeUsage(AttributeTargets.Method)]
public class MultipleButtonAttribute : ActionNameSelectorAttribute
{
    public string Name { get; set; }
    public string Argument { get; set; }

    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo)
    {
        var isValidName = false;
        var keyValue = string.Format("{0}:{1}", Name, Argument);
        var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);

        if (value != null)
        {
            controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
            isValidName = true;
        }

        return isValidName;
    }
}

2。控制器

MultipleButton(Name = "action", Argument = "Action1")

public ActionResult Action1(MyModel model)

{...}

[MultipleButton(Name = "action", Argument = "Action2")

public ActionResult Action2(MyModel model)")]

{...}

3。查看

@using (Ajax.BeginForm("Action1", "Search", new AjaxOptions { }))
{

   <button type="submit" name="action:Action1" >Action1</button>

   <button type="submit" name="action:Action2" >Action2</button>
}

【讨论】:

    【解决方案3】:

    防止在.click中使用.submit函数,它不起作用,你必须抓住表单并发布它。

    $("#companyCreateSubmitBtn").click(function () {
        $("#companyForm").submit(function (event) {
            //validate form
            if (!$(this).valid()) {
                return;
            }
    
            //prevent default submit
            event.preventDefault();
    
            //ajax post etc...
    

    $("#companyCreateSubmitBtn").click(function () {
        //get the form
        var form = $("#companyForm");
        //validate form
        if (!form.valid()) {
            return;
        }
    
        //ajax post etc..
    

    记住你的按钮类型必须是 type="button" 而不是默认的 type="submit"

    <button id="companyCreateSubmitBtn" name="add" class="ladda-button btn btn-primary" data-style="zoom-in" data-spinner-size="25" type="button">Add</button>
    

    【讨论】:

      【解决方案4】:

      你可以这样做:

      $('#companyForm').on('submit', function(e) {
      	e.preventDefault(); // stops form from being submitted
        
        // get the clicked button name
        var clickedButton = $(document.activeElement).attr('name');
        
        if (clickedButton === 'edit') {
        	companyEdit();
        }
        
        if (clickedButton === 'add') {
        	companyAdd();
        }
      });
      
      function companyEdit() {
          // your code to edit company
      	alert('editing company');
      }
      
      function companyAdd() {
          // your code to add company
      	alert('adding company');
      }
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <div class="modal-footer">
          <form id="companyForm">
            <button name="add" class="companyCreateSubmitBtn ladda-button btn btn-primary" data-style="zoom-in" data-spinner-size="25">Add</button>
            <button name="edit" class="companyEditSubmitBtn ladda-button btn btn-primary" data-style="zoom-in" data-spinner-size="25">Save</button>
          </form>
      </div>

      更新

      如果您不想使用前一个示例,您可以简单地执行以下操作。并不是说在 dom 中使用像 onclick 这样的事件被认为是不好的做法,应该在 javascript 中完成。

      $('.companyEditSubmitBtn').on('click', function(e) {
          e.preventDefault(); // stops form from being submitted
      
        alert('editing company');
      });
      
      $('.companyCreateSubmitBtn').on('click', function(e) {
          e.preventDefault(); // stops form from being submitted
      
        alert('creating company');
      });
      

      这里正在工作js-fiddle

      【讨论】:

      • 谢谢,我不太喜欢检查按钮的名称属性并使用 if 语句来决定运行哪个函数的想法,按钮已经是唯一的,我不明白为什么我们必须检查使用他们的名字点击了哪个按钮。而且,当您更改名称时,谁会知道它已绑定到某个功能。我已经使用点击功能解决了这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多