jQuery有时会返回prevObject ....

时间:2015-03-05 23:38:21

标签: javascript jquery html

我试图使用jQuery从DOM中删除一个项目,有时会得到一个prevObject而不是一个元素。据我所知,没有找到任何元素时会返回prevObject,如here

所述

我创建了一个单页应用程序,它以两种不同的方式向播放列表添加元素,一种是通过拖放操作,另一种是通过按下按钮。两种方式都调用相同的函数,传递相关信息。

当我单击已拖放元素的删除按钮时,它已成功删除,但是由于jQuery返回了prevObject,因此通过按钮添加到播放列表的任何项目都不会删除。

项目can be found here,如果你需要正确看看。

HTML(来自chrome dev工具)

顶部项目已被拖放,其次是通过按钮。

<aside class="col-sm-12 ui-sortable" id="sortable">
    <article class="dropped" id="2">
        <img src="http://img.youtube.com/vi/gnbLLQwZxeA/mqdefault.jpg" alt="Put social back in social media">
        <h3>Put social back in social media</h3>
        <div class="clearfix"></div>
        <a href="#" title="Remove item" id="remove2"><i class="fa fa-minus-circle"></i></a>
    </article>
    <article class="dropped" id="3">
        <img src="http://img.youtube.com/vi/ccFLVPNBRE4/mqdefault.jpg" alt="jQuery Performance Myths and Realities">
        <h3>jQuery Performance Myths and Realities</h3>
        <div class="clearfix"></div>
        <a href="#" title="Remove item" id="remove3"><i class="fa fa-minus-circle"></i></a></article>
    // more items here
</aside>

将项目添加到播放列表的功能

var addToPlayList = function(title, image, id){
    var playlistItem = '';
    playlistItem += '<article class="dropped" id="' + id + '">';
    playlistItem += '<img src="' + image + '" alt="' + title + '">';
    playlistItem += '<h3>' + title + '</h3>';
    playlistItem += '<div class="clearfix"></div>';
    playlistItem += '<a href="#" title="Remove item" id="remove' + id +'"><i class="fa fa-minus-circle"></i></a>';
    playlistItem += '</article>';

    $(playlistItem).insertBefore('.droppable');

    $('.playlist #remove' + id).click(function(ev) {
        removePlaylistItem(id);
    });
    fixClearfix();
}

从播放列表中删除项目的功能

var removePlaylistItem = function(id){
    var itemToRemove = $('aside article#' + id);
    console.log(itemToRemove); // returns prev object for items added by button
    itemToRemove.remove();

    var video = findVideoByID(id);
    displayVideo(video, id);
    fixClearfix();
}

任何帮助非常感谢

2 个答案:

答案 0 :(得分:1)

如果您完全指定了jQuery选择器,(即将'aside article#' + id更改为'aside article[id=' + id + ']'则应该有效。

我注意到的另一个问题是,当拖动视频时,它们会从主列表中删除。当他们通过按钮添加时,他们不是。

答案 1 :(得分:1)

不要使用数字ID和(非法)重复ID,请考虑将ID存储为data元素的<article>属性:

<article data-id="1" ...>

然后,在删除按钮上实际上根本不需要ID,更好的是你可以使用委托的事件处理程序,它可以处理所有条目,无论它们何时被添加:

$('.playlist').on('click', '.remove', function(ev) {
    var id = $(this).closest('article').data('id');
    removePlaylistItem(id);
});

因此避免必须为列表中的每篇文章动态注册单独的事件处理程序。请注意,remove链接现在只有一个类(因为每个这样的链接都被视为相同)`并且它通过查看其祖先来计算ID。

您的removePlaylistItem函数需要 little 工作才能使用上述功能,但在click处理程序中您已经知道要删除哪个元素,所以你不应该真的必须遍历DOM才能再次找到它。