2014-12-03 83 views
4

我想添加一個類時,點擊動態生成<li>元素,但它有一個非常奇怪的行爲。使用一個<li>它可以很好地工作,但添加另一個元素後,class屬性將被添加而沒有任何價值。將第三<li>它會再次合作後(基本上它的工作原理只有在<li>元素的個數爲奇數)。「奇」的行爲對li元素

var JSTasker = { 
 
    updateTaskCounter: function() { 
 
    var taskCount = $('div#tasks ul').children().not('li.completed').size(); 
 
    $('span#task_counter').text(taskCount); 
 
    }, 
 
    sortTasks: function() { 
 
    var taskList = $('div#tasks ul'); 
 
    var allCompleted = $(taskList).children('.completed'); 
 
    allCompleted.detach(); 
 
    allCompleted.appendTo(taskList); 
 
    }, 
 
    updatePage: function() { 
 
    this.updateTaskCounter(); 
 
    this.sortTasks(); 
 
    } 
 
}; 
 

 
$(document).ready(function() { 
 
    $('input#task_text').focus(); 
 
    $('form#add_task').on('submit', function(event) { 
 
    event.preventDefault(); 
 
    var taskText = $('input#task_text').val(); 
 
    var taskItem = "<li>" + taskText + "</li>"; 
 
    $('div#tasks ul').append(taskItem); 
 
    $('input#task_text').val(null); 
 
    JSTasker.updatePage(); 
 
    $('div#tasks ul').on('click', 'li', function(event) { 
 
     event.preventDefault(); 
 
     $(this).toggleClass('completed'); 
 
     JSTasker.updatePage(); 
 
    }); 
 
    }); 
 
});
h1, 
 
h2, 
 
ul, 
 
li { 
 
    margin: 0px; 
 
    padding: 0px; 
 
} 
 
html { 
 
    background: #333; 
 
    font-family: 'Gill Sans Light', 'Helvetica', 'Arial'; 
 
    font-size: 90%; 
 
} 
 
body { 
 
    width: 400px; 
 
    margin: 10px auto; 
 
    border: 1px solid #EEE; 
 
    background: #F6F6F6; 
 
    padding: 10px 20px; 
 
} 
 
fieldset { 
 
    border: 2px solid #CCC; 
 
    padding: 10px; 
 
    margin: 10px 0px 0px 0px; 
 
} 
 
input[type=text] { 
 
    width: 300px; 
 
    padding-right: 20px; 
 
} 
 
input[type=submit] {} #tasks { 
 
    margin: 20px 0px 0px 0px; 
 
} 
 
h2 { 
 
    margin-bottom: 10px; 
 
} 
 
h2 span#task_counter { 
 
    font-size: 80%; 
 
    color: #999; 
 
} 
 
#tasks ul { 
 
    list-style-type: none; 
 
} 
 
#tasks ul li { 
 
    padding: 6px 10px 3px 20px; 
 
    height: 1.6em; 
 
} 
 
#tasks ul li:hover { 
 
    background: #FFF8DC; 
 
    text-decoration: underline; 
 
} 
 
#tasks ul li.completed { 
 
    background: url('icons/accept.png') no-repeat 0px 5px; 
 
    text-decoration: line-through; 
 
    color: #999; 
 
} 
 
.trash { 
 
    float: right; 
 
    padding: 2px; 
 
} 
 
.trash:hover { 
 
    background: #F99; 
 
    cursor: pointer; 
 
}
<!doctype html> 
 
<html> 
 

 
<head> 
 
    <meta charset="UTF-8" /> 
 
    <title>Tasker</title> 
 
    <link rel='stylesheet' type="text/css" href='JSTasker.css' /> 
 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script> 
 
    <script src="JSTasker.js"></script> 
 
</head> 
 

 
<body> 
 
    <h1>JSTasker</h1> 
 
    <form id='add_task'> 
 
    <fieldset> 
 
     <legend>Add a Task</legend> 
 
     <input type='text' name='task_text' id='task_text' /> 
 
     <input type='submit' name='add_button' value='Add' /> 
 
    </fieldset> 
 
    </form> 
 

 
    <div id='tasks'> 
 
    <h2>Your Tasks <span id='task_counter'></span></h2> 
 
    <ul> 
 
    </ul> 
 
    </div> 
 
</body> 
 

 
</html>

這是有問題的部分:

$('div#tasks ul').on('click', 'li', function(event) { 
     event.preventDefault(); 
     $(this).toggleClass('completed'); 
     JSTasker.updatePage(); 
    }); 

該申請基於this教程。

+0

你的代碼工作,這是正確的切換類和排序結果(即在投擲最後刪除線文本) – 2014-12-03 05:00:16

+0

嘗試增加兩個任務,然後在他們申請「已完成」類。它不會適用。正如我在描述中提到的那樣,它完美地工作,但只在任務數量很奇怪時才起作用。如果數字是偶數,則不會應用「完成」課程。 – Lehel 2014-12-03 05:12:47

+0

intrestingly,只有在列表中有兩個元素時纔會出現此問題。 – mido 2014-12-03 05:22:45

回答

3

添加onclick處理程序之外的形式提交,現在你的onclick事件是每次提交表單時被初始化。但$().on()是動態綁定的,你需要調用它只有一次

$(document).ready(function() { 

    $('input#task_text').focus(); 

    $('form#add_task').on('submit', function(event) { 
    event.preventDefault(); 

    var taskText = $('input#task_text').val(); 
    var taskItem = "<li>" + taskText + "</li>"; 
    $('div#tasks ul').append(taskItem); 
    $('input#task_text').val(""); 

    JSTasker.updatePage(); 

    }); 
    $('div#tasks ul').on('click', "li", function(event) { 
     event.preventDefault(); 
     $(this).toggleClass('completed'); 
     JSTasker.updatePage(); 

    }); 

}); 
+0

噢,非常感謝。我試過所有的組合,但是這個。它解決了這個問題。 – Lehel 2014-12-03 05:31:42

2

您點擊事件結合li的添加按鈕的每一次點擊。拿出這個代碼,它會起作用。它爲奇數個元素工作,因爲它會將事件綁定到奇數次。可以說你添加了3 li s,因此它會調用3次點擊事件。第一次添加類,然後刪除,然後再添加類。但它會失敗,因爲它將首先添加類,然後將其刪除,即使數量爲li也是如此。

var JSTasker = { 
 
    updateTaskCounter: function() { 
 
    var taskCount = $('div#tasks ul').children().not('li.completed').size(); 
 
    $('span#task_counter').text(taskCount); 
 
    }, 
 
    sortTasks: function() { 
 
    var taskList = $('div#tasks ul'); 
 
    var allCompleted = $(taskList).children('.completed'); 
 
    allCompleted.detach(); 
 
    allCompleted.appendTo(taskList); 
 
    }, 
 
    updatePage: function() { 
 
    this.updateTaskCounter(); 
 
    this.sortTasks(); 
 
    } 
 
}; 
 

 
$(document).ready(function() { 
 
    $('input#task_text').focus(); 
 
    $('form#add_task').on('submit', function(event) { 
 
    event.preventDefault(); 
 
    var taskText = $('input#task_text').val(); 
 
    var taskItem = "<li>" + taskText + "</li>"; 
 
    $('div#tasks ul').append(taskItem); 
 
    $('input#task_text').val(null); 
 
    JSTasker.updatePage(); 
 
    }); 
 
    
 
    $('div#tasks ul').on('click', 'li', function(event) { 
 
     event.preventDefault(); 
 
     $(this).toggleClass('completed'); 
 
     JSTasker.updatePage(); 
 
    }); 
 
});
h1, 
 
h2, 
 
ul, 
 
li { 
 
    margin: 0px; 
 
    padding: 0px; 
 
} 
 
html { 
 
    background: #333; 
 
    font-family: 'Gill Sans Light', 'Helvetica', 'Arial'; 
 
    font-size: 90%; 
 
} 
 
body { 
 
    width: 400px; 
 
    margin: 10px auto; 
 
    border: 1px solid #EEE; 
 
    background: #F6F6F6; 
 
    padding: 10px 20px; 
 
} 
 
fieldset { 
 
    border: 2px solid #CCC; 
 
    padding: 10px; 
 
    margin: 10px 0px 0px 0px; 
 
} 
 
input[type=text] { 
 
    width: 300px; 
 
    padding-right: 20px; 
 
} 
 
input[type=submit] {} #tasks { 
 
    margin: 20px 0px 0px 0px; 
 
} 
 
h2 { 
 
    margin-bottom: 10px; 
 
} 
 
h2 span#task_counter { 
 
    font-size: 80%; 
 
    color: #999; 
 
} 
 
#tasks ul { 
 
    list-style-type: none; 
 
} 
 
#tasks ul li { 
 
    padding: 6px 10px 3px 20px; 
 
    height: 1.6em; 
 
} 
 
#tasks ul li:hover { 
 
    background: #FFF8DC; 
 
    text-decoration: underline; 
 
} 
 
#tasks ul li.completed { 
 
    background: url('icons/accept.png') no-repeat 0px 5px; 
 
    text-decoration: line-through; 
 
    color: #999; 
 
} 
 
.trash { 
 
    float: right; 
 
    padding: 2px; 
 
} 
 
.trash:hover { 
 
    background: #F99; 
 
    cursor: pointer; 
 
}
<!doctype html> 
 
<html> 
 

 
<head> 
 
    <meta charset="UTF-8" /> 
 
    <title>Tasker</title> 
 
    <link rel='stylesheet' type="text/css" href='JSTasker.css' /> 
 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script> 
 
    <script src="JSTasker.js"></script> 
 
</head> 
 

 
<body> 
 
    <h1>JSTasker</h1> 
 
    <form id='add_task'> 
 
    <fieldset> 
 
     <legend>Add a Task</legend> 
 
     <input type='text' name='task_text' id='task_text' /> 
 
     <input type='submit' name='add_button' value='Add' /> 
 
    </fieldset> 
 
    </form> 
 

 
    <div id='tasks'> 
 
    <h2>Your Tasks <span id='task_counter'></span></h2> 
 
    <ul> 
 
    </ul> 
 
    </div> 
 
</body> 
 

 
</html>

1

您的代碼只有任務的奇數作品,因爲你每次提交表單時添加一個新的單擊處理每一個<li>。這意味着當你有兩個<li>秒,你打電話toggleClass兩次,並沒有得到。您可以通過在撥打toggleClass後將alert("hi")添加到您當前的代碼來確認。