我试图使用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();
}
任何帮助非常感谢
答案 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才能再次找到它。