2016-09-09 2 views
1

У меня есть небольшое приложение, которое добавляет элементы в список. Элементы появляются рядом с ними рядом с кнопкой, чтобы я мог нажимать эту кнопку, чтобы добавить текст (text-decoration: line-through). Я пробовал несколько разных вещей, но ничего не работает (Javascript для добавления элементов, удаления последнего элемента, добавления классов в новые элементы li и т. Д. Все это прекрасно работает, моя проблема связана только с частью JQuery, больше комментариев на самом коде).HTML-список, добавление JQuery для перехода к выбранному элементу.

HTML

<html> 

<body> 

<h1> Shopping List </h1> 


<button id="add"> Add </button> 

<input type="text" id="input" placeholder="Enter Items"> </input> 

<button id="remove"> Remove Last </button> 


<ul id="list"> 

</ul> 

</body> 

</html> 

Js/Jq:

document.getElementById("add").addEventListener('click', function() { 


var check = document.createElement("button"); 
var input = document.getElementById("input").value; 
var newEl = document.createElement("li"); 
var newText = document.createTextNode(input); 
var buttonText = document.createTextNode("Check"); 

newEl.className = "liEl"; 
newEl.appendChild(newText); 
newEl.appendChild(check); 
check.setAttribute("class", "checked"); 
check.appendChild(buttonText); 


/* Problem starts here */ 

$("button.checked").on('click', function() { 

$('li.liEl').css('text-decoration: line-through'); 

/* It should get the button with the class "checked" and on click, make the li elements with class "liEl" to have that css... */ 

} 
); 


var position = document.getElementsByTagName("ul")[0]; 
position.appendChild(newEl); 
document.getElementById("input").value = ""; 



document.getElementById('input').onkeypress = function(e) { 
if (e.keyCode == 13) { 
document.getElementById('add').click(); /* adds an event listener to the submit text, keyCode 13 equals the enter key so when it's pressed it presses the add button. */ 
} 
} 
}); 


/* Delete last item function: */ 

    document.getElementById("remove").addEventListener('click', function() { 
    var els = document.getElementsByTagName("li"); 
    var removeEl = els[els.length - 1]; // <-- fetching last el, If els is an array, it has indices from 0 to els.length - 1. 0 is the first, els.length - 1 is the last index. 
    var containerEl = removeEl.parentNode; 
    containerEl.removeChild(removeEl); 
}); 
+0

Ваше использование .css(), вероятно, неправильно. Начните отсюда: http://api.jquery.com/css/#css2 – Chiu

+0

Это работает, но странно, только когда в список добавлено более 1 элемента (я знал, что он пересечет их всех, но не знаю, почему это не может применить эффект, когда есть только 1 элемент). – Sergi

+0

@Sergi Это потому, что ваша функция click добавлена ​​до добавления нового элемента в DOM. Таким образом, функция вступает в силу после добавления другого элемента. – Dfirmansyah

ответ

1
  1. Ваша функция JQuery css неправильно, вам необходимо предоставить два годовых rameter для установки значения css (см. следующее: css-property-name-value).
  2. Ваш синтаксис синтаксиса ($('li.liEl')) неправильный, он будет возвращать весь элемент <li>, а не тот, который нажал кнопку. Вы можете использовать это: $(this).parent().css('text-decoration', 'line-through');.
  3. В вашем коде содержится ошибка, последняя добавленная кнопка не запускает функцию. Это связано с тем, что функция click добавлена ​​до новый элемент добавлен в DOM. И это приведет к тому, что функция click будет запущена несколько раз для ранее добавленной кнопки.

Вот фрагмент фиксированного кода. Поскольку вы уже используете jQuery, я меняю несколько собственных собственных запросов на скрипт java и обработчик событий с синтаксисом jquery.

$(function() { 
 
\t $("#add").click(function(evt) { 
 
\t \t var input = $('#input').val(); 
 
\t \t var check = $('<button class="checked">Check</button>'); 
 
\t \t var newEl = $('<li class="liEl"></li>'); 
 
\t \t newEl.append(input); 
 
\t \t newEl.append(check); 
 
\t \t 
 
\t \t $(check).click(function(evt) { 
 
\t \t \t $(this).parent().css('text-decoration', 'line-through'); 
 
\t \t }); 
 
\t \t 
 
\t \t $('#list').append(newEl); 
 
\t \t $('#input').val(''); 
 
\t }); 
 
\t 
 
\t $('#remove').click(function(evt) { 
 
\t \t var lastEl = $('li.liEl').last(); 
 
\t \t lastEl.remove(); 
 
\t }); 
 
\t 
 
\t $('#input').keypress(function(evt) { 
 
\t \t if (evt.keyCode === 13) { 
 
\t \t \t $("#add").click(); 
 
\t \t } 
 
\t }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 

 
<body> 
 

 
<h1> Shopping List </h1> 
 

 
<button id="add"> Add </button> 
 
<input type="text" id="input" placeholder="Enter Items" /> 
 
<button id="remove"> Remove Last </button> 
 

 
<ul id="list"></ul> 
 

 
</body>

+0

Это работает безупречно. Я хотел найти решение для перекрестных позиций по отдельности, но я изучу ваш код, спасибо. – Sergi

2

Используйте стиль, как $('li.liEl').css('text-decoration','line-through');

Смежные вопросы