2016-03-26 4 views
1

Ich habe eine Anleitung zum Durchstreichen des Textes beim Klicken auf die checkbox neben dem Text und mein Code nicht funktioniert, obwohl seine das gleiche wie eins im Tutorial (wo es gut funktioniert).
Ich habe so lange auf meinen Code geschaut, kann aber nicht sehen, was falsch ist, vielleicht ist es nur ein Tippfehler, den ich nicht sehen kann & hellip; weiß jemand warum?Checkbox -cross out der Text beim Klicken auf CheckBox für eine Todo-Liste

Hier ist der JavaScript-Code (nur der relevante Teil)

function updatingItem() { 

    var cbId = this.id.replace("cb_", ""); 
    var textItem = document.getElementById("item_" + cbId); 
    textItem.style.textDecoration = "line-through"; 
} 

function addItem() { 

    totalItems++; 
    var entry = document.createElement("li"); 
    var checkBox = document.createElement("input"); 
    checkBox.type = "checkbox"; 
    checkBox.id = "cb_" + totalItems; 
    checkBox.onclick = updatingItem; 

    var span = document.createElement("span"); 
    span.id = "item_" + totalItems; 
    span.innerHtml = textItem; 

    var textItem = document.getElementById("textItem"); 
    entry.innerText = textItem.value; 
    var location = document.getElementById("todoList"); 

    entry.appendChild(checkBox); 
    entry.appendChild(span); 
    location.appendChild(entry); 
} 
+1

Sie sollten wirklich einen minimalen, aber vollständigen Code erstellen/anzeigen, der Ihr Problem widerspiegelt. –

+0

Wo ist Ihre 'totalItems' Variable definiert? –

+0

Ihr Hauptproblem ist, dass Sie 'span.innerHtml = textItem;' gesetzt haben, bevor Sie den Wert 'var textItem = document.getElementById (" textItem ") erhalten;' –

Antwort

3

Sie Hauptproblem ist, dass Sie span.innerHtml = textItem; Satz, bevor sie tatsächlich bekommen den Wert var textItem = document.getElementById("textItem");

Aber hey ...

haben Nur CSS:

label{ 
 
    display: block; 
 
} 
 
label input[type=checkbox]:checked + span{ 
 
    text-decoration: line-through; 
 
}
<label> 
 
    <input type="checkbox"> 
 
    <span>Buy Coffee</span> 
 
    </label> 
 
    
 
    <label> 
 
    <input type="checkbox" checked> 
 
    <span>Ask question on SO</span> 
 
    </label> 
 
    
 
    <label> 
 
    <input type="checkbox"> 
 
    <span>Drink coffee</span> 
 
    </label>

Und hier ist ein viel einfacher trivial nicht-ganz-a-Tutorial selbsterklärend JS-Code:

var todoList = document.getElementById("todoList"); 
 
var itemText = document.getElementById("itemText"); 
 
var add  = document.getElementById("add"); 
 

 
add.addEventListener("click", function(){ 
 

 
    var text = itemText.value.trim(); 
 

 
    // IF NO TEXT ENTERED - DO NOTHING 
 
    if(!text.length) return ; 
 

 
    // CREATE AND APPEND HTML 
 
    var item = "<li><label><input type='checkbox'> <span>"+ text+"</span></label></li>"; 
 
    todoList.insertAdjacentHTML('beforeend', item); 
 

 
    // FINALLY CLEAR THE TEXT FROM OUR INPUT 
 
    itemText.value = ""; 
 
    
 
});
label{ 
 
    display: block; 
 
} 
 
label input[type=checkbox]:checked + span{ 
 
    text-decoration: line-through; 
 
    background:rgba(0,255,0, 0.2); 
 
}
<ul id="todoList"> 
 
    <li> 
 
    <label> 
 
     <input type="checkbox"> 
 
     <span>Buy Coffee</span> 
 
    </label> 
 
    </li> 
 
    <li> 
 
    <label> 
 
     <input type="checkbox" checked> 
 
     <span>Ask question on SO</span> 
 
    </label> 
 
    </li> 
 
    <li> 
 
    <label> 
 
     <input type="checkbox"> 
 
     <span>Drink coffee</span> 
 
    </label> 
 
    </li> 
 
</ul> 
 

 
<input id="itemText" type="text"> 
 
<button id="add">ADD TO LIST</button>

https://developer.mozilla.org/en-US/docs/Web/API/Element/insertAdjacentHTML
https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

+0

Sie verwenden css für Text, den Sie bereits erstellt haben (Buy coffee , Frage stellen usw.), aber ich erstelle keinen Text in meiner HTML-Datei - es ist eine Todo-Liste, so dass der Inhalt durch Eingabe von etwas erstellt wird. Wenn Sie dann auf das Kontrollkästchen klicken, sollte es durchgestrichen sein. – learningcoding

+0

@learningcoding Ich habe nicht gesagt, dass Sie JS nicht für den 'ADD TODO ITEM' Teil verwenden sollten, ich sage nur, dass Sie Ihre Artikel nur mit CSS kreuzen können. –

+0

@learningcoding erweiterte meine Antwort. Hoffentlich schirmen Sie etwas Licht. –

0

Eine kleine Inspektion sagt mir Ihren Text zu Ihrem span wird nicht hinzugefügt, sondern auf den Eintrag selbst

hier ist also meine Replikation des Problems

var totalItems = 0; 
 

 
function updatingItem() { 
 
    var cbId = this.id.replace("cb_", ""); 
 
    var textItem = document.getElementById("item_" + cbId); 
 
    textItem.style.textDecoration = "line-through"; 
 
} 
 

 
function addItem() { 
 
    totalItems++; 
 
    var entry = document.createElement("li"); 
 
    var checkBox = document.createElement("input"); 
 
    checkBox.type = "checkbox"; 
 
    checkBox.id = "cb_" + totalItems; 
 
    checkBox.onclick = updatingItem; 
 

 
    var span = document.createElement("span"); 
 
    span.id = "item_" + totalItems; 
 
    span.innerHtml = textItem; 
 

 
    var textItem = document.getElementById("textItem"); 
 
    entry.innerText = textItem.value;   //<<<<<Problem is here 
 
    var location = document.getElementById("todoList"); 
 

 
    entry.appendChild(checkBox); 
 
    entry.appendChild(span); 
 
    location.appendChild(entry); 
 
}
<html> 
 
    <head> 
 
    </head> 
 
    <body> 
 
    <ol id="todoList"> 
 
    </ol> 
 
    <input type="text" id="textItem" placeholder="blabla"/> 
 
    <button onclick="addItem()">add item</button> 
 
    </body> 
 
</html>

Eine leichte Modifikation das behebt Ihr Problem

var totalItems = 0; 
 

 
function updatingItem() { 
 
    var cbId = this.id.replace("cb_", ""); 
 
    var textItem = document.getElementById("item_" + cbId); 
 
    textItem.style.textDecoration = "line-through"; 
 
} 
 

 
function addItem() { 
 
    totalItems++; 
 
    var entry = document.createElement("li"); 
 
    var checkBox = document.createElement("input"); 
 
    checkBox.type = "checkbox"; 
 
    checkBox.id = "cb_" + totalItems; 
 
    checkBox.onclick = updatingItem; 
 

 
    var span = document.createElement("span"); 
 
    span.id = "item_" + totalItems; 
 
    //span.innerHtml = textItem;    <<<<<Comment this out 
 

 
    var textItem = document.getElementById("textItem"); 
 
    span.innerText = textItem.value;   //<<<<<Changed entry to span 
 
    var location = document.getElementById("todoList"); 
 

 
    entry.appendChild(checkBox); 
 
    entry.appendChild(span); 
 
    location.appendChild(entry); 
 
}
<html> 
 
    <head> 
 
    </head> 
 
    <body> 
 
    <ol id="todoList"> 
 
    </ol> 
 
    <input type="text" id="textItem" placeholder="blabla"/> 
 
    <button onclick="addItem()">add item</button> 
 
    </body> 
 
</html>

+0

danke! Es funktioniert jetzt. Das einzige Thin ist, seit ich es in span.innerText geändert habe = textItem.value; der Text bewegte sich nach rechts - bevor es rechts neben/nach dem Kontrollkästchen war und jetzt bewegte es sich viel nach rechts. – learningcoding

+0

egal - ich habe gerade das CSS geändert und es ist jetzt in Ordnung! – learningcoding

+0

In Bezug auf das Verschieben nach rechts-Problem, denke ich, müssen Sie möglicherweise das Styling der Spannweite in bestimmten Position, Textausrichtung und Float betrachten. Übrigens, es ist immer besser, CSS-Klassen umzuschalten, anstatt Inline-Stile zu setzen. –