0
我在香草JS中创建了一个基本的待办事项列表,我正在使用把手来保持HTML & JS独立。努力保持HTML和JS分离
一切都很好,直到我来到删除方法。因为我的删除按钮是在我的HTML里面,而不是在我的JS里面创建的,所以我很难从数组中选择和删除项目。
我想我已经找到了解决方法,但它的问题是它试图抓取页面加载按钮,因此它总是返回一个空的数组,因为在页面加载没有删除当时没有添加按钮。
我也试过把add方法里面的delete方法来对付这个,但是这也提出了问题。
简单地说,有人可以给我一个工作删除方法的例子,使用拼接从数组中删除相关的项目。
干杯
HTML
<input id="add-to-do-value" type="text" placeholder="Add to do">
<button id="add-to-do">Add</button>
<div id="to-do-app"></div>
<script type="text/javascript" src="js/handlebars.js"></script>
<script id="to-do-template" type="text/template">
<ul>
{{#this}}
<div>
<li id={{id}}>
{{value}}
<button class="delete-btn" id={{id}}>Delete</button>
</li>
</div>
{{/this}}
</ul>
</script>
<script type="text/javascript" src="js/app.js"></script>
JS
(function() {
// Data array to store to dos
var data = [];
// Cache dom
var toDoApp = document.getElementById('to-do-app');
var toDoTemplate = document.getElementById('to-do-template');
var addToDo = document.getElementById('add-to-do');
var addToDoValue = document.getElementById('add-to-do-value');
var toDoTemplate = Handlebars.compile(toDoTemplate.innerHTML);
// Render HTML
var render = function() {
toDoApp.innerHTML = toDoTemplate(data);
}
// Add to dos
var add = function() {
var toDoValue = addToDoValue.value;
if(toDoValue) {
var toDoObj = {
value: toDoValue,
id: Date.now(),
}
data.push(toDoObj);
}
render();
}
// Delete to dos
var deleteBtn = document.querySelectorAll('.delete-btn');
for(i=0; i<deleteBtn.length; i++) {
deleteBtn[i].addEventListener("click", function(){
for(j=0; j<data.length; j++) {
if(data[j].id == this.id) {
data.splice(data[j], 1);
render();
}
}
});
}
// Bind events
addToDo.addEventListener("click", add);
})();
您可能需要检查的页面在运行数组构建函数之前已经完成加载 – GavinBrelstaff
请注意,您声明了'var toDoTemplate'两次。 – PeterMader
我在你的最后一个问题中已经提供了很好的答案? –