查询:检测是否已克隆具有特定数据attr的元素

时间:2013-07-28 14:19:45

标签: jquery clone each

$(".sect-tasklist li.is-running").each(function(){

    var $this = $(this),
        taskID = $(this).data("task-id");

    if ( /*if elem has already been cloned*/ ) {
        console.log("already cloned, don't clone it again");
    } else {
        $(this).clone().appendTo(".helper-timers");
    }

});

每个任务(li.is-running)都在data-task-id属性中应用了自己的唯一ID。代码应该将每个任务复制到临时div(.helper-timers)中,但是如果某个任务已经被克隆并存在于.helper-timers中,那么显然不需要再次复制。


解决

对于任何想知道的人,我设法解决了这个问题。

(function(){
    jQuery.fn.cloneRunningTimers = function() {
        $(".sect-tasklist li.is-running").each(function(){
            var $this = $(this),
            taskID = $this.data("task-id");

            if ( $(".helper-timers li.task-id-" + taskID).length ) { // if exists
                // already cloned, don't clone again
            } else { // if doesn't exist
                $this.clone().appendTo(".helper-timers"); // clone
            }
        }); 
    }; // fn cloneRunningTasks
})();

然后我获得任务的部分功能包括:

$(".helper-timers li").each(function(){
    var $this = $(this),
    taskID = $this.data("task-id");

    if ( $(".sect-tasklist li.task-id-" + taskID).length ) { // if exists it task list
        $this.remove(); // delete it from helper list
    }
});

据我所知,确保同时完成同一任务。

2 个答案:

答案 0 :(得分:1)

您可以创建已克隆的任务ID的外部引用:

var alreadyCloned = [];
$(".sect-tasklist li.is-running").each(function(){

    var $this = $(this),
        taskID = $(this).data("task-id");

    if ( $.inArray(taskID, alreadyCloned) > -1 ) {
        console.log("already cloned, don't clone it again");
    } else {
        alreadyCloned.push(taskID);
        $this.clone().appendTo(".helper-timers");
    }
});

答案 1 :(得分:0)

您可以使用data的{​​{1}}函数标记已经处理(克隆)的元素。

例如:

jquery

if ($this.data('cloned')) { console.log("already cloned, don't clone it again"); } else { $this.data('cloned', true); $this.clone().appendTo(".helper-timers"); } 将返回数据字段$this.data('cloned')的值,cloned会将数据字段设置为$this.data('cloned', true)。 (注意:true是一个任意名称,您可以使用任何您喜欢的名称。)