Все бы было хорошо, учитывается приоритет умножения и деления над вычитанием и сложением, можно вводить отрицательные числа...
Но например вводим 2+2, бэкспейсом удаляем последнюю двойку, снова вводим 2 и он выдает 2+22. Откуда это вылезает?
Эта функция в самом конце, строка 88
https://jsfiddle.net/prwanzy3/
JavaScript
Что за странности с кнопкой backspace в калькуляторе?
я понял
тебе надо засунуть var form = document.getElementById('form');
в цикл for onclick потому что btn[i].onclick( console.log(form) тут мы получаем первоначальное значение, а не изменённое.
var form = document.getElementById('form');
var but = document.getElementsByName('but');
var str = '';
function solve() {
let s = form.value;
// разделяем на числа и знаки
let ss = s.split('');
let st1 = [];
for (var i = 0; i < ss.length - 1; i++) {
if ((!isNaN(ss[i]) && isNaN(ss[i + 1] )) || (isNaN(ss[i]) && !isNaN(ss[i + 1] ))) {
ss.splice(i + 1,0,' ');
i++;
//console.log(ss[i])
}
}
sss = ss.join('').split(' ');
//отрицательные числа
if (sss[0] == '-'){
let changeFirstABS = -sss[1];
sss[1] = changeFirstABS;
sss.splice(0,1);
}
for (var i = 0; i < sss.length; i++) {
if(sss[i].length >= 2 && isNaN(sss[i])){
if (sss[i].charAt(1) == '-'){
console.log(-sss[i+1]);
let changeABS = -sss[i+1];
sss[i+1] = changeABS;
}
let t = sss[i].substring(0,1);
sss[i] = t;
}
}
//отрицательные числа
for (var i = 0; i < sss.length; i++) {
if (!isNaN(sss[i]) || sss[i] == '+' || sss[i] == '-') {st1.push(sss[i])}
else {
console.log(st1);
// умножение
if (sss[i] == '*') {
console.log(' mult ', st1, sss[i - 1], sss[i + 1]);
res = sss[i - 1] * sss[i + 1];
i++;
//console.log('before',st1);
//console.log(st1[st1.length - 1]);
st1[st1.length - 1] = res;
//console.log('after',st1);
}
// деление
if (sss[i] == '/') {
res = sss[i - 1] / sss[i + 1];
i++;
st1[st1.length - 1] = res;
}
}
}
console.log('st1:',st1);
// подсчитываем результат
res = +st1[0];
console.log('first',res);
for (var i = 0; i < st1.length; i++) {
if (st1[i] == '+') {
console.log(true, st1[i + 1]);
res += +st1[i + 1];
console.log('res', res);
}
if (st1[i] == '-') {
res -= +st1[i + 1];
}
}
form.value = res.toFixed(2);
}
// кнопки;
for (i=0; i<but.length; i++){
but[i].onclick = function () {
form = document.getElementById('form');
console.log('formvalue2', form);
str += this.value;
console.log('thisvalue', this.value);
form.value = str;
console.log('but', form.value);
}
}
// равно
var ravno = document.getElementById('ravno');
ravno.onclick = solve;
clr.onclick = function () {
str = '';
form.value = '0';
}
//backspase
function backspase() {
form.value = form.value.slice(0, -1);
console.log('backspace', form.value);
if (form.value == '') {
form.value = 0;
}
}
bks.onclick = backspase;
тебе надо засунуть var form = document.getElementById('form');
в цикл for onclick потому что btn[i].onclick( console.log(form) тут мы получаем первоначальное значение, а не изменённое.
var form = document.getElementById('form');
var but = document.getElementsByName('but');
var str = '';
function solve() {
let s = form.value;
// разделяем на числа и знаки
let ss = s.split('');
let st1 = [];
for (var i = 0; i < ss.length - 1; i++) {
if ((!isNaN(ss[i]) && isNaN(ss[i + 1] )) || (isNaN(ss[i]) && !isNaN(ss[i + 1] ))) {
ss.splice(i + 1,0,' ');
i++;
//console.log(ss[i])
}
}
sss = ss.join('').split(' ');
//отрицательные числа
if (sss[0] == '-'){
let changeFirstABS = -sss[1];
sss[1] = changeFirstABS;
sss.splice(0,1);
}
for (var i = 0; i < sss.length; i++) {
if(sss[i].length >= 2 && isNaN(sss[i])){
if (sss[i].charAt(1) == '-'){
console.log(-sss[i+1]);
let changeABS = -sss[i+1];
sss[i+1] = changeABS;
}
let t = sss[i].substring(0,1);
sss[i] = t;
}
}
//отрицательные числа
for (var i = 0; i < sss.length; i++) {
if (!isNaN(sss[i]) || sss[i] == '+' || sss[i] == '-') {st1.push(sss[i])}
else {
console.log(st1);
// умножение
if (sss[i] == '*') {
console.log(' mult ', st1, sss[i - 1], sss[i + 1]);
res = sss[i - 1] * sss[i + 1];
i++;
//console.log('before',st1);
//console.log(st1[st1.length - 1]);
st1[st1.length - 1] = res;
//console.log('after',st1);
}
// деление
if (sss[i] == '/') {
res = sss[i - 1] / sss[i + 1];
i++;
st1[st1.length - 1] = res;
}
}
}
console.log('st1:',st1);
// подсчитываем результат
res = +st1[0];
console.log('first',res);
for (var i = 0; i < st1.length; i++) {
if (st1[i] == '+') {
console.log(true, st1[i + 1]);
res += +st1[i + 1];
console.log('res', res);
}
if (st1[i] == '-') {
res -= +st1[i + 1];
}
}
form.value = res.toFixed(2);
}
// кнопки;
for (i=0; i<but.length; i++){
but[i].onclick = function () {
form = document.getElementById('form');
console.log('formvalue2', form);
str += this.value;
console.log('thisvalue', this.value);
form.value = str;
console.log('but', form.value);
}
}
// равно
var ravno = document.getElementById('ravno');
ravno.onclick = solve;
clr.onclick = function () {
str = '';
form.value = '0';
}
//backspase
function backspase() {
form.value = form.value.slice(0, -1);
console.log('backspace', form.value);
if (form.value == '') {
form.value = 0;
}
}
bks.onclick = backspase;
Вот это красивейшая конструкция, которая все обьясняет
let ss = s.split('');
let ss = s.split('');
Александр Комиссаров
Не переживай, редиска, мы тебя без своего внимания не оставим

Это твои глюки
Иди опохмелись +_-
Иди опохмелись +_-
Как всё сложно ((( Я могу тока предположить что удаление поверхностно а значение остаётся на месте. Надо обновлять или изменять значение и обновлять.
Похожие вопросы
- Как задать событие для кнопки по id, если id неизвестен?
- Замена текста на кнопке на сайте
- JS - у меня есть две сортировки: по возрастанию и по убыванию. Как сделать так, что бы по нажатию одной кнопки...
- Хочу сделать действие по нажатию кнопки
- Калькулятор из функций
- Последние штрихи к калькулятору. Запрет кликать мышкой по форме ввода...
- JavaScript как в данном коде передавать значения не в alert а чтобы отображалось в input после каждого нажатия кнопки
- Как составить синтаксис JavaScript для автозаполнения формы * (к примеру, анкеты) нажатием на кнопку ** ?
- Получение всех выбранных radio кнопок
- Кнопка "Backspace" не возвращает на предыдущую страницу как исправить? Раньше возвращала, а сейчас нет. Браузер Гугол.