【问题标题】:submit form by ajax in Symfony2在 Symfony2 中通过 ajax 提交表单
【发布时间】:2015-03-27 10:48:28
【问题描述】:

我有一个动作,首先需要通过 ajax 呈现表单,然后需要更新现有值。我已经获得了具有正确值的渲染表单,但是当我单击通过 ajax 提交表单时,我无法阻止表单提交,我有这个脚本:

 $('#edit-comment').click(function (e) {
    e.preventDefault();
    console.log(1);
});

但提交仍然有效!我做错了什么。而且我不知道如何在编辑操作中处理提交的表单。这是它的现有部分:

 /**
 * @Route("/edit/comment", name="chat_edit", options={"expose"=true})
 */
public function editAction(Request $request)
{
    $comment_id = json_decode($request->getContent(), true)['commentId'];
    $comment = $this->get('comment.repository')->find($comment_id);
    $form = $this->createForm(new CommentType(), $comment);

    return $this->render("ChatCommentBundle:Comment:form.html.twig",
        array('form' => $form->createView())
    );
}

链接到gist with form type

【问题讨论】:

  • 你也应该共享commentType类。
  • 对于客户端问题发布服务器代码没有多大好处。您是否将事件绑定包装在document.ready 中?它是正确的选择器吗?运行代码时是否存在元素?页面中是否有多个相同的 ID?
  • @charlietfl,它包装好,选择正确,是的元素存在..
  • 创建一个复制这个的演示。就目前而言,我们无法做任何事情来重现它
  • @KristofFeys,我添加了指向带有 forn 类型的 gist 文件的链接

标签: javascript php jquery ajax symfony


【解决方案1】:

更新:

原始答案(如下)仍然适用,但鉴于表单实际上是使用 AJAX 加载的,您无法在 $(document).ready 回调中绑定事件侦听器。对您来说最好的选择是使用事件委托。这是通过将一个事件侦听器附加到一个 从一开始就存在的 DOM 元素,但让该侦听器接收可能稍后添加的元素的事件。例如:body 元素会一直存在,所以你可以在那里监听一个表单提交,不管那个表单是否存在:

$('body').on('submit', '#form-id', function(e)
{
    console.log('#form-id was submitted, do AJAX => submission stopped');
    return false;
    //or
    e.preventDefault();
    e.stopPropagation();
});

here 很好地解释了为什么以及如何工作。归根结底,所有事件都通过目标节点的所有父 DOM 元素,因此您可以在 DOM 中的任何位置附加侦听器,并在事件到达目标之前对其进行处理。
我认为this old answer of mine 也可以解释一两件事。它不使用 jQ,但它包含 jQ 内部用于委托的代码的简化版本。


您正在阻止$('#edit-comment') 上的单击事件的默认效果,但该事件仍会传播到表单。您可能还想添加e.stopPropagation()。或者只是来自回调的return false;(这会阻止默认的停止传播)。

但是,防止表单提交的更好方法是使用submit 事件,并在此处停止提交:

$('#form-id').on('submit', function(e)
{
    console.log('Do ajax call here');
    return false;
    //or
    e.preventDefault();
    e.stopPropagation();
});

【讨论】:

  • 你的表单ID是什么,它的选择器是什么?您在控制台中看到输出了吗?将渲染视图添加到您的问题(或要点)中,因为此代码根本无法复制粘贴
  • 引导模式窗口中的表单,所以当文档准备好时没有表单,但是当我点击编辑按钮时,表单由 ajax 返回,所以我认为它不会工作......
  • @excluded_once:在那种情况下,你最好使用事件委托,我会更新我的答案
  • 是的,委托帮助解决问题,非常感谢,我需要深入研究 JS、DOM 和 jQuery :)
猜你喜欢
  • 2016-06-21
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 2014-09-12
相关资源
最近更新 更多