Замена значений ячеек таблицы.
Здравствуйте. есть у меня таблица. в ней есть поля "название", "цена".
Цена - в рублях. Мне нужно, чтобы при каком-то действии происходил пересчет цены в другую валюту ну и соответственный вывод цифирь в нужную ячейку. Курс валюты тоже содержится в отдельной табличке в своей ячейке. |
Блин, мало того что последнее время перестали просто вопросы задавать, а нагло просить сделать работу за них, так еще и задачу описывают методом "Сделай то не знаю что, но что бы работало!". Подробнее нельзя!? С примером таблицы и т.д.!? А то после такого описания задачи, не то что желание помочь пропадает, даже разбираться что вы хотите (да какой там разбираться, скорее гадать).
|
чувак. куда подробнее. Есть 2 таблички. В 1й таблице в одной из ячеек есть цифра. 36.
И есть 2я таблица. Содержит много строк и несколько ячеек в каждой строке. Одна ячейка в строке содержит некое число. Так вот. Мне нужна какаянибудь функция, чтобы по нажатии на кнопку или ссылку или еще чего происходила замена значений ячеек с числом во 2й таблице. Замена такая "ячейка 2я таблица / ячейка 1й таблицы". Ну грубо говоря 24000/36 |
Цитата:
|
В общем вот пример
<table id="t"> <tr><td>Текст</td><td>Текст</td><td>2890</td></tr> <tr><td>Текст</td><td>Текст</td><td>545</td></tr> <tr><td>Текст</td><td>Текст</td><td>4545</td></tr> <tr><td>Текст</td><td>Текст</td><td>4575</td></tr> </table> table.rows[0].cols[2].innerHTML=2890/28; table.rows[1].cols[2].innerHTML=545/28; table.rows[2].cols[2].innerHTML=4545/28; table.rows[3].cols[2].innerHTML=4575/28; Только этих td гораздо больше. И каждое значение мне нужно помножить, скажем, на 28 и вывести уже обновленную ячейку. Я так понимаю нужен цикл, но плохое знание javascript не позволяет мне просто так это реализовать. мне нужно во первых узнать общее количество этих td, в которых содержатся числа, во вторых в цикле выполнить простую операцию деления и в конце чтобы вывелись обновленные значения. |
забыл
var table=document.getElementById("t"); |
Ну тогда как то вот так:
function operation(){ var td1 = document.getElementById('table1').getElementsByTagName('td'); var tr2 = document.getElementById('table2').getElementsByTagName('tr'); var i = 0; while(i < tr2.length){ var td2 = tr2[i].getElementsByTagName('td'); var value = parseFloat(td2[2].innerHTML) / parseFloat(td1[1].innerHTML) td2[2].innerHTML = value; i++; } } <table id='table1' border="1"> <tr> <td>какие то данные</td> <td>36</td> <td>какие то данные</td> </tr> </table> <br> <table id='table2' border="1"> <tr> <td>какие то данные</td> <td>какие то данные</td> <td>24000</td> </tr> <tr> <td>какие то данные</td> <td>какие то данные</td> <td>24000</td> </tr> <tr> <td>какие то данные</td> <td>какие то данные</td> <td>24000</td> </tr> </table> <br> <span style="color:#99cc33" onclick="operation()">Замена</span> Дальше уже додумаете или переделаете под свои нужды. Но идея примерно такая. |
уже помогли... не успел :)
|
благодарю )
|
что то я не пойму. с вашим вариантом все понятно. Я даже понял как он работает. Но вот сюда никак не могу перенести:
<script type="text/javascript"> function operation(){ var td1 = document.getElementById('table1').getElementsByTagName('td'); var tr2 = document.getElementById('color').getElementsByTagName('tr'); var i = 0; while(i < tr2.length){ var td2 = tr2[i].getElementsByTagName('td'); var value = parseFloat(td2[3].innerHTML) / parseFloat(td1[1].innerHTML) td2[3].innerHTML = value; i++; } } </script> </head> <body> <table id='table1' border="1"> <tr> <td>какие то данные</td> <td>36</td> <td>какие то данные</td> </tr> </table> <br /> <table width='100%' id='color' border=0> <tr><th>артикул</th> <th>Наименование <a href=/pricelist/catalog.php?n_cat=314&o=1&b=1&back=1> </th> <th> </th> <th>Цена</th><th> </th></tr><tr onmouseover="this.style.cursor='hand';"><td width='10%' align='center'><span class='font'>GEH-NX-CAL.BS</span> </td><td width='80%'>Корпус ATX JET Computer Calypso (игровой/без блока/боковое окно /12cm вент/2usb/2audio/firewire) Black/Metall</td><td width='2%'> </td> <td width='14%' align='center'>4409.52</td> <td><a href=where.php?n=38431&n_cat=314&back=1><img src="images/AideSZ_0001.png" alt="Где?" border="0" /></a></td> </tr><tr onmouseover="this.style.cursor='hand';"><td width='10%' align='center'><span class='font'>GEH-JCP-SPIDER.</span> </td><td width='80%'>Корпус ATX JET Computer Spider (с термосенсором/без блока/боковое окно /12cm воздузовод) Black</td><td width='2%'> </td> <td width='14%' align='center'>3492.34</td> <td><a href=where.php?n=38427&n_cat=314&back=1><img src="images/AideSZ_0001.png" alt="Где?" border="0" /></a></td> </tr><tr onmouseover="this.style.cursor='hand';"><td width='10%' align='center'><span class='font'> </span> </td><td width='80%'>Корпус ATX AOpen G528 Black-Silver 450W (USB,card reade, audio, 1394)</td><td width='2%'> </td> <td width='14%' align='center'>3393.38</td> <td><a href=where.php?n=38985&n_cat=314&back=1><img src="images/AideSZ_0001.png" alt="Где?" border="0" /></a></td> </tr><tr onmouseover="this.style.cursor='hand';"><td width='10%' align='center'><span class='font'></span> </td><td width='80%'>Корпус ATX AOpen QF50C Silver-Black 350W P4</td><td width='2%'> </td> <td width='14%' align='center'>1656.73</td> <td><a href=where.php?n=34055&n_cat=314&back=1><img src="images/AideSZ_0001.png" alt="Где?" border="0" /></a></td> </tr><tr onmouseover="this.style.cursor='hand';"><td width='10%' align='center'><span class='font'>DA-01WD-D</span> </td><td width='80%'>Корпус ATX Chieftec DA-01WD-D White 400W (с дверцей)</td><td width='2%'> </td> <td width='14%' align='center'>2849.87</td> <td><a href=where.php?n=29594&n_cat=314&back=1><img src="images/AideSZ_0001.png" alt="Где?" border="0" /></a></td> </tr><tr onmouseover="this.style.cursor='hand';"><td width='10%' align='center'><span class='font'> </span> </td><td width='80%'>Корпус ATX Gigabyte GZ-AA3CB-SJB Poseidon 310 Black (без БП, 2xUSB)</td><td width='2%'> </td> <td width='14%' align='center'>3443.58</td> <td><a href=where.php?n=37939&n_cat=314&back=1><img src="images/AideSZ_0001.png" alt="Где?" border="0" /></a></td> </tr><tr onmouseover="this.style.cursor='hand';"><td width='10%' align='center'><span class='font'>75917</span> </td><td width='80%'>Корпус ATX Gigabyte GZ-AX1CA-SDB Triton 180 Black w/o PSU </td><td width='2%'> </td> <td width='14%' align='center'>2909.69</td> <td><a href=where.php?n=32598&n_cat=314&back=1><img src="images/AideSZ_0001.png" alt="Где?" border="0" /></a></td> </tr></table> <span style="color:#99cc33" onclick="operation()">Замена</span> </body> </html> может я чего то не понимаю ??? |
Фига се! Убрал <th> из таблицы и заработало. странно как то
народ. помогите, ну правда, очень надо. |
Дело в том что для разметки шапки вы испольуете тег <th>, поэтому в массиве tr2 в нулевой позиции содержится его содержимое, в итоге поиск по тегу 'td' в tr2[0] дает провал, вот скрипт и не работает выкидывая ошибку. Это легко можно изменить если исправить начальное значение индекса i с 0 на 1.
var i = 1; Еще можете при выводе значения в поле (строчка): td2[3].innerHTML = value вызвать метод toFixed() у значения value (а то как то не красиво смотрится работа скрипта :/ ), тогда получится вот так: td2[3].innerHTML = value.toFixed(2); |
спасибо. попробую )
|
Сделал в итоге вот так.
<script type="text/javascript"> function zamena(){ var kurs = document.getElementById('kurs').innerHTML; var tr = document.getElementById('color').getElementsByTagName('tr'); var i = 1; while(i < tr.length){ var td = tr[i].getElementsByTagName('td'); var value = parseFloat(td[3].innerHTML) / parseFloat(kurs); td[3].innerHTML = value.toFixed(2); i++; } } </script> <table><tr> <td align="center" nowrap valign="middle"><input name="in_rub" type="checkbox" id="in_rub" onclick="zamena()" /></td> <td align="center" nowrap valign="middle">Показать цену в у.е.</td> </tr></table> В итоге, каждый раз когда нажимаю на чекбокс происходит деление. А как сделать так чтобы по отжатию все возвращалось на прежние значения ? |
Сделал так
function zamena(){ var kurs = document.getElementById('kurs').innerHTML; var tr = document.getElementById('color').getElementsByTagName('tr'); var i = 1; if (document.getElementById("in_rub").checked==true) { while(i < tr.length){ var td = tr[i].getElementsByTagName('td'); var value = parseFloat(td[3].innerHTML) / parseFloat(kurs); td[3].innerHTML = value.toFixed(2); i++; } } if (document.getElementById("in_rub").checked==false) { while(i < tr.length){ var td = tr[i].getElementsByTagName('td'); var value = parseFloat(td[3].innerHTML) * parseFloat(kurs); td[3].innerHTML = value.toFixed(2); i++; } } } Но вероятнее всего, что это неправильно. Потому что сотые доли в итоге меняются при обратном преобразовании. Может быть еще как то можно решить эту же задачу ? сама таблица с данными формируется php скриптом. |
Тогда нужно вешать событию деления не на onclick, а на onmousedown и сохранять исходные значения в какой нибудь массив или переменные, которые по событию onmouseup будут обратно записываться. Ну либо в Вашем сучае false или true.
|
я так и подумал, но все, опять же, упирается в знание javascript.
|
Заведите какой нибудь массив в функции, перед условиями на true и false. и в Цикле:
var old[]; while(i < tr.length){ // запишите в него значения из ячеек таблицы var td = tr[i].getElementsByTagName('td'); old[i] = td[3].innerHTML; i++; } /* теперь у Вас в массиве old сохранены значения ячеек с исходными значениями и теперь можно в дальнейшем для вычисления значений использовать его. например так */ if (document.getElementById("in_rub").checked==true) { i = 1; while(i < tr.length){ var td = tr[i].getElementsByTagName('td'); var value = parseFloat(old[i]) / parseFloat(kurs); td[3].innerHTML = value.toFixed(2); i++; } } /* а обратное преобразование и того будет проще, просто в цикле без всяких вычислений, записывайте в нужную клетку созраненное ранее значение. Вот таким образом */ td[3].innerHTML = old[i]; |
есть трабла. суть вот в чем.
я делаю checked. оно становится true, значения меняются. При unchek'е происходит новый вызов функции и ввод туда новых значений. в итоге ничего не получается. тут видимо нужен какой то иной метод вызова или еще что то |
что значит ничего не получается?
http://getfirebug.com/ |
madgals,
Да я напортачил еще с логикой, если сохранять значения ячеек таблицы в самой функции замена, то будет не правильно (логически). Поэтому лучше делайте это перед вызовом функции, или сохраните значения глобально по window.onload. |
Ну что же. попробую.
|
значения можно в функции хранить (типа статические переменные)
arguments.callee.old = [] var old = arguments.callee.old; while(i < tr.length){ // запишите в него значения из ячеек таблицы var td = tr[i].getElementsByTagName('td'); old[i] = td[3].innerHTML; i++; } |
Кстати да, способ предложенный x-yuri будет даже лучше и по производительности и вообще по элегантности :)
to x-yuri, а конструкция arguments.callee это что то на подобие static в СИ!? только для данного скопа да!? |
если функция глобальная (func), то
arguments.callee === func это я так, скорее всего автор может просто обойтись названием функции |
Цитата:
|
Цитата:
P.S. Такая конструкция arguments.callee.old = [] у меня ни в одном браузере не заработала. надо arguments.callee.old = new Array() |
Цитата:
|
я понимаю, что одно и тоже. Но, увы, не работает.
|
Цитата:
Цитата:
http://getfirebug.com/ |
Цитата:
|
q--b,
Если Вы не заметили, то топикстартеру нужно чтобы значения в таблице перестчитывались и заменялись если стоит определенный флаг или действие, и возвращались обратно, по отмене этого действие (чекбокс). Цитата:
|
Цитата:
Цитата:
вот готовый пример...http://club.dyndns.biz/dom/tab.php создадим файл header.inc с кодом Код:
<?php Код:
<?php создадим файл сценария check.php с кодом Код:
<?php Код:
<?php Для корректной работы все должно лежать в одной папке на сервере! Оговорка - много хтмл ошибок,но хтмл можно менять не трогая скрипт! Ячейкам с ценой присвоены id чтобы вам было удобно потом работать с js. Есть дырка и может не одна,но если пива поставите - напишу патч! Возможен вариант, что напишу все полностью вместе с javascript обновлением цены,но это уже за денежку, хотя. . .может и так напишу если время будет ,ибо мне это тоже пригодится. . .:) |
Цитата:
Цитата:
И давно хотел у Вас спросить уважаемый q--b почему Вы начинаете предлагать свои вселенские варианты решения только после того как топик стартер скажет всем спасибо за помощь и заветные слова "Проблема решена!"!? P.S. Даже спорить с Вами не хочется больше, извините но если Вам не нравится мое решение данного вопроса, то это не означает что оно не правильно или единственно верное. Если Вы не в курсе, то воду можно пить не только из чашки, но и из бутылки, из под крана, с рук etc, другой вопрос от чего ты останешься доволен. P.P.S. Просьба к Администрации, удалите этот флуд и флейм на тему "В ИНТЕРНЕТЕ СНОВА КТО ТО НЕ ПРАВ", а то на мой взгляд портит всю картину более менее нормального топика, человек обратился с задачей ему показали как можно сделать. Он попробовал (реально старался, было видно что не просто выпрашивает код, а и сам что то делает. Далее усложнил задачу, ему помогли разобраться, в итоге человек остался доволен. Больше бы таких добродушных топиков). Но под конец пришел Черный властелин в лице анонимуса и начал вершить суд над неверными. Простите, накипело просто. |
Цитата:
p.s. продолжаю усовершенствовать код доберусь и до js задумки уже есть ! Пример доступен все так же по адресу http://club.dyndns.biz/tab/tab.php Плохо,что на работу утром :mad: . . . |
q--b
посмотрел твой примерчег. все целиком решается на стороне сервера. В моем случае это было неприемлемо. Перезагрузка страницы - это лишнее. Был найден способ с джава скриптом и dhtml'ом. Если что то предлагать дальше, то AJAX, а никак не чистый пхп. P.S.И харе флудить. тут не phpclub, тут javascript и вопросы тут по javascript. А если есть желание блеснуть знаниями php то вперед на phpclub. |
madgals, если ты не рассчитываешь на пользователей с отключенным js, то надо делать на js. Если же ты хочешь сделать страничку более доступной, можно сделать на php, а поверх этого, если js включен, сделать вариант на javascript
|
x-yuri
Javascript'а на сайте сейчас не так уж и много. Только раскраска строк таблицы, перевод в у.е. и вывод схемы проезда до точки. Так что не думаю что будут проблемы с отображением. |
дело не в много/мало, а в том, рассчитываешь ли ты на людей с отключенным js
|
Цитата:
P.S. Если судить о включенном/не включенном JS и спорить на эту тему, то могу привести как веский аргумент vkontakte.ru, кол-во пользователей этого ресурса, наглядный показатель включенности JS в рунете :) . А для пользователей с PDA делают специальную версию сайта, порой это дешевле/проще/меньше грузит сервер/%еще какой то вариант%, чем выдумывать универсальные способы решения задачи для десятой доли процента, которые порой не оправдают потраченного времени и ресурсов. :) (это так, мысли в слух) |
Часовой пояс GMT +3, время: 22:50. |