【问题标题】:How to prevent a page from refreshing when I want to submit a form?提交表单时如何防止页面刷新?
【发布时间】:2021-07-02 21:05:34
【问题描述】:

我正在尝试构建我的第一个网站,但遇到了一个我现在无法解决的问题。因此,当用户想要将商品添加到购物车或增加数量时,我希望在点击提交按钮时阻止页面刷新。我找了很多答案,我尝试应用 Ajax/JQuery,但没有成功。

这是我的代码:

html

<form action="{% url 'cart-add' %}" method="GET" id="myform">
     {% csrf_token %}
     <label>
        <input type="hidden" name="{{ product.pk }}">
        <input type="number" max="{{ product.quantity }}" min="1" name="quantity" value="1">
        <button type="submit" value="">Add to chart</button>
    </label>
</form>

Ajax/JQuery 脚本

<script type="text/javascript">
$(document).ready(function () {
    $('myform').on('submit', function(e) {
        e.preventDefault();
        $.ajax({
            url : $(this).attr('action') || window.location.pathname,
            type: "GET",
            data: $(this).serialize(),
            success: function (data) {
                $("myForm").html(data);
            },
            error: function (jXHR, textStatus, errorThrown) {
                alert(errorThrown);
            }
        });
    });
});
</script>

当我点击添加到购物车提交按钮时,它会将我带到“cart.html”。我不想这样做,而是想阻止这种情况并向用户发送一条消息,说明他/她的项目已成功添加。

有人可以帮助我吗?非常感谢您的宝贵时间。非常感谢!

【问题讨论】:

    标签: javascript jquery django ajax django-forms


    【解决方案1】:

    $('myform') 是错字吗?应该是$('#myform')吗?

    • 要引用 HTML 的 ID,请使用 #idName
    • 要引用 HTML 类,请使用 .className
    • 要引用 HTML 元素,只需输入 name

    $('myform') 正在寻找 &lt;myform&gt;&lt;/myform&gt; 元素。

    $('#myform') 正在寻找&lt;... id="myform"&gt;&lt;/...&gt;

    $('.myform') 正在寻找&lt;... class="myform anotherRandomClass"&gt;&lt;/...&gt;

    【讨论】:

    • 这是我的表单的id。 ID =“我的表格”。我要改名吗?
    • 不,id 没问题,只是当你试图访问它时,你需要使用 # 以便 jQuery 知道它是一个 id!
    【解决方案2】:

    你需要return false,否则,该函数在函数完成后会继续默认行为:

    <script type="text/javascript">
    $(document).ready(function () {
        $('#myform').on('submit', function(e) { // fix typo
            e.preventDefault();
            $.ajax({
                url : $(this).attr('action') || window.location.pathname,
                type: "GET",
                data: $(this).serialize(),
                success: function (data) {
                    $("myForm").html(data);
                },
                error: function (jXHR, textStatus, errorThrown) {
                    alert(errorThrown);
                }
            });
            // Prevent function from saving
             return false;
        });
    });
    </script>
    

    更新:查看jQuery documentation,如果e.preventDefault() 存在,我不知道是否需要return false

    【讨论】:

    • 我已经包含了 return false;在我的代码中,但它仍然做同样的事情。当我点击提交按钮时,它会将我带到 cart.html。我觉得我做错了
    【解决方案3】:

    您的表单正在正常提交,因为您的 jquery 选择器错误。您必须将$('myform') 更改为$('#myform')

    <script type="text/javascript">
    $(document).ready(function () {
        $('#myform').on('submit', function(e) {
            e.preventDefault();
            $.ajax({
                url : $(this).attr('action') || window.location.pathname,
                type: "GET",
                data: $(this).serialize(),
                success: function (data) {
                    $("#myform").html(data);
                },
                error: function (jXHR, textStatus, errorThrown) {
                    alert(errorThrown);
                }
            });
        });
    });
    </script>
    

    【讨论】:

    • 我更新了它,仍然在另一个页面上发送给我......
    • 它仍然无法正常工作,当我单击查看页面源时,脚本甚至没有显示在浏览器中。也许这就是问题所在。我根据您的代码编辑了我的代码,但它仍然无法正常工作。一旦我点击提交按钮,它就会把我扔到购物车页面上。
    • 确保在页面提交脚本之前已经包含了jQuery。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2011-09-13
    相关资源
    最近更新 更多