【问题标题】:jQuery submit() doesn't include submitted buttonjQuery submit() 不包含提交按钮
【发布时间】:2011-01-05 15:17:27
【问题描述】:

我有一个包含多个元素和两个提交按钮的表单,一个是“保存”,另一个是“删除”。在“删除”按钮上,我使用 jQuery 对话框来确认用户想要删除。然后,如果他们确认,我提交表格。问题是 jQuery.submit() 在发布时不包含原始提交按钮,因此我无法在服务器上区分删除和保存,因为它们都使用相同的表单。如果我删除 jQuery 对话框,则提交按钮值按预期发布。这必须非常普遍,我希望有人可以分享解决方案。我四处搜索,找不到任何有用的东西(是我自己还是谷歌最近很烂?)

感谢您的帮助...

编辑:

提交按钮确实设置了名称和值。如果不使用 jQuery.submit() 效果很好

【问题讨论】:

  • 在提交按钮上加入 ID 以区分 jQuery/服务器端检查中的保存/删除
  • 谢谢,但这不是问题。我有提交按钮的值。当我不使用 jquery.submit() 时它工作正常。
  • serialize() 方法也存在这个问题,尽管提交按钮设置了所有通常的属性,但它们不会被识别。我不得不手动处理它们。

标签: jquery jquery-plugins


【解决方案1】:

根据 karim79 的回答:

$("input[type=submit], input[type=button], button").click(function(e) {
    var self= $(this),
        form = self.closest(form),
        tempElement = $("<input type='hidden'/>");

    // clone the important parts of the button used to submit the form.
    tempElement
        .attr("name", this.name)
        .val(self.val())
        .appendTo(form);

    // boom shakalaka!
    form.submit();

    // we don't want our temp element cluttering up the DOM, do we?
    tempElement.remove();

    // prevent default since we are already submitting the button's form.
    e.preventDefault();
});

更新:

我刚刚意识到上面的代码可能不是你要找的:

如果您在表单元素本身 ($("form").submit();) 上调用提交,您将需要这样的东西:

$("form").submit(function(){
    var form = $(this);
    $("input[type=submit], input[type=button], button", form).eq(0).each(function(){
        var self= $(this),
            tempElement = $("<input type='hidden'/>");

        // clone the important parts of the button used to submit the form.
        tempElement
            .attr("name", this.name)
            .val(self.val())
            .appendTo(form);
    });
});

这会在表单提交之前将 first 按钮元素的名称和值添加到 DOM(我不确定这里的默认浏览器行为是什么)。请注意,这不会从 DOM 中删除 tempElement。如果出现错误并且未提交表单,则该元素将保留,如果您不注意这一点,您将遇到问题。

【讨论】:

  • 看起来不错,我试试看。感谢帮助...有时是最简单的事情...
  • 能否在服务器端做一个 request.getParameter() 来获取按钮值
  • jQuery 的 submit 不包括按钮值。
【解决方案2】:

提交按钮数据只有被点击才会提交。因此,如果有人按下回车键而不是点击提交按钮,你也会很不走运。

我强烈建议从表单中删除删除按钮,因为它可能不需要大部分表单信息(仅需要您要删除的数据记录的 ID),将其更改为按钮(使用type="button") 提交不同的表单,或者如果可以的话,在此处放置一个链接。 (该链接指向删除页面 - 无论如何,出于可用性原因,这会更好,因为它会从删除选项中移除焦点,并降低用户意外点击删除按钮的风险。)

【讨论】:

  • 好主意。我尝试通过处理点击并提交不同的表单来采用不同的表单路径,但在尝试使其通用化时遇到了一些问题。因为我有一个对话框,所以我使用 (this).closest("form"),然后提交。如果按钮包含在自己的表单中,这将非常有用。但是一旦包含在标准表单中,它就无法正常工作,因为它提交了错误的表单。回复:将删除放在不同的页面上。这对我来说很有意义,但在这种情况下用户不会这样做。他们希望避免额外的步骤。
  • 我并不是建议您应该在不同的页面上使用删除功能。您可以并且应该将它放在同一页面上,就在表单之外,或者使用链接(这会将用户重定向到执行删除的页面)。你对“泛化”有什么问题? (我不确定我理解你的意思。)
  • 我所说的概括的意思是我有一个集中的地方来处理删除确认,然后提交表单。因此,在 general.js 文件中,我连接了具有 deleteConfirmation 类的按钮的单击事件。我将按钮移动到自己的形式中,并尝试使用 CSS 将其与其他按钮对齐
【解决方案3】:

这种事情可以通过以某种方式合并一个'action'参数来解决,它告诉服务器提交的目的是什么。例如,假设您的表单是通过 GET 提交的:

$("form :input").click(function() {
    var $form = $(this).closest("form");
    var submitTo = $form.attr("action") + '?action=' + $(this).val();
    alert(submitTo);
    // window.location.href = submitTo;
    return false;
});

http://jsfiddle.net/karim79/JT3GV/5/

【讨论】:

  • 我通过邮寄方式提交。这有关系吗?
  • 为什么不在提交表单之前添加一个与“单击”输入按钮相同的name 的隐藏输入元素?然后在提交后删除隐藏的输入。这样,表单对于非 js 和 js 提交的工作方式相同,并且在使用 GET 或 POST 时工作方式相同。
  • @David Murdoch - 好建议。我最初打算按照这些思路发布一些内容 - 我选择提供一个简单的示例来演示可以使用额外的参数,而无需过多详细说明。
  • 我在我的推荐中添加了一个答案。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多