【问题标题】:jQuery AJAX redirectsjQuery AJAX 重定向
【发布时间】:2014-11-19 06:08:27
【问题描述】:

我有以下表格(内容因无关已被删除):

<form id="ticketinfo" class="form-horizontal" action="<?php echo base_url('customerinfo'); ?>" method="post">
  <fieldset>
    <input type="submit" value="Add Ticket" class="btn-style-green" id="btnAdd" />
    <input type="submit" value="Next >>" class="purchase-your-ticket col-md-3" id="next">
  </fieldset>
</form>

这是我的 JavaScript:

    $('#btnAdd').click ( function () {
    $('form#ticketinfo').submit (

        function (event)    
        {
            event.preventDefault(); //Avoid that the event 'submit' continues with its normal execution, so that, we avoid to reload the whole page
            $.post(
                url+"ticketinfo/add", //The variable 'url' must store the base_url() of our application
                $("form#ticketinfo").serialize(), //Serialize all the content of our form to URL format

                function (response) 
                {
                }
            );


    });
});

它的作用:

当我点击#btnAdd 时,它会通过 AJAX 提交带有指定 URL 的表单。当我单击#next 时,它会向表单的“操作”中指定的目标 URL 发送常规(不是 AJAX)帖子,执行代码块并将我重定向到另一个页面。

在我点击#btnAdd 之前,这两个按钮都按应有的方式工作。当我在单击#btnAdd 后单击#next 时,表单通过 AJAX 提交到 jQuery 函数中指定的 URL,而不是向服务器发送普通帖子。

简而言之,如果我先点击#btnAdd#next 将执行#btnAdd 的工作。

两个按钮真正应该做什么:

`#btnAdd` - submit form via AJAX

`#next` - submit form via regular post and redirect user.

我还应该补充一点,我希望在表单提交时触发按钮验证事件,而不必编写额外的代码来处理表单验证。

【问题讨论】:

  • 将 btnAdd 的类型更改为“按钮”。
  • 你的括号和大括号没有正确平衡。
  • 是的,我正在尝试正确安排它们,现在给我一分钟。
  • 当您第一次单击#btnAdd 时,您将表单的提交处理程序更改为$('form#ticketinfo').submit()。如果这不是您希望提交按钮执行的操作,您为什么要更改提交处理程序?
  • 一般来说,将一个事件处理程序绑定到另一个事件处理程序中很少是正确的。尤其是如果您没有其他东西解除绑定 - 否则,如果外部事件发生多次,您最终会得到多个处理程序。

标签: jquery ajax


【解决方案1】:

当您单击#btnAdd 时,您将向表单添加一个新的submit 处理程序。 (阻止提交事件的默认操作。)从那时起,在该表单上调用的任何提交操作都将使用该处理程序。

看起来您确实需要覆盖默认的submit 处理程序。因此,不要覆盖它,只需直接在 click 处理程序中为 #btnAdd 执行您的逻辑:

$('#btnAdd').click(function() {
    $.post(
        url+"ticketinfo/add", //The variable 'url' must store the base_url() of our application
        $("form#ticketinfo").serialize(), //Serialize all the content of our form to URL format
        function(response)
        {
            // you'll probably want to handle the response somehow here
        }
    );
});

还将您的按钮设为常规(非提交)按钮:

<input type="button" value="Add Ticket" class="btn-style-green" id="btnAdd" />

这样您就不会弄乱表单的默认提交操作。你有一个按钮做一件事,另一个按钮做另一件事。

【讨论】:

  • 谢谢,但是当我将按钮类型从“提交”更改为“按钮”时,我的表单中有必填字段不会被触发
  • @BlankEDjok:目前执行验证逻辑的是什么?理想情况下,click 处理程序可以显式调用该验证逻辑并仅在它通过时继续。实施细节可能会根据问题范围之外的其他要求而改变,但基本概念仍然存在。如果其他按钮需要使用它,请不要覆盖 submit 处理程序。
  • 我正在使用默认的 html5 输入验证,方法是添加在提交表单时执行的“必需”属性。
  • 您的回答很有帮助,但我首先看到了 Daryl 的回答。谢谢你的帮助。 :)
【解决方案2】:

不用担心使用submit 处理程序,只需使用$.post 处理程序即可。

var form = $('#ticketinfo');

$('#btnAdd').on('click', function(e) {
  // Prevent submit.
  e.preventDefault();
  // Send request.
  $.post(url + 'ticketinfo/add', form.serialize(), function(response) {
    // ... Handle the response.
  });
});

【讨论】:

  • 抱歉,最近一直在写Go。固定。
  • 它现在可以工作了,但你能告诉我如何使用你的方法触发表单的验证事件,如果表单有空字段,我不希望发布。
  • 什么验证事件?你在使用第三方插件吗?您可以在e.preventDefault() 之后和$.post 之前处理任何类型的验证。
  • 不,我通过添加“必需”属性来使用默认的 html5 输入验证。
  • 没关系,我在这里找到了解决方案 --> stackoverflow.com/questions/15713491/… 非常感谢您的帮助。 :)
【解决方案3】:

您的 javascript 正在向表单提交事件添加事件处理程序。所以无论何时提交表单,你的ajax提交代码都会被触发,无论点击什么按钮提交表单。

解决此问题的一种快速方法是删除事件处理程序,当您单击“下一步”按钮时使用 jquery 的 off() 函数。

例如:

$('#btnNext').click ( function () {
    $('form#ticketinfo').off("submit");
});

然而,

如果您有 2 个操作:添加和下一步,您最好使用两个表单。一个用于添加,一个用于进入下一个屏幕。这将在没有任何 javascript 变通办法的情况下解决问题。

【讨论】:

  • 哦,好吧,那么第二个表单将只包含下一个按钮?我认为这会奏效。
【解决方案4】:
$('form#ticketinfo').submit (

            function (event)    
            {
              ...
            }
);

这会更改表单的 onsubmit 事件处理程序。

试试这个也提交您的表单。

$('#btnAdd').click ( function () {
    $('form#ticketinfo').submit (function (event)   { 
        //CODE
    });
    $("form#ticketinfo").submit() //submits your form
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 2010-12-20
    • 2011-02-25
    • 2014-11-26
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多