【问题标题】:prevent users to post multiple submission by clicking submit button multiple times防止用户通过多次单击提交按钮来发布多个提交
【发布时间】:2016-05-23 04:38:19
【问题描述】:

这是我遇到的问题,当用户提交帖子并在新页面加载之前两次单击提交按钮时,会生成两个相同的帖子。我想我可以用 python 代码解决这个问题,因为我正在使用 django(限制用户在一分钟内只发布一个;即使在问题存在之后我做了http://dpaste.com/313A0A4)but。这是我的 html 代码(我的尝试没有不工作)

{% block content %}
<form id="post_form" method="post" action="/add_post/" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form|crispy }}
<!--{% for tag in person.tags.all %}{{ tag.word }} {% endfor %}-->

     <input type="submit" name="submit" value="Create Post">
    </form>
    {% endblock %}

        {% include 'footer.html' %}
<script>


jQuery('form').on('submit', function(){ 
    if(jQuery("input[name=submit]").hasClass('active'))
        { return false; }
         else{ 
            jQuery("input[name=submit]").addClass('active'); } });

</script>

【问题讨论】:

  • 是否可以添加 e.preventDefault()。在form.submit中,第一次点击按钮后,是否可以禁用按钮
  • 我不了解 Django,但这通常通过使用 JavaScript 禁用提交按钮并向服务器发送 AJAX 请求来解决。完成后,您可以使用 JavaScript 显示新帖子并启用按钮,或者只需使用 window.location = url 将它们重定向到包含新帖子的页面
  • @AviahLaor 啊,你好......你的方法不起作用。我修复了错误,但这不像我提到的那样工作
  • the-art-of-web.com/javascript/doublesubmit这是正确的方法吗?
  • @Robert 禁用提交按钮是什么意思?如何在没有按钮的情况下提交?..hmmm

标签: javascript jquery python django django-templates


【解决方案1】:

以下是我将如何解决您的 JavaScript 问题。我假设表单在它自己的页面上,您必须在创建帖子后重定向到/posts

HTML:

<form id="post-form" method="post">
  <p class="bg-danger" id="error-message"></p>
  <input id="submit-post-form" class="btn btn-primary" type="submit">
</form>

JavaScript:

$(function() {
    $('#post-form').submit(handleSubmit);
});

function handleSubmit(e) {
    var $submit = $('#submit-post-form');
    $submit.prop('disabled', true)
        .addClass('disabled')
        .attr('value', 'Please Wait...');

    // Let Python do it's thing
    var request = $.ajax({
        method: "POST",
        url: "add_post",
        data: $('#post-form').serialize()
    });

    // Once Python has inserted record in database
    request.done(function(response) {
        // Display error, if any occured
        if (response.error) {
           $('#error-message').html(response.error);
           $submit.prop('disabled', false)
                  .removeClass('disabled');
           return;
        }

        // Assuming posts are found at /posts
        window.location = 'posts';

        // If you want to get fancy with the redirect you can return it from python
        // window.location = response.url;
    });

    // Prevent regular submit functionality
    e.preventDefault();
    return false;
}

【讨论】:

  • 它说未捕获编辑器实例“id_content”已附加到提供的元素。a
【解决方案2】:

您好,请检查以下小提琴

https://jsfiddle.net/b5c75zjr/1/

HTML

<input class="txt" type="text">
<input class="btn active" type="submit" name="submit" value="Create Post">

JQUERY

$(document).ready(function(){
 $('.btn').on('click', function(e){
 if($('.btn').hasClass('active'))
 {
 e.preventDefault();
 }
 else{
 $(this).addClass('active');
 alert('hi');
 }
 });

 $('.txt').on('change', function(){
 $('.btn').removeClass('active');
 });
});

可能是类似的东西?

【讨论】:

  • 等等我不明白,我试过小提琴,但当我点击按钮时它只会提醒我“嗨”......
  • 我刚刚创建了逻辑......替换表单提交代码代替警报......表单将仅提交一次,即第一次,因此防止多次提交......
  • 所以这是正确的方法,the-art-of-web.com/javascript/doublesubmit?
  • 是的,但您应该在提交表单后启用“提交”,否则用户在发布第 1 个帖子后无法发布新帖子
猜你喜欢
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 2017-10-02
  • 2014-11-29
相关资源
最近更新 更多