【问题标题】:jquery form submit with confirmation in a modaljquery表单以模态形式提交并确认
【发布时间】:2016-12-02 18:51:26
【问题描述】:

我使用了几年前另一个问题中的一些代码 Implement jQuery confirmation modal in a form submit?

但这个问题还不足以说明在回答“是”时如何提交表单,而且我无法让它发挥作用。

您将看到我尝试过的所有工作方式(它们已被注释掉)。 有人知道我在这里做错了什么吗?

     <div id="dialog-confirm" title="Ready?">
         <p>Are you sure?</p>
     </div>

    <form action"" id="myform" name="myform2" type="post">
        <input type="submit" value="Yes" name="moveOn" />
    </form>

     <script>
      $(function() {
        $("#dialog-confirm").dialog({
         resizable: false,
         height:190,
         autoOpen: false,
         width: 330,
         modal: true,
         buttons: {
           "Yes": function() {
             //$('#myform')[0].submit();
             //document.myform2.submit();
             //document.getElementById("#myform").submit();

              },
        No: function() {
           $(this).dialog("close");
         }
     }

   });

    $('#myform').submit(function() {
       $("#dialog-confirm").dialog('open');
       return false;
       });

       });

【问题讨论】:

标签: jquery forms modal-dialog


【解决方案1】:

在这里试试这个。不要放置提交按钮,而是将按钮设置为普通按钮并处理其单击事件。然后,如果用户单击Yes,您只需提交表单。你也有一些语法错误,比如这个不需要的表单操作&lt;form action"",完全删除操作,你在同一个表单上发布。

您的代码略有改动

<div id="dialog-confirm" title="Ready?">
    <p>Are you sure?</p>
</div>

<form id="myform" name="myform" method="post">
    <input type="hidden" name="moveOn" value="Yes" />
    <input type="button" id="moveOn" value="Yes" />
</form>

<script>
    $(function() {
        $("#dialog-confirm").dialog({
            resizable: false,
            height: 190,
            autoOpen: false,
            width: 330,
            modal: true,
            buttons: {
                "Yes": function() {
                    $('#myform').submit();
                },
                No: function() {
                    $(this).dialog("close");
                }
            }
        });

        $('#moveOn').on('click', function(e) {
            $("#dialog-confirm").dialog('open');
        });
    });
</script>

更新

我已更新我的代码以使用隐藏字段将 moveOn 后变量传递给 PHP。表单内部的变化是:

<input type="hidden" name="moveOn" value="Yes" />
<input type="button" id="moveOn" value="Yes" />

更新 2

您似乎还有一个错误导致表单无法提交数据。这是type="post" 的表单,当然是不正确的,要设置正确的表单方法,您需要使用method="post"

<form id="myform" name="myform" method="post">
...
</form>

你可以在这里试试我的例子:http://zikro.gr/dbg/html/submit-confirm/

这是我的示例工作的屏幕截图:

更新 3

我想你已经有一个 PHP 代码在脚本开始时处理 POST 数据,就像这里的这个:

<?php 

if(isset($_POST['moveOn']) && $_POST['moveOn'] == 'Yes') {
    echo '<h3>The form was posted!</h3>';
}

?>

【讨论】:

  • 看看这里.. usc.thrivezone.org/z.php 我有这个代码 if (isset($_REQUEST['moveOn']) && $_REQUEST['moveOn']=='Yes'){ echo "提交”; } 这应该会导致提交的单词被回显,但这不是......我做错了什么吗?
  • @Allen 是的,你完全正确!请检查我的更新答案。
  • @Allen 是的,您需要将&lt;form type="post" 更改为&lt;form method="post"。请看看我更新的答案。
【解决方案2】:

您遇到的问题是:当您单击“是”时,再次调用提交处理程序。

要解决这个问题,您可以使用trigger event with extraParameters 来区分提交是否是从对话框中触发的。

由于对话框是异步的,您可以使用延迟方法,这是我给 here 的一个旧答案。

代码和jsfiddle:

$(function () {
  $("#dialog-confirm").dialog({
    resizable: false,
    height:190,
    autoOpen: false,
    width: 330,
    modal: true,
    buttons: {
      "Yes": function() {
        //
        // Instead to submit the form trigger the
        // submit event with a parameter.....
        //
        $('#myform').trigger('submit', true);
      },
      No: function() {
        $(this).dialog("close");
      }
    }
  });

  $('#myform').submit(function(e) {
    //
    // Test if the submit event has been triggered from within the dialog
    //
    alert(arguments.length);
    if (!(arguments.length == 2 && arguments[1] === true)) {
      $("#dialog-confirm").dialog('open');
      return false;
    } else {
       // submitted
    }
  });


});
<link href="https://code.jquery.com/ui/1.12.0/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.js"></script>


<div id="dialog-confirm" title="Ready?">
    <p>Are you sure?</p>
</div>

<form action="" id="myform" name="myform2" type="post">
<input type="submit" value="Yes" name="moveOn" />
</form>

【讨论】:

  • 似乎这应该可以工作..我添加了你的建议,但它仍然没有提交(即使我尝试在这个站点上运行代码 sn-p)
  • 是的,你可以在这里看到它(在云服务器上运行)usc.thrivezone.org/z.php
  • 它没有,至少对我而言。提交成功后应该显示“已提交”。
  • 好的..我将您的确切代码放在我的网站 usc.thrivezone.org/z.php 上,但仍然无法提交(我取出了您添加的警报)。至于提交后的消息,我只是希望它提交,如果它实际提交,我正在使用 php 回显提交。
  • 好的..当我使用简单的退货确认时,就像在这个视频中一样,你可以看到我收到了提交的回复。这不是我使用其他代码得到的。 db.tt/k7wHUgPis
【解决方案3】:

一个简单的解决方案是设置一个标志来检查您是否已经点击了“是”:

$(function() {
  var postForm = false;
  $("#dialog-confirm").dialog({
    resizable: false,
    height:190,
    autoOpen: false,
    width: 330,
    modal: true,
    buttons: {
      "Yes": function() {
        postForm = true;
        $('#myform').submit();
      },
      "No": function() {
        $("#dialog-confirm").dialog("close");
      }
    }
  });

  $('#myform').on('submit', function(e) {
    if(!postForm) {
      e.preventDefault();
      $("#dialog-confirm").dialog('open');
    } else {
      console.log('form submitting...')
    }
  });
});

查看这里以获取有效的JSFiddle

另一种解决方案是禁用提交表单(使用 e.preventDefault())并在使用 AJAX 单击“是”后手动发布表单数据:

$(function() {
  $("#dialog-confirm").dialog({
    resizable: false,
    height:190,
    autoOpen: false,
    width: 330,
    modal: true,
    buttons: {
      "Yes": function() {
        $.ajax({
          type: "POST",
          url: $('#myform').attr('action'),
          data: $('#myform').serialize(),
          success: function(response) {
            console.log('form submitted');
          }
        });
      },
      "No": function() {
        $("#dialog-confirm").dialog("close");
      }
    }
  });

  $('#myform').on('submit', function(e) {
    e.preventDefault();
    $("#dialog-confirm").dialog('open');
  });
});

【讨论】:

  • 谢谢..好吧,你可以在这里看到第一个解决方案,它似乎没有提交usc.thrivezone.org/z.php 由于网站的工作方式,我不能真正使用 ajax 解决方案。跨度>
【解决方案4】:

$("#dialog-confirm").dialog({
  resizable: false,
  height: 190,
  autoOpen: false,
  width: 330,
  modal: true,
  buttons: [{
    text: "Yes",
    click: function() {
      console.log("ASD");
      $(this).dialog("close");

      $('#myform').attr("data-submit", "true").submit();
    }
  }, {
    text: "No",
    click: function() {
      $(this).dialog("close");
    }
  }]
});

$('#myform').on("submit", function() {
  var attr = jQuery(this).attr("data-submit");
  if (attr == "false") {
    $("#dialog-confirm").dialog('open');
    return false;
  }
});
<div id="dialog-confirm" title="Ready?">
  <p>Are you sure?</p>
</div>

<form action='www.google.com' id="myform" name="myform2" type="post" data-submit="false">
  <input type="submit" value="Yes" name="moveOn" />
</form>

这应该可以工作。

HTML:

<div id="dialog-confirm" title="Ready?">
<p>Are you sure?</p>
</div>

<form action='www.google.com' id="myform" name="myform2" type="post" data-submit="false">
<input type="submit" value="Yes" name="moveOn" />

JS:

$("#dialog-confirm").dialog({
  resizable: false,
  height: 190,
  autoOpen: false,
  width: 330,
  modal: true,
  buttons: [{
    text: "Yes",
    click: function() {
      console.log("ASD");
      $(this).dialog("close");

      $('#myform').attr("data-submit", "true").submit();
    }
  }, {
    text: "No",
    click: function() {
      $(this).dialog("close");
    }
  }]
});

$('#myform').on("submit", function() {
  var attr = jQuery(this).attr("data-submit");
  if (attr == "false") {
    $("#dialog-confirm").dialog('open');
    return false;
  }
});

还有一个工作的jsfiddl

【讨论】:

  • 谢谢......这越来越令人困惑......我看到这在 jsfiddle 中有效,但如果你去这里(我已经复制了你的代码),它不会触发模式。 usc.thrivezone.org/z.php我有什么遗漏吗?
  • 可以删除此行 alert(attr);.一般来说,如果你想调试 JS 代码,更好的方法是使用 console.log("error title", "message", anyVar, anotherVar, .. );
  • 另外,现在当在这里使用您的代码时,usc.thrivezone.org/z.php 模式会打开,然后在任何点击发生之前提交。
  • 代码在$('#myform')..on('submit', function(e)处有错误。需要放一个"." 所以应该是$('# myform').on('提交', function(e)
  • 谢谢..修复了...现在如果你再试一次,它不会工作,因为它会立即提交
猜你喜欢
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多