2016-06-09 11 views
1

Ich habe versucht, diesen Rechner zu erstellen, und ich möchte, dass beim Klicken auf die gesamte Taste/Schaltfläche die Nummer auf dem Bildschirm angezeigt wird. Wenn ich jedoch in den Bereich h1 der Taste/Schaltfläche klicke, ist die Ausgabe nicht definiert. Um das Problem zu verstehen, klicken Sie auf den weißen Knopf und dann auf den blauen Bereich. Wie kann ich das beheben?eventListener wird zum übergeordneten Element hinzugefügt, aber das untergeordnete Element interferiert

var evt = document.querySelectorAll(".evt"); 
 
var screenText = document.getElementById("screentext"); 
 
var show = function(e) { 
 
\t screenText.innerHTML += e.srcElement.firstChild.innerHTML; 
 
} 
 
for(var i = 0 ; i < 14 ; i++) { 
 
\t evt[i].addEventListener("click", show); 
 
}
#calcbody { 
 
    width: 400px; 
 
\t height: 500px; 
 
\t border: 2px solid black; 
 
} 
 
#screen { 
 
\t width: 90%; 
 
\t height: 15%; 
 
\t border: 1px groove black; 
 
\t margin: 5%; 
 
\t text-align: right; 
 
} 
 
.flt { 
 
\t float: left; 
 
\t width: 20%; 
 
\t height: 17%; 
 
\t border: 1px solid black; 
 
\t box-sizing: border-box; 
 
\t margin-left: 4%; 
 
\t margin-bottom: 2%; 
 
\t position: relative; 
 
} 
 
.flt2 { 
 
\t float: left; 
 
\t border: 1px solid black; 
 
\t box-sizing: border-box; 
 
\t width: 44%; 
 
\t height: 17%; 
 
\t margin-left: 4%; 
 
\t position: relative; 
 
} 
 
.keys { 
 
    text-align: center; 
 
\t padding-top: 2px; 
 
    background-color: skyblue; 
 
}
<html> 
 
    <head> 
 
\t  <link rel="stylesheet" href="style.css"> 
 
\t </head> 
 
\t <body> 
 
\t  <div id="calcbody"> 
 
\t \t  <div id="screen"><h1 id="screentext"></h1></div> 
 
\t \t \t <div id="num1" class="flt evt"><h1 class="keys">1</h1></div> 
 
\t \t \t <div id="num2" class="flt evt"><h1 class="keys">2</h1></div> 
 
\t \t \t <div id="num3" class="flt evt"><h1 class="keys">3</h1></div> 
 
\t \t \t <div id="num4" class="flt evt"><h1 class="keys">4</h1></div> 
 
\t \t \t <div id="num5" class="flt evt"><h1 class="keys">5</h1></div> 
 
\t \t \t <div id="num6" class="flt evt"><h1 class="keys">6</h1></div> 
 
\t \t \t <div id="num7" class="flt evt"><h1 class="keys">7</h1></div> 
 
\t \t \t <div id="num8" class="flt evt"><h1 class="keys">8</h1></div> 
 
\t \t \t <div id="num9" class="flt evt"><h1 class="keys">9</h1></div> 
 
\t \t \t <div id="num0" class="flt evt"><h1 class="keys">0</h1></div> 
 
\t \t \t <div id="plus" class="flt evt"><h1 class="keys">+</h1></div> 
 
\t \t \t <div id="minus" class="flt evt"><h1 class="keys">-</h1></div> 
 
\t \t \t <div id="multiply" class="flt2 evt"><h1 class="keys">*</h1></div> 
 
\t \t \t <div id="divide" class="flt2 evt"><h1 class="keys">/</h1></div> 
 
\t \t </div> 
 
\t </body> 
 
\t <script src="script.js"></script> 
 
</html>

+1

'.srcElement' ist ein Merkmal der alten IE-Browser. Das normenkonforme Äquivalent ist "e.target". –

Antwort

2

können Sie die screenText.innerHTML += e.srcElement.firstChild.innerHTML; zu screenText.innerHTML += e.currentTarget.innerText;

ändern wird das Ereignis gebunden, und nicht auf das Element auf tatsächlich angeklickt

currentTarget auf das Element bezieht. In diesem Fall, obwohl der Benutzer auf das Element <h1> geklickt hat, ist das Ereignis zum Container div übergelaufen, was das Element ist, auf das wir hier verweisen möchten.

var evt = document.querySelectorAll(".evt"); 
 
var screenText = document.getElementById("screentext"); 
 
var show = function(e) { 
 
\t screenText.innerHTML += e.currentTarget.innerText; 
 
} 
 
for(var i = 0 ; i < 14 ; i++) { 
 
\t evt[i].addEventListener("click", show); 
 
}
#calcbody { 
 
    width: 400px; 
 
\t height: 500px; 
 
\t border: 2px solid black; 
 
} 
 
#screen { 
 
\t width: 90%; 
 
\t height: 15%; 
 
\t border: 1px groove black; 
 
\t margin: 5%; 
 
\t text-align: right; 
 
} 
 
.flt { 
 
\t float: left; 
 
\t width: 20%; 
 
\t height: 17%; 
 
\t border: 1px solid black; 
 
\t box-sizing: border-box; 
 
\t margin-left: 4%; 
 
\t margin-bottom: 2%; 
 
\t position: relative; 
 
} 
 
.flt2 { 
 
\t float: left; 
 
\t border: 1px solid black; 
 
\t box-sizing: border-box; 
 
\t width: 44%; 
 
\t height: 17%; 
 
\t margin-left: 4%; 
 
\t position: relative; 
 
} 
 
.keys { 
 
    text-align: center; 
 
\t padding-top: 2px; 
 
    background-color: skyblue; 
 
}
<html> 
 
    <head> 
 
\t  <link rel="stylesheet" href="style.css"> 
 
\t </head> 
 
\t <body> 
 
\t  <div id="calcbody"> 
 
\t \t  <div id="screen"><h1 id="screentext"></h1></div> 
 
\t \t \t <div id="num1" class="flt evt"><h1 class="keys">1</h1></div> 
 
\t \t \t <div id="num2" class="flt evt"><h1 class="keys">2</h1></div> 
 
\t \t \t <div id="num3" class="flt evt"><h1 class="keys">3</h1></div> 
 
\t \t \t <div id="num4" class="flt evt"><h1 class="keys">4</h1></div> 
 
\t \t \t <div id="num5" class="flt evt"><h1 class="keys">5</h1></div> 
 
\t \t \t <div id="num6" class="flt evt"><h1 class="keys">6</h1></div> 
 
\t \t \t <div id="num7" class="flt evt"><h1 class="keys">7</h1></div> 
 
\t \t \t <div id="num8" class="flt evt"><h1 class="keys">8</h1></div> 
 
\t \t \t <div id="num9" class="flt evt"><h1 class="keys">9</h1></div> 
 
\t \t \t <div id="num0" class="flt evt"><h1 class="keys">0</h1></div> 
 
\t \t \t <div id="plus" class="flt evt"><h1 class="keys">+</h1></div> 
 
\t \t \t <div id="minus" class="flt evt"><h1 class="keys">-</h1></div> 
 
\t \t \t <div id="multiply" class="flt2 evt"><h1 class="keys">*</h1></div> 
 
\t \t \t <div id="divide" class="flt2 evt"><h1 class="keys">/</h1></div> 
 
\t \t </div> 
 
\t </body> 
 
\t <script src="script.js"></script> 
 
</html>

+0

Ich habe meine Antwort gelöscht, weil deine besser ist. – jimboweb

+0

Es ist besser, textContent zu verwenden als innerText bei innerText ist kein W3C-Standard. –

0

Als Alternative können Sie pointer-events verwenden diese Situationen zu bewältigen. Mit diesen CSS-Eigenschaft Sie nur angeben können, um alle Mausereignisse für keys Elemente nicht zu hören, wie folgt aus:

.keys { 
    pointer-events: none; 
} 
Verwandte Themen