【问题标题】:Refreshing Data Div inside Ajax request在 Ajax 请求中刷新 Data Div
【发布时间】:2020-06-13 19:27:28
【问题描述】:

我正在尝试使用具有两个选项的下拉菜单创建个人资料图片编辑器:

  1. 更新您的头像

  2. 如果有任何个人资料图片,它将显示删除选项,否则它将隐藏此选项

模板代码:

<div class="dropdown-menu">
  <a class="dropdown-item"><input name="input_file" type="file" id="profile-pic-upload" style="display: none;" />
    <label for="profile-pic-upload">Upload Profile Picture</label>
  </a>

  {% if user_profile.profile_pic %}
    <a class="dropdown-item delete" href="javascript:" style="font-size : 14px;">Delete</a>
  {% endif %}

</div>

JS代码:

$(".delete").click(function () {
    $('.loading').show();
    var url = "{% url 'user-profile-image-delete' %}";
    $.ajax({
        type: 'POST',
        url: url,
        data: $("#new_form").serialize(),
        cache: false,
        success: function (data, status) {
            $('#imagePreview').css('background-image', 'url('+'{% static 'assets/img/user-64x.png' %}'+')');
            if (data['status'] == "success") {
            }
            else {
                toastr.error(data.msg);
            }
        }
    });
});


$("#profile-pic-upload").change(function () {
    var input_detail = this;
    var data = new FormData();
    var file = this.files[0];
    data.append("file", file);
    $.ajax({
        type: 'POST',
        data: data,
        contentType: false,
        processData: false,
        url: $("#profile-file-upload").data('action'),
        cache: false,
        success: function (data, status) {
            if (data['status'] == true) {
                toastr.success(data.msg);
                var randomId = new Date().getTime();
                $('#imagePreview').css('background-image', 'url(' + data.profile_pic + '?random=' + randomId + ')');
            }
            else {
                toastr.error(data.msg);
            }
        }
    });
});

但我面临一个问题:即使我点击 delete 选项,下拉菜单也不会刷新,它仍然显示删除它的选项。只有在我刷新页面时才会出现。

同样的方式,如果没有个人资料图片,它只会显示上传个人资料图片。如果我更新图像,下拉菜单不会显示删除选项。要看到这一点,我需要刷新页面。

如何避免页面重新加载刷新下拉内容?

【问题讨论】:

  • 您可以尝试将 false 值初始化为 user_profile.profile_pic 。一旦图像被成功删除。喜欢:{% with user_profile.profile_pic=false %}
  • 我们如何才能在 ajax 中添加这个成功???
  • 它适用于普通 HTML 以及 javascript 试用版。

标签: javascript jquery django django-templates


【解决方案1】:

我了解您的问题。您可以在 ajax 调用成功时轻松解决此问题。

您需要做的只是使用 jquery 或 javascript 进行简单的隐藏和显示。

假设用户已经有个人资料图片,并且该人单击删除选项并且 ajax 调用成功,那么您应该隐藏删除选项。 (您也可以删除它,但稍后您必须通过 javascript 创建它)

$(".delete").click(function () {
    $('.loading').show();
    var url = "{% url 'user-profile-image-delete' %}";
    $.ajax({
        type: 'POST',
        url: url,
        data: $("#new_form").serialize(),
        cache: false,
        success: function (data, status) {
            $('#imagePreview').css('background-image', 'url('+'{% static 'assets/img/user-64x.png' %}'+')');
            if (data['status'] == "success") {
            //$(".delete").hide(); // this will hide your delete option
            //Instead of hiding we are now removing the button then generating the button dynamically via javascript.
            $(".delete").remove();
            // But note one thing if we use class then it will hide/delete all elements with class of delete. so it's better to use id for unique elements.
            }
            else {
                toastr.error(data.msg);
            }
        }
    });
});

对于没有个人资料图片并且用户更新个人资料图片的另一种情况,您应该创建一个下拉菜单并将其附加到下拉菜单中。

$("#profile-pic-upload").change(function () {
    var input_detail = this;
    var data = new FormData();
    var file = this.files[0];
    data.append("file", file);
    $.ajax({
        type: 'POST',
        data: data,
        contentType: false,
        processData: false,
        url: $("#profile-file-upload").data('action'),
        cache: false,
        success: function (data, status) {
            if (data['status'] == true) {
                toastr.success(data.msg);
                $(".delete").remove();
                let dropdown_menu_item = '<a class="dropdown-item delete" href="javascript:" style="font-size : 14px;">Delete</a>'
                $('.dropdown-menu').append(dropdown_menu_item);
                var randomId = new Date().getTime();
                $('#imagePreview').css('background-image', 'url(' + data.profile_pic + '?random=' + randomId + ')');
            }
            else {
                toastr.error(data.msg);
            }
        }
    });
});

这应该可以,但我认为您应该使用 javascript 处理显示或隐藏下拉列表,方法是首先检查个人资料图片是否已更新,如果有则显示删除按钮,否则隐藏删除按钮,当用户更新个人资料图片时显示删除按钮。

【讨论】:

  • 它正在工作我是javascript新手.....如何附加下拉菜单..
  • 答案现已更新。这次我采用了不同的方法。现在我们正在删除个人资料图片删除上的删除选项,并在个人资料图片更新时手动创建该选项。
  • 这将失败,一旦已经有图像并且我正在更新.....
  • 因为它会追加一个删除选项
  • 我已将答案更新为首先删除删除选项,然后再次附加。所以它不会被复制。但我相信现在你已经看到了它是如何工作的。因此,您可以从一开始就为此创建一个更周到的解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-02-07
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多