|
|
|
| Создаю форму калькулятора
В javascript пишу
var pol1=document.getElementById('gidroizol');
var pol2=document.getElementById('grunt_pola');
var pol3=document.getElementById('styagka');
var pol4=document.getElementById('styagka2');
Затем надо каждое поле проверить на нулевое вхождение
var result=document.getElementById('raschet');
if(pol1.value=="" || pol1.value!=parseFloat(pol1.value)) pol1.value=0;
if(pol2.value=="" || pol2.value!=parseFloat(pol2.value)) pol2.value=0;
if(pol3.value=="" || pol3.value!=parseFloat(pol3.value)) pol3.value=0;
if(pol4.value=="" || pol4.value!=parseFloat(pol4.value)) pol4.value=0;
А полей-то много, вот и решил упростить
for (i=1;i<=10;i=i+1)
{
var pol='pol'+i;
if(polvalue=="" || pol.value!=parseFloat(pol.value)) pol.value=0;
}
Переменная pol должна иметь вид pol1, pol2 и т.д. Но что-то не так. Помогите пожалуйста
P.S И и также для подсчета использую
result.value=parseInt(result.value);
result.value=parseInt(result.value)+parseInt(pol1.value)+parseInt(pol2.value) +parseInt(pol3.value)+parseInt(pol4.value)+parseInt(pol5.value)+parseInt(pol6.value);
Думаю тоже можно упросить это дело | |
|
|
|
|
|
|
|
для: immortal727
(12.12.2013 в 17:00)
| | С первым разобрался. Обычная синтаксическая ошибка в условии.
А вот с P.S пока не получается
Сейчас делаю
result.value=parseInt(result.value);
pol='pol';
for (i=1;i<=6;i=i+1)
{
var pol='pol'+i;
result.value=parseInt(result.value)+parseInt(pol.value);
} | |
|
|
|
|
|
|
|
для: immortal727
(12.12.2013 в 17:00)
| | Если решать на JS, не используя сторонние библиотеки, то разумнее строить html так, чтобы удобно было обращаться к нужным элементам (впрочем это правило полезно всегда, независимо от использования сторонних библиотек). То есть, если можно, то поместите элементы формы которые нужно будет получать для расчета в родительский элемент, например:
<div id="values">
<input />
<input />
<input />
</div>
<input id="result" />
//получить их и просчитать
var v = document.getElementById('values').getElementsByTagName('input'),
r = document.getElementById('result');
for(var i = 0, k = v.length; i<k; i++) r.value = parseInt(r.value) + parseInt(v[i].value);
|
| |
|
|
|
|
|
|
|
для: confirm
(12.12.2013 в 18:01)
| | Будем пробовать. Суть ясна | |
|
|
|
|
|
|
|
для: immortal727
(17.12.2013 в 12:44)
| | Выбрал время. Попробовал, но видимо я чего-то недопонял. Вообще теперь ничего не работает.
http://www.vr-rem.ru/index.php?option=com_rsform&formId=4 | |
|
|
|
|
|
|
|
для: immortal727
(19.12.2013 в 16:20)
| | Под каким вы браузером проверяете? Если вы взяли пример в его "чистом" виде и проверяете под FF, то без помещения элементов его в тег формы и инициализации результирующего поля, у вас результатом будет NaN. Поместите в форму, установите значение поля результата в 0, если оно пустое, перед циклом и будет работать. | |
|
|
|
|
|
|
|
для: confirm
(19.12.2013 в 17:04)
| | Элементы же есть, или я чего-то не понимаю?
Ссылку я скинул и никак не могу понять почему выдает NAN | |
|
|
|
|
|
|
|
для: immortal727
(19.12.2013 в 17:09)
| | Если мне память не изменяет, какой-то из FF ну прямо таки не любит элементы формы вне ее, хотя может я и путаю что-то, время течет, изменяется, в голове все путается ...
Отвлекли, отправил недописанное, дописал потом - причина в том, что поле результата у вас не цифра, инициализируйте это поле. Нужно также проверять ввод в остальные поля на цифру, перед суммированием, иначе также будет неверный результат. | |
|
|
|
|
|
|
|
для: confirm
(19.12.2013 в 17:14)
| | Меню на
<script type="text/javascript">
function calculateText(){
var v = document.getElementById('values').getElementsByTagName('input'),
r = document.getElementById('result');
for(var i = 0, k = v.length; i<(k-2); i++) {
if(v[i].value)=="" || v[i].value!=parseFloat(v[i].value)) v[i].value=0;
r.value = parseInt(r.value) +v[i].value;
}
}
</script>
|
Теперь вообще перестала работать форма | |
|
|
|
|
|
|
|
для: immortal727
(19.12.2013 в 17:23)
| | Вы ничего не сделали в плане проверки и инициализации. Проверьте, alert(parseInt('')), что получите?
NaN в JS это "черная дыра", это ничто, для проверки этой дыры есть метод специальный isNaN(exp)
Инициализация - это установка значения по умолчанию, если есть несоответствие, иначе то что есть. То есть, например перед циклом проверяете и устанавливаете этому полю значение:
var v = document.getElementById('values').getElementsByTagName('input'),
r = document.getElementById('result')
r.value = isNaN(parseInt(r.value)) ? 0 : r.value;
for(var i = 0, k = v.length; i<k; i++) r.value = parseInt(r.value) + parseInt(v[i].value);
//сначала val=parseInt(parseInt(v[i].value));
//а потом r.value = parseInt(r.value) +val;
//это просто лишняя запись ничего не дающая
|
PS. NaN вы получите, если значение любого из суммирующих полей также не будет цифрой. Кроме этого - в том же FF, выполните несколько раз этот пример по F5, и заметите, что результат будет удваиваться, это потому, что работает autocomplete, и чтобы таких казусов не происходило, это нужно отключать у поля, или у всей формы. | |
|
|
|
|
|
|
|
для: confirm
(19.12.2013 в 17:47)
| | Форма стала работать, теперь можно и дополнительные поля вставлять не обращаясь каждый раз при этом в скрипт, чтоб дописывать строки как в начале.
>Проверьте, alert(parseInt('')), что получите?
Как я понял в самом цикле каждый раз надо делать вывод поля
window.alert(parseInt('r.value'))
| ?
Ну и то что я чепуху добавил, это я понял. И я решил проверку делать в цикле, а оказывается надо было до. Спасибо за разъяснения, буду браться за javascript и изучать его
Но вот считает не до конца верно. В атрибут формы я вставил autocomplete="off". Но если внести цифры вначале и посчитать, то нормально, а затем, безе обновления формы, вбить еще где-нибудь дополнительно число, то уже не то выдает. Из за чего это может быть, ведь обновление выключил? | |
|
|
|
|
|
|
|
для: immortal727
(19.12.2013 в 23:44)
| | Alert выводит сообщение, я его написал для того, чтобы вы поняли, что метод parseInt() вернет NaN для пустого значения поля. Выводить каждый раз перед циклом это нет никакой необходимости. И вообще, window, это самый верхний объект в иерархии, и указание на него у объектов ему принадлежащих можно опустить. А для отладки лучше пользоваться консолью отладчика, ищите в сети что это такое и...
Я не знаю что конкретно вы делаете, например, если допустимо чтобы в поле принимающем сумму полей сразу было проставлено значение 0, значит его можно проставить
Если суммирование, это многоразовая операция, то перед суммированием нужно очищать поле результата.
Поле результата в моем примере, это тоже самое как если бы вы суммировали поля с некой переменной в цикле, а затем значение этой переменную присваивали полю результата. Можете так сделать, если не понятно, но ради такой простой операции иметь промежуточную переменную, это лишнее.
Можно ведь вообще обойтись без цикла, если обрабатывать события нажатия и отпускания клавиши у полей, проверяя значение поля результата, и если оно не нулевое, то при нажатии клавиши вычитать из его значения значение поля активного, а при отпускании клавиши суммировать вновь.
У вас получается так потому, что вы не очищаете поле результата перед вводом новых значений. autocomplete="off" - это чтобы не запоминался результат полей при обновлениях формы, FF вообще этим страдает. | |
|
|
|
|
|
|
|
для: confirm
(20.12.2013 в 01:21)
| | Вот это меня и заинтересовало.... Как можно при помощи javascript проверить значения полей.
Можно ведь вообще обойтись без цикла, если обрабатывать события нажатия и отпускания клавиши у полей, проверяя значение поля результата, и если оно не нулевое, то при нажатии клавиши вычитать из его значения значение поля активного, а при отпускании клавиши суммировать вновь.
Да, и еще, совсем забыл. Каждое поле же имеет свое значение (цену). Это значит что мне нужно будет завести вначале массив с присвоением ему значений
var price= [148, 150, 30, 200];
|
А затем надо будет прогнать в массиве
for(var i = 0, k = v.length; i<(k-2); i++) r.value = parseInt(r.value) + parseInt(v[i].value)*price[i];
|
Правильно ли это будет? | |
|
|
|
|
|
|
|
для: immortal727
(20.12.2013 в 10:55)
| | Я разве писал, что проверка производится чем-то потусторонним? И alert() к проверке отношения не имеет.
К чему приведена моя цитата, совсем не понятно. А что касается дальнейшего вопроса, то он глобален, и правильно или нет это будет я ответить не могу. Нужно знать, что делается, чтобы видеть выгодно ли создание массивов каких либо значений или нет. Например, HTML5 предоставляет атрибут data, в котором можно хранить значения и получать их простым способом. И без HTML5 не запрещено в любом своем в каком только вам вздумается и добавленном тегу атрибуте содержать подобное.
Ну а что касается доступа к элементам массива, да, правильно. | |
|
|
|
|
|
|
|
для: confirm
(20.12.2013 в 11:14)
| | Я не могу понять, как мне проверить значения полей, если была нажата клавиша Enter? Если там были значения, то как Вы писали, вычесть это значение из этого поля, иначе оно получится вдвое больше. Как-то так.
Единственное что я нашел подходящее, так это http://suli-company.org.ua/coding/php/864-goryachie-klavishi-otpravka-po-nazhatiyu-ctrlenter.html
И простой вроде бы онлайн-калькулятор уже превращается в хорошую программку. Помогите пожалуйста решить последнюю проблему. | |
|
|
|
|
|
|
|
для: immortal727
(20.12.2013 в 11:23)
| | Что значит если была нажата клавиша Enter?
Если имеется ввиду проверка формы перед отправлением, то при отправлении формы возникает событие onsubmit. Назначьте этому событию функцию-обработчик, которая и будет производить проверку.
function checkForm(f) {
//если результат проверки вернет true
//то форма будет отправлена
//иначе, при возврате false,
//форма отправлена не будет
}
</script>
<form onsubmit="return checkForm(this)">
|
Вычесть значение, это я говорил совсем о другом способе решения, а как, это оставим в стороне как теоретический вопрос, ибо его реализация требует соблюдения условий, а вы в простом разобраться не можете.
Калькулятор это калькулятор, а просчет значений полей к калькулятору в том понимании, что он из себя представляет, отношение имеет отдаленное.
Я понятия не имею что вы вообще делаете, и что у вас за проблемы, каким же образом я могу помочь? | |
|
|
|
|
|
|
|
для: confirm
(20.12.2013 в 13:26)
| | Тогда начнем с того, что есть форма http://www.vr-rem.ru/index.php?option=com_rsform&formId=4
Она работает. Но если ввести значения сейчас в неё, то она посчитает. Но если повторно нажать "расчитать", то уже будет неправильно расчитывать. Вот это и не могу понять как исправить
P.S. Я хочу заменить http://www.vr-rem.ru/tseny.html на онлайн-калькулятор, который как раз и пытаюсь сделать. | |
|
|
|
|
|
|
|
для: immortal727
(20.12.2013 в 15:08)
| | Если вам нужна помощь, то выставляйте код здесь, код обрабатывающий эту форму, в котором есть проблемы. А скакать по ссылкам изучая что под ними скрывается, тем более перерабатывать чужой код под ваши нужды у меня нет времени. | |
|
|
|
|
|
|
|
для: confirm
(20.12.2013 в 15:39)
| | <script type="text/javascript">
function calculateText(){
var v = document.getElementById('values').getElementsByTagName('input'),
r = document.getElementById('result');
r.value = isNaN(parseInt(r.value)) ? 0 : r.value;
for(var i = 0, k = v.length; i<(k-2); i++) r.value = parseInt(r.value) + parseInt(v[i].value);
}
</script> | |
|
|
|
|
|
|
|
для: immortal727
(20.12.2013 в 15:39)
| | Я же вам говорил - если надо просчитывать всегда по новой, то используя не переменную, а поле результата, то его значение надо очищать. Вы же пример мой, который как рассуждение представлен применяете, а надо - r.value = 0; перед циклом. | |
|
|
|
|