#javascript #html #trigonometry
#javascript #HTML #тригонометрия
Вопрос:
Эта функция «sin» не работает должным образом. Я не знаю своей ошибки. Должно быть, я где-то ошибаюсь, но я этого не понимаю. Любой может, пожалуйста, исправить код JS для sin. Я предоставил свой HTML и JS-код для того же. В принципе, когда я нажимаю кнопку «sin», она показывает мне «NA», а после некоторых небольших изменений иногда показывает мне «0».
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="index.css">
<title>Calculator</title>
</head>
<body>
<div class="container">
<div class="calculator">
<input type="text" name="screen" id="screen">
<table>
<tr>
<td><button>(</button></td>
<td><button>)</button></td>
<td><button>C</button></td>
<td><button>%</button></td>
</tr>
<tr>
<td><button id="d">sin</button></td>
<td><button>cos</button></td>
<td><button>tan</button></td>
<td><button>DEL</button></td>
</tr>
<tr>
<td><button>7</button></td>
<td><button>8</button></td>
<td><button>9</button></td>
<td><button>X</button></td>
</tr>
<tr>
<td><button>4</button></td>
<td><button>5</button></td>
<td><button>6</button></td>
<td><button>-</button></td>
</tr>
<tr>
<td><button>1</button></td>
<td><button>2</button></td>
<td><button>3</button></td>
<td><button> </button></td>
</tr>
<tr>
<td><button>0</button></td>
<td><button>.</button></td>
<td><button>/</button></td>
<td><button>=</button></td>
</tr>
</table>
</div>
</div>
</body>
<script src="index.js"></script>
</html>
Java Script
let screen = document.getElementById('screen');
buttons = document.querySelectorAll('button');
for (item of buttons) {
item.addEventListener('click', (e) => {
buttonText = e.target.innerText;
if (buttonText == 'X') {
buttonText = "*"
screenValue = buttonText;
screen.value = screenValue;
} else if (buttonText == "C") {
screenValue = ""
screen.value = screenValue;
} else if (buttonText == "=") {
screen.value = eval(screenValue)
} else if (buttonText == "DEL") {
screen.value = screenValue.slice(0, -1)
screenValue = screen.value
} else if (buttonText == "sin") {
var x = screen.value;
x = x * Math.PI / 180;
screen.value = Math.sin(x);
screenValue = screen.value
} else {
screenValue = buttonText;
screen.value = screenValue;
}
})
}
Комментарии:
1. где вы начинаете
screenValue
?2. Немного OT,. Назначение одного и того же обработчика функции обработчикам нескольких кликов — хорошая идея,. Но обратите внимание, что ваш код фактически будет генерировать несколько экземпляров функций. Упомяните только, поскольку похоже, что это то, что вы хотели сделать.
3. Попробуйте с
var x = eval(screen.value);
помощью . Если есть выражение, это само по себе не сработает. Просто введите"45"*Math.PI/180
и"3*15"*Math.PI/180
в консоли разработчика, и вы увидите разницу.4. @tevemadar Это тоже не сработало.
5. @tevemadar Если это не игрушечный проект, который никто, кроме пользователя, не собирается использовать, не рекомендуйте eval людям…
Ответ №1:
Кажется, работает нормально, добавляется screenValue = eval(screenValue)
при нажатии =
let screenValue = "";
let screen = document.getElementById('screen');
buttons = document.querySelectorAll('button');
for (item of buttons) {
item.addEventListener('click', (e) => {
buttonText = e.target.innerText;
if (buttonText == 'X') {
buttonText = "*"
screenValue = buttonText;
screen.value = screenValue;
} else if (buttonText == "C") {
screenValue = ""
screen.value = screenValue;
} else if (buttonText == "=") {
screen.value = eval(screenValue)
screenValue = eval(screenValue)
} else if (buttonText == "DEL") {
screen.value = screenValue.slice(0, -1)
screenValue = screen.value
} else if (buttonText == "sin") {
var x = eval(screen.value);
x = x * Math.PI / 180;
screen.value = Math.sin(x);
screenValue = screen.value
} else {
screenValue = buttonText;
screen.value = screenValue;
}
})
}
<body>
<div class="container">
<div class="calculator">
<input type="text" name="screen" id="screen">
<table>
<tr>
<td><button>(</button></td>
<td><button>)</button></td>
<td><button>C</button></td>
<td><button>%</button></td>
</tr>
<tr>
<td><button id="d">sin</button></td>
<td><button>cos</button></td>
<td><button>tan</button></td>
<td><button>DEL</button></td>
</tr>
<tr>
<td><button>7</button></td>
<td><button>8</button></td>
<td><button>9</button></td>
<td><button>X</button></td>
</tr>
<tr>
<td><button>4</button></td>
<td><button>5</button></td>
<td><button>6</button></td>
<td><button>-</button></td>
</tr>
<tr>
<td><button>1</button></td>
<td><button>2</button></td>
<td><button>3</button></td>
<td><button> </button></td>
</tr>
<tr>
<td><button>0</button></td>
<td><button>.</button></td>
<td><button>/</button></td>
<td><button>=</button></td>
</tr>
</table>
</div>
</div>
</body>
Ответ №2:
Попытался добавить к вашему вопросу доступный для выполнения фрагмент, однако, как отмечают другие, screenValue
отсутствовала инициализация, и это помешало запуску кода здесь, в StackOverflow.
После добавления этой строки sin
начинает работать сбой, который я описал ранее.
let screenValue = ""; // <- this is the new line
let screen = document.getElementById('screen');
buttons = document.querySelectorAll('button');
for (item of buttons) {
item.addEventListener('click', (e) => {
buttonText = e.target.innerText;
if (buttonText == 'X') {
buttonText = "*"
screenValue = buttonText;
screen.value = screenValue;
} else if (buttonText == "C") {
screenValue = ""
screen.value = screenValue;
} else if (buttonText == "=") {
screen.value = eval(screenValue)
} else if (buttonText == "DEL") {
screen.value = screenValue.slice(0, -1)
screenValue = screen.value
} else if (buttonText == "sin") {
var x = screen.value;
x = x * Math.PI / 180;
screen.value = Math.sin(x);
screenValue = screen.value
} else {
screenValue = buttonText;
screen.value = screenValue;
}
})
}
<div class="container">
<div class="calculator">
<input type="text" name="screen" id="screen">
<table>
<tr>
<td><button>(</button></td>
<td><button>)</button></td>
<td><button>C</button></td>
<td><button>%</button></td>
</tr>
<tr>
<td><button id="d">sin</button></td>
<td><button>cos</button></td>
<td><button>tan</button></td>
<td><button>DEL</button></td>
</tr>
<tr>
<td><button>7</button></td>
<td><button>8</button></td>
<td><button>9</button></td>
<td><button>X</button></td>
</tr>
<tr>
<td><button>4</button></td>
<td><button>5</button></td>
<td><button>6</button></td>
<td><button>-</button></td>
</tr>
<tr>
<td><button>1</button></td>
<td><button>2</button></td>
<td><button>3</button></td>
<td><button> </button></td>
</tr>
<tr>
<td><button>0</button></td>
<td><button>.</button></td>
<td><button>/</button></td>
<td><button>=</button></td>
</tr>
</table>
</div>
</div>
Теперь вы можете вводить числа, нажимать sin
, и это работает. Вы даже можете ввести 1
,
, 1
, =
, sin
, и он покажет результат. Однако, если вы введете 1
,
, 1
, sin
(обратите внимание на пропущенное =
), он покажет NaN
, что предложение с eval()
может исправить:
let screenValue = ""; // <- this is the new line
let screen = document.getElementById('screen');
buttons = document.querySelectorAll('button');
for (item of buttons) {
item.addEventListener('click', (e) => {
buttonText = e.target.innerText;
if (buttonText == 'X') {
buttonText = "*"
screenValue = buttonText;
screen.value = screenValue;
} else if (buttonText == "C") {
screenValue = ""
screen.value = screenValue;
} else if (buttonText == "=") {
screen.value = eval(screenValue)
} else if (buttonText == "DEL") {
screen.value = screenValue.slice(0, -1)
screenValue = screen.value
} else if (buttonText == "sin") {
var x = eval(screen.value); // <-- the other change
x = x * Math.PI / 180;
screen.value = Math.sin(x);
screenValue = screen.value
} else {
screenValue = buttonText;
screen.value = screenValue;
}
})
}
<div class="container">
<div class="calculator">
<input type="text" name="screen" id="screen">
<table>
<tr>
<td><button>(</button></td>
<td><button>)</button></td>
<td><button>C</button></td>
<td><button>%</button></td>
</tr>
<tr>
<td><button id="d">sin</button></td>
<td><button>cos</button></td>
<td><button>tan</button></td>
<td><button>DEL</button></td>
</tr>
<tr>
<td><button>7</button></td>
<td><button>8</button></td>
<td><button>9</button></td>
<td><button>X</button></td>
</tr>
<tr>
<td><button>4</button></td>
<td><button>5</button></td>
<td><button>6</button></td>
<td><button>-</button></td>
</tr>
<tr>
<td><button>1</button></td>
<td><button>2</button></td>
<td><button>3</button></td>
<td><button> </button></td>
</tr>
<tr>
<td><button>0</button></td>
<td><button>.</button></td>
<td><button>/</button></td>
<td><button>=</button></td>
</tr>
</table>
</div>
</div>
Теперь вы тоже можете ввести 1
,
, 1
, sin
и это сработает.
Комментарии:
1. попробуйте нажать эти кнопки 5 5 = 5 =, результат неправильный
2. @MedetTleukabiluly Я не уверен, что не так с 15. Кстати, это продолжение моего комментария, сделанного несколько дней назад, потому что OP указал, что это не сработало.