Вход

Просмотр полной версии : Помогите вывести и посчитать значения ячеек в таблицах


uznik73
13.07.2011, 13:30
Весь код страницы во вложенном файле.
в результате работы скрипта на страницу выводятся таблицы такого вида

<div class="if_right">
<table class="if_ch">
<tbody>
<tr>
<td class="if_ch_name ">
<span title="">Уровень жизни</span>
</td>
<td class="if_ch_val ">18.4</td>
</tr></tbody></table>
<table class="if_ch">
<tbody>
<tr>
<td class="if_ch_name ">
<span title="">Эфф. доп. уровня жизни, %</span>
</td>
<td class="if_ch_val ">36.2</td>
</tr>
</tbody>
</table>
<div class="if_grp dbrown">
<div>Голова, руки, корпус, ноги:</div>
</div>
<table class="if_ch">
<tbody>
<tr>
<td class="if_ch_name ">
<span title="">Прочность доп. брони</span>
</td>
<td class="if_ch_val ">1.5</td>
</tr>
</tbody>
</table>
<table class="if_ch">
<tbody>
<tr>
<td class="if_ch_name ">
<span title="">Броня</span>
</td>
<td class="if_ch_val ">1.2</td>
</tr>
</tbody>
</table><table class="if_ch">
<tbody>
<tr>
<td class="if_ch_name ">
<span title="">Стойк. к дробящему урону</span>
</td>
<td class="if_ch_val ">1.2</td>
</tr>
</tbody>
</table>
</div>

таких дивов несколько. не могу сообразить как посчитать одинаковые ячейки таблиц (тобишь есть два дива нужно сложить значение ячеек к примеру с Прочность доп. брони)
посоветовали сделать:

function getElementsByClassName(classname, node) {
if(!node) node = document.getElementsByTagName("body")[0];
var a = [];
var re = new RegExp('\\b' + classname + '\\b');
var els = node.getElementsByTagName("*");
for(var i=0,j=els.length; i<j; i++)
if(re.test(els[i].className))a.push(els[i]);
return a;
var elements = getElementsByClassName('if_ch_val');
var sum = 0;
for (var key in elements) {
sum += parseFloat(elements[key].innerHTML);
}
document.getElementById('result').innerHTML = sum;
но выдает 0..
function calculate() {
var a = document.getElementsByClassName("if_ch_value").value;
var b = document.getElementsByClassName("if_ch_value").value;
var c = a+b;
document.getElementById("summa").value = с;

}
рабочий код можно посмотреть тут (http://odyssey-mist.ru/upgrades.html)

ksa
13.07.2011, 13:39
обишь есть два дива нужно сложить значение ячеек к примеру с Прочность доп. брони
В твоём примере такой ДИВ один... :)

У табличек с данными всегда один класс - if_ch?

uznik73
13.07.2011, 13:42
да, классы всегда одни

ksa
13.07.2011, 13:46
да, классы всегда одни
Ну это уже что-то! :)

Тогда ходи по всем табличкам, проверяй имя класса... Если это она - используй коллекции rows у таблички и cells у строк, проверяй значение первой ячейки (это как тип стороки) и значение второй (это собственно данные). Переводи все из строки в число и суммируй нужное...

uznik73
13.07.2011, 14:17
Спасибо, буду пробовать..
Но пока как то слабо себе это представляю:)

ksa
13.07.2011, 15:03
Но пока как то слабо себе это представляю
Начни с простого тестового примера... На нём прямо тут можно будет всё показать.

uznik73
13.07.2011, 15:35
нашел тут пример один решил по нему попробовать:
function getText(n) {
var strings = [];
getStrings(n, strings);
return strings.join(" ");
function getStrings(n, strings) {
if (n.nodeType == 3 /* Node.TEXT_NODE */)
strings.push(n.data);
else if (n.nodeType == 1 /* Node.ELEMENT_NODE */) {
for(var m = n.firstChild; m != null; m = m.nextSibling) {
getStrings(m, strings);
}
}
}
}
//перебирает все table на странице, пример с таблицами в первом посте.

кнопкой <input value="Подсчет текста на странице" type="button" onClick="alert(getText(document.getElementsByTagName('table ')[5]))">
получай из него в алерт результат в виде "Уровень жизни 18.4"
Я так понимаю строку такого вида надо преобразовывать в строку только со значением вида "18,4"?
а далее делать как то примерно так:
function calculate(){
var a = getText(document.getElementsByTagName('table')[5]));
var b = getText(document.getElementsByTagName('table')[10]));
var c = a+b;
document.getElementById("summa") = c;
} -только такая конструкция не работает :-?

ksa
13.07.2011, 15:40
uznik73, в твоём первоначальном примере "тип строки" и "цифра" были в разных ячейках...

ksa
13.07.2011, 15:49
uznik73, вот как выглядит путёвый тестовый пример...

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<style type="text/css">
</style>
<script type="text/javascript">
function Get() {
var ot=document.getElementsByTagName('table')
var i=0
var val
while (ot[i]) {
if (ot[i].className!='if_ch') {
i++
continue
}
val=ot[i].rows[0].cells[1].innerHTML
alert(val)
i++
}
}
</script>
</head>
<body>
<table>
<tbody>
<tr>
<td>
<span>Test</span>
</td>
<td>100</td>
</tr>
</tbody>
</table>
<table class="if_ch">
<tbody>
<tr>
<td class="if_ch_name ">
<span title="">Уровень жизни</span>
</td>
<td class="if_ch_val ">18.4</td>
</tr>
</tbody>
</table>
<button onclick='Get()'>Get</button>
</body>
</html>

uznik73
13.07.2011, 16:27
Спасибо. но так он мне выдает все результаты без разбора то есть если у меня идет такой код

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<style type="text/css">
</style>
<script type="text/javascript">
function Get() {
var ot=document.getElementsByTagName('table')
var i=0
var val
while (ot[i]) {
if (ot[i].className!='if_ch') {
i++
continue
}
val=ot[i].rows[0].cells[1].innerHTML
alert(val)
i++
}
}
</script>

</head>
<body>
<table class="if_ch">
<tbody>
<tr>
<td class="if_ch_name ">
<span title="">Уровень жизни</span>
</td>
<td class="if_ch_val ">18.4</td>
</tr>
</tbody>
</table>
<table class="if_ch">
<tbody>
<tr>
<td class="if_ch_name ">
<span title="">Уровень жизни</span>
</td>
<td class="if_ch_val ">20.5</td>
</tr>
</tbody>
</table>
<table class="if_ch">
<tbody>
<tr>
<td class="if_ch_name ">
<span title="">Уровень маны</span>
</td>
<td class="if_ch_val ">8.4</td>
</tr>
</tbody>
</table>

<button onclick='Get()'>Get</button>
</body>
</html>

Нужно выбрать из трех таблиц только 2(или 3\4\5 если они есть) которые называются как "Уровень жизни"
далее так же с "Уровень маны" и т.д
а в исходном виде оно берет сразу все значения из-за того что у всех одинаковый класс "if_ch" а сделать разные классы для различных переменных возможности нет..
ps
это если я правильно понял что alert(val[0]) выдаст 1, тоесть каждая цифра записана отдельно...

ksa
13.07.2011, 16:50
Нужно выбрать из трех таблиц только 2(или 3\4\5 если они есть) которые называются как "Уровень жизни"
Таки начинай читать другие ячейки... Проверяй их значения... Это и называется "писать программу". :D

uznik73
13.07.2011, 17:49
Проверяй их значения... Это и называется "писать программу". :D
в javascript я не силен потому задаю глупые вопросы):-?
Дотумкать как проверять именно по значениям мне не удалось:D
в общем сделал так:
<!DOCTYPE html>
<html>
<head>
<title>test</title>
<style type="text/css">
</style>
<script type="text/javascript">
function Get() {
var ot=document.getElementsByTagName('table')
var i=2
var s=1
var val
while (ot[i]) {
if (ot[i].className!='if_ch') {
i++
continue

}
val=ot[i].rows[0].cells[1].innerHTML+ot[s].rows[0].cells[1].innerHTML
alert(val)
i++
}
}
</script>

</head>
<body>
<table>
<tbody>
<tr>
<td>
<span>Test</span>
</td>
<td>1020</td>
</tr>
</tbody>
</table>
<table class="if_ch">
<tbody>
<tr>
<td class="if_ch_name ">
<span title="">Уровень жизни</span>
</td>
<td class="if_ch_val ">2.4</td>
</tr>
</tbody>
</table>
<table class="if_ch">
<tbody>
<tr>
<td class="if_ch_name ">
<span title="">tes</span>
</td>
<td class="if_ch_val ">12.4</td>
</tr>
</tbody>
</table>

<button onclick='Get()'>Get</button>
</body>
</html>
В общем если ставить так
val=ot[i].rows[0].cells[1].innerHTML*ot[s].rows[0].cells[1].innerHTML
то значения перемножаются, если "+" то складываются но не математическим действием а просто выводит оба значения..
В общем то нубский вопрос, сегодня пока гуглил на решение моей проблемы видел где то писали про знак плюс в javascript, не подскажете где можно про это почитать? А то что то сейчас уже не могу найти..:-?

ksa
14.07.2011, 09:37
в javascript я не силен
А в чём силён?

если "+" то складываются но не математическим действием а просто выводит оба значения..
Как вариант...

var a='1'
var b='2'
alert(a+b)
a=+a
b=+b
alert(a+b)

uznik73
14.07.2011, 13:09
А в чём силён?
Гугло поиске например) Шучу конечно..) Просто раньше мне вполне хватало банального html+css+copipast скриптов с гугла...
А сейчас вот приспичило сделать для себя такую вот фиговину и как оказалось гугл тут бессилен :lol:
Как вариант...
Спасибо, я сделал так
val=(+ot[i].rows[0].cells[1].innerHTML+ +ot[s].rows[0].cells[1].innerHTML)
всё складывает вроде как хорошо...
В общем такой поиск по странице решил пока отложить, все же что бы добиться нужного мне результата нужно прописывать много условий а т.к в них я совсем ничего не понимаю врятли что то получится (готовый скрипт за меня каждый раз никто писать не будет, будем изучать:) )
На данный момент решил для вывода нужных мне элементов использовать xpatch получился такой скрипт
function Get() {
var headings = document.evaluate("//span[text()='Броня']/../../td[2]", document, null,
XPathResult.ANY_TYPE, null
);
var thisHeading = headings.iterateNext();
var alertText = "Прочность доп. брони:\n"

while (thisHeading) {
alertText += thisHeading.textContent + "\n"
thisHeading = headings.iterateNext();
}
document.getElementById('result').innerHTML = alertText;
}
таким прекрасно находится любой нужный элемент, но одна проблема. для построения страницы я использую множество iframe, как в javasqript xpatch'у указать фрейм для поиска? в php нашел как а в javascript пока что то никак..