【问题标题】:JQuery, issue with DOM Removal on LI ElementJQuery,LI 元素上的 DOM 删除问题
【发布时间】:2020-09-13 05:13:42
【问题描述】:

在您认为之前已经回答过这个问题之前(我猜它在技术上已经回答过),让我指出与此类问题相关的任何其他帖子都具有不同的上下文,因此答案不适合我问题。

无论如何,为了简化情况,我有一个 UL 元素,其中包含一堆 LI,这些 LI 由 foreach 循环通过提供给页面的 JSON 对象生成。我希望能够删除行。到目前为止,一切都非常标准。我已经编写了一些非常标准的 JQuery/JS 来处理这个任务,但是由于一些特殊的原因,部分脚本正常运行,而部分脚本却不能正常运行(DOM 删除部分)。我尝试了至少 4 种不同的方式编写它,使用不同的函数来完成任务,甚至尝试将语句移动到函数的不同区域,以及函数本身的交替放置。

我还想说,由于我正在删除单个行,它们都由动态生成的 ID 标识,这(我怀疑)可能与我面临的问题有关。

这是代码本身,从按钮开始,以启动功能;

<button type="button" onclick="unsave({{$savedpost->id}})" class="btn float-right btn-dark my-auto" id="unsaveBTN{{$savedpost->id}}">Unsave</button>

如您所见,动态生成的 id 使用刀片语法。

这是按钮调用的实际 JQuery 脚本

            <script defer>
                function unsave(savedID){
                    // /saved/{savedid}/unsave
                    var saved = document.getElementById(savedID);
                    console.log(savedID);
                    $.ajax({
                        type: 'POST',
                        url: '/'+savedID+'/ajax',
                        headers: {
                            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                        },
                        dataType: 'json',
                        success: function(result) {
                            // append to popupDisplayList
                            if(result.success) {
                                saved.remove();
                                $('#popupDisplayList').append($('<li class="list-group-item alertGroup"><div class="alert alert-success alert-dismissible fade show" role="alert"><strong>Success!</strong> '+result.success+'<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div></li>'));
                            } else if (result.error) {
                                $('#popupDisplayList').append($('<li class="list-group-item alertGroup"><div class="alert alert-danger alert-dismissible fade show" role="alert"><strong>Error!</strong> '+result.error+'<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div></li>'));
                            } else { return }
                        }
                    });
                };
            </script>

我拥有的脚本,显然没有很好地优化,但它是尝试多种其他解决方案后脚本的当前状态,起初它只是一个脚本并进行了优化。

在脚本的一个版本中,我尝试在初始函数中向 div 添加一个类,然后如果名为 success 的变量返回为 true(当 AJAX 响应返回为 result.success 时会发生这种情况),则将其删除。然后我会删除该类的所有项目。显然这是一个非常迂回的方式,但我在这里感到绝望。

任何帮助将不胜感激。

编辑:

这是代码

<li class="pl-4 list-group-item" id="{{$savedpost->id}}">
    <div class="row justify-content-between">
       <div class="row pl-4">
            <img class="img-fit-fluid" src="/storage/images/{{$savedpost->picture_link}}" alt="Saved post image">
            <div class="row flex-column">
                 <h5 class="text-dark pl-5 align-middle">{{$savedpost->name}}</h5>
                 <p class="text-secondary pl-5 align-middle">{{$savedpost->desc_short}}</p>
            </div>
         </div>
      <div class="btn-group" role="group">
           <a href="/{{$savedpost->id}}" class="btn float-right btn-secondary my-auto">View</a>
           <button type="button" onclick="unsave({{$savedpost->id}})" class="btn float-right btn-dark my-auto" id="unsaveBTN{{$savedpost->id}}">Unsave</button>
       </div>
  </div>
</li>

【问题讨论】:

  • 你在 JS 中使用 {{$savedpost->id}} 得到 id 了吗?
  • 可以添加有问题的 ul, li 吗?
  • 如果是字符串插值,你能解释一下你想用“function unsave{{$savedpost->id}}()”实现什么,在这种情况下你应该只用它来传递参数从按钮(这将是你发布的 id),你的函数应该看起来像这样 function unsave(savedPostId)
  • Blade 是在前端 JS 构建之前加载的,所以当 JS 开始构建时,所有的 {{$savedpost->id}} 都会填写有问题的特定 ID,并且是的没问题给我一秒钟添加LI
  • 我尝试将 ID 作为参数而不是在名称中传递,没有什么不同,我提供 ID 的方式并不重要,真正重要的是这一事实.remove() 函数无法正确执行,即使从客户端在 Chrome 上检查它时它看起来是正确的。

标签: javascript jquery laravel laravel-blade


【解决方案1】:

将按钮更改为:

<button type="button" class="btn float-right btn-dark my-auto unsavebtn" data-postid="{{$savedpost->id}}" id="unsaveBTN{{$savedpost->id}}">Unsave</button>

更改脚本:

jQuery("body").on("click",".unsavebtn", function(e)
{
    e.preventDefault();

    var postid = jQuery(this).data("postid");
    var thisElem = jQuery(this);

    $.ajax({
         type: 'POST',
         url: '/'+postid+'/ajaxsave',
         headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
         },
         dataType: 'json',
         success: function(result) {
             // append to popupDisplayList
             if(result.success) {
                  thisElem.parents("li.list-group-item").remove()
                  $('#popupDisplayList').append($('<li class="list-group-item alertGroup"><div class="alert alert-success alert-dismissible fade show" role="alert"><strong>Success!</strong> '+result.success+'<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div></li>'));
                  success = true;
             } else if (result.error) {
                   $('#popupDisplayList').append($('<li class="list-group-item alertGroup"><div class="alert alert-danger alert-dismissible fade show" role="alert"><strong>Error!</strong> '+result.error+'<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div></li>'));
             } else { return }
        }

    });
});

【讨论】:

  • 答案大部分都有效,我所做的唯一更改是将函数调用从概述要侦听的事件更改为仅检测对具有类 unsavebtn 的任何项目的单击,作为解决方案正如您在上面概述的那样,由于某种原因导致了双击问题,例如,单击一次会导致 AJAX 被触发两次,因为给定的端点是一个切换开关,所以这是有问题的。其他一切都保持不变。感谢您的解决方案。
  • 准确显示我所做的更改; $(".unsavebtn").click(function(){ var postid = jQuery(this).data("postid"); 而不是 jQuery("body").on("click",".unsavebtn", function(e) { e.preventDefault();
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
相关资源
最近更新 更多