【问题标题】:django: dynamically inserting comment form using jquerydjango:使用 jquery 动态插入评论表单
【发布时间】:2010-01-18 12:49:52
【问题描述】:

我正在建立一个问答网站,人们可以在其中评论问题及其答案。它是一个带有 ajax 的线程评论系统。

这是 javascript 部分:

function bindPostCommentHandler()
{
    $('.commentFormWrapper form').submit(function() {
    var current = $(this); 
        $.ajax({
            type: "POST",
            data: current.serialize(),
            url: "{% comment_form_target %}",
            cache: false,
            dataType: "html",
            beforeSend:function(xhr){
                $('.submit', current).html('<img id="preloader" class="va-mid" src="{{MEDIA_URL}}img/indicator.gif" title="processing.." />');
                $('#commentError').remove();
            },
            success: function(html, textStatus) {   
                current.parent().replaceWith(html);
                bindPostCommentHandler();                
            },
            error: function(xhr, textStatus, errorThrown) {
               $('#commentError').remove();
                $('.submit', current).html('<input type="submit" name="submit" class="submit-post small-button" value="Submit" />');
                if(xhr.status == 400){
                    current.before('<li id="commentError" class="no-bullet errornote margin10">OOPS ! your comment looked liked a spam. Try again with some modifications.</li>');
                }else {
                    current.before('<li id="commentError" class="no-bullet errornote margin10">Your comment was unable to be posted at this time. You may try after sometime.</li>');
                }   

            //bindPostCommentHandler();             

            }
        });
        return false;
    });        
}
$(document).ready(function() {
 bindPostCommentHandler();
});

html部分:

<!-- comment form for question -->
<div class="commentFormWrapper">                
     {% render_comment_form for question %}
</div>

<!-- comment form for answers -->
{% for answer in question.answers.all %}
<div class="commentFormWrapper">                
     {% render_comment_form for answer %}
</div>

问题是,当页面中只有一个表单时,它可以正常工作。使用多种形式,它可以工作,但将请求发送到服务器多次(以倍数增长)。

另外,动态插入/删除表单会更好。但是如果我手动添加表单的 html,我会错过评论表单中的 csrf 令牌和时间戳字段。有人有解决这些问题的方法吗?

【问题讨论】:

  • 什么时候调用 bindPostCommentHandler 函数?是否可能被多次调用?
  • 我在页面加载时调用一次,在评论成功发布时调用一次。您可以在 $.ajax({...success:function(..){ --here-- } 中看到。问题是由于 html 标签类名而发生的。我应该使用 id 来代替然后绑定。跨度>
  • style="tdisplay:none;",应该是 style="display:none;"吗?

标签: jquery ajax django


【解决方案1】:

为每个表单分配一个#id,并使用这个id而不是'this'

var current_id = $(this).attr("id");

【讨论】:

  • 那么我需要给bindPostCommentHandler添加一个参数。你有没有实现过这样的东西?
【解决方案2】:

问题是,当success 函数被调用时,你会再次调用bindPostCommentHandler,这会将匿名函数再次绑定到所有表单对象。 IE。一次提交后,每个表单都有两个函数绑定到提交事件,两次提交后,三个等等。

因此,您必须更改 Ajax 函数的 success 部分,以仅将处理程序添加到响应中包含的表单中。

大概是这样(不知道行不行,我的Javascript/jQuery不是那么好):

编辑:

您提到第一个正在工作。然后代码可能无法正常工作,因为 DOM 被替换了。查看我更新的代码(使用html而不是replace)。

编辑 2:

改变你的 HTML 结构怎么样。只需将另一个 div 包裹在 cmets 和表单周围并替换它的内容即可。这绝对应该有效。类似的东西

<div class="new_around_comments">
   <div class="comments"></div>
   <div class="commentFormWrapper">
       <!-- Form -->
   </div>
</div>

那你得打两次parent()

function bindPostCommentHandler(parent)
{
    parent.find('form').submit(function() {
    var current = $(this); 
        $.ajax({
            //...
            success: function(html, textStatus) {
                // Edit 2
                parent = current.parent().parent()
                parent.html(html);
                bindPostCommentHandler(parent);         
            },
            //...
        });
        return false;
    });        
}
$(document).ready(function() {
 var parent = $('.commentFormWrapper')
 bindPostCommentHandler(parent);
});

【讨论】:

  • 你提到的错误是我面临的错误。但是您的解决方案不起作用
  • 没有错误,但是浏览器重定向到表单预览页面,而不是通过ajax检索。如果它没有被绑定,但您的解决方案似乎绑定它,可能就是这种情况!!!
  • 啊,我想我明白了。 children 只查找子元素而不是后代元素(我总是忘记这一点)。如果form 标签不是.commentFormWrapper 的直接子标签,则将children 更改为find
  • 究竟是什么不行,第一次提交还是第一次提交后提交(即成功函数执行一次后?)
  • .commentFormWrapper 只有一个孩子,它是
    。所以使用儿童应该工作。无论如何使用 find 也无济于事。如果我使用 alert(current.parent.html()); 看到 current.parent() 中有什么它显示表单,但无法绑定。怎么了?
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 2011-09-03
  • 2010-11-09
  • 2019-02-08
  • 1970-01-01
相关资源
最近更新 更多