Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: неработает суммирование
 
 автор: m@rchello   (12.05.2007 в 07:06)   письмо автору
 
 

помогите исправить суммирование input`ов и запись результата в поле summa


function summ()
   {
   summa=0;
   for (i=<?=$col;?>;i>=0;i--)
      {
      iden = 'summa' + i;
      summa+=document.getElementsByName(iden)[0].value;
      document.getElementsByName('summa')[0].value=summa;
      }
   }
</script>

   
 
 автор: ilyaILF   (12.05.2007 в 08:46)   письмо автору
 
   для: m@rchello   (12.05.2007 в 07:06)
 

В вашем примере следует привести значения полей к цифровому виду, иначе они будут не складываться, а будет происходить обыкновенная конкатенация (обединение) строк:
summa+=Number(document.getElementsByName(iden)[0].value);
Не совсем понятно почему вы заполнения результирующей строки осуществляете в цикле, правильнее было бы ее вынести наружу
for (i=<?=$col;?>;i>=0;i--) 
      { 
      iden = 'summa' + i; 
      summa+=Number(document.getElementsByName(iden)[0].value); 
      } 
      document.getElementsByName('summa')[0].value=summa; 
И старайтесь делать так, чтобы имя переменной не совпадало с именем поля, можно заменить имя поля, например, на mysumma.
А вообще ваша сумма может выглядеть примерно следующим образом:
<script type="text/javascript">
function summ() 
   { 
   mysumm=0;
   for (i=document.getElementsByName('summa').length;i>0;i--) 
      {
      mysumm+=Number(document.getElementsByName('summa')[i-1].value); 
      }
      document.getElementsByName('mysumma')[0].value=mysumm;
   } 
</script>
<input name="summa" />
<input name="summa" />
<input name="summa" />
<input name="summa" />
<input name="mysumma" onclick="summ();" />
P.S. Распечатывайте при отладке программы alert()-ом значения переменной i и проверяйте в цикле наличие ваших полей с этим значением, иначе будет возникать ошибка, связанная с отсутствием такого элемента.

   
 
 автор: m@rchello   (12.05.2007 в 09:08)   письмо автору
 
   для: ilyaILF   (12.05.2007 в 08:46)
 

спасибо огромноеза помощь
ваши замечания приму во внимание

   
 
 автор: m@rchello   (12.05.2007 в 10:57)   письмо автору
 
   для: m@rchello   (12.05.2007 в 09:08)
 

у меня опять ворос


function skid()
   {
   mysumma2=0;
   for (i=<?=$col;?>;i>=0;i--)
      {
      iden = 'summa'+i;
      skid='sk'+i;
      mysumma2+=Number(document.getElementsByName(iden)[0].value/100)*Number(document.getElementsByName(skid)[0].value);

      }
      document.getElementsByName('skidka')[0].value=mysumma2;
   }
</script>
при первом вызове работает, а при последующих выдаёт ошибку Обьект не потдерживает это свойство или метод

   
 
 автор: m@rchello   (12.05.2007 в 11:02)   письмо автору
 
   для: m@rchello   (12.05.2007 в 10:57)
 

А в этой функции

function summ2()
   {
   mysumma1=0;
     mysumma1=Number((document.getElementsByName('summa')[0].value-document.getElementsByName('skidka')[0].value)+document.getElementsByName('dost')[0].value);
      document.getElementsByName('itogo')[0].value=mysumma1;
   }

почему то просто склеивает результаты
тоесть допусти
(document.getElementsByName('summa')[0].value-document.getElementsByName('skidka')[0].value) = 66.1
а
document.getElementsByName('dost')[0].value = 100

то в результате получается 66.11
почему так?

   
 
 автор: m@rchello   (12.05.2007 в 11:13)   письмо автору
 
   для: m@rchello   (12.05.2007 в 11:02)
 

а как в яве округлять числа до 2 знаков после точки?

   
 
 автор: ilyaILF   (12.05.2007 в 12:01)   письмо автору
 
   для: m@rchello   (12.05.2007 в 11:13)
 

Есть такая функция Math.round(0.50) http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_round которая округляет число до целого. В вашем случае можно сделать примерно сделующее, раз вам нужно получать только две цифры после запятой, то вы умножаете на 100 (если три цифры то на 1000 и так далее) свое число, применяете к полученной цифре эту функцию, результатом ее работы будет целое и делите обратно на 100 - это позволит вам получить искомый результат:
mynumb=15.3264; mynumbround=Math.round(mynumb*100)/100;
В результате должно получиться mynumbround=15.33

   
 
 автор: ilyaILF   (12.05.2007 в 11:53)   письмо автору
 
   для: m@rchello   (12.05.2007 в 11:02)
 

Функция Number() должна быть применена к каждому значению value каждого отдельного элемента, вы же складываете (делаете конкатенацию-объединение) значения строк, а потом уже их приводите к цифровому виду с помощью функции Number(). Изначально <input /> является строкой и автоматическое приведение ее к цифровому виду возможно только при перемножении, так как к строкам перемножение по просту не применимо, а сложение для значений <input /> приводит к обыкновенному объединению строк и нам надо принудительно объявить строковое значение <input /> цифрой.

   
 
 автор: m@rchello   (12.05.2007 в 12:25)   письмо автору
 
   для: ilyaILF   (12.05.2007 в 11:53)
 

с округлением разобрался
а всё же почему вот эта функция касячит?

function skid()
   {
   mysumma2=0;
   for (i=<?=$col;?>;i>=0;i--)
      {
      iden = 'summa'+i;
      skid='sk'+i;
      mysumma2+=Number(document.getElementsByName(iden)[0].value) / 100 * Number(document.getElementsByName(skid)[0].value);

      }
      document.getElementsByName('skidka')[0].value=Math.round(mysumma2*100)/100;
   }

   
 
 автор: ilyaILF   (12.05.2007 в 12:39)   письмо автору
 
   для: m@rchello   (12.05.2007 в 12:25)
 

Для полного анализа только кода Javascript недостаточно, необходимо знать количество и наличие элементов формы.
И еще, вы выводите значение i средствами PHP на сервере ОДИН РАЗ при формировании вашей HTML странички, и если вы ее не сохраните в глобальной переменной в коде JavaScript, то ее значение будет утеряно.
Вынесите объявление
var formelement=<?=$col;?>;
за пределы всех функций (то есть тем самым объявите ее глобальной) и после этого уже используйте ее в цикле сколько угодно раз.

   
 
 автор: ilyaILF   (12.05.2007 в 12:11)   письмо автору
 
   для: m@rchello   (12.05.2007 в 10:57)
 

Ставьте в цикл alert(i) и проверяйте полученные значения и соответствующие им элементы формы на наличие.

   
 
 автор: m@rchello   (12.05.2007 в 12:41)   письмо автору
 
   для: ilyaILF   (12.05.2007 в 12:11)
 

спасибо вам большое.
разобрался
но на самом деле почемуто имя функции skid резирвировалось назвал функцию skids и всё заработало!

   
 
 автор: ilyaILF   (12.05.2007 в 12:54)   письмо автору
 
   для: m@rchello   (12.05.2007 в 12:41)
 

Действительно один важный момент, который вы обнаружили на собственном опыте - название переменных, используемых в функции, никогда не должны совпадать с названием самой функции!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования