Форум сетевых администраторов
Показаны 1 сообщений на этой странице

Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- Java/Java Scripts (http://netadmin.ws/forum/forumdisplay.php?forumid=9)
-- Таблица с разворачивающимися столбцами/строками (http://netadmin.ws/forum/showthread.php?threadid=11214)


Помещено he][es 15-11-2005 в 18:25:

Таблица с разворачивающимися столбцами/строками

Итак, продолжаем тему
http://www.netadmin.ws/forum/showth...s=&postid=79432
сгенерили мы табличку. Теперь нужно сделать так, что бы столбцы и строки сворачивались и разворачивались в соответствеии с древовидной структурой.
Есть 2 стыренные функции:

PHP:


function ChangeColumnVisibility(strVisibility, intColumnNumber) {
if(
navigator.product == "Gecko" && navigator.productSub && navigator.productSub > "20041010" && (navigator.userAgent.indexOf("rv:1.8") != -1 || navigator.userAgent.indexOf("rv:1.9") != -1)) { // Mozilla 1.8alpha; see bug 76497 and bug 242368; must be higher than 1.7.x
    
var ColumnCollection = document.getElementById("limit_list").getElementsByTagName("col");
    
ColumnCollection[intColumnNumber].style.visibility = strVisibility;
} else if(
document.all && !window.opera && document.compatMode && document.compatMode == "CSS1Compat") {
    var 
ColumnCollection = document.getElementById("limit_list").getElementsByTagName("col");
    if(
strVisibility == "visible") {
        
ColumnCollection[intColumnNumber].style.display = "block";
    } else if(
strVisibility == "collapse") {
        
ColumnCollection[intColumnNumber].style.display = "none";
    }
} else if(
document.addEventListener) { // Mozilla and Opera 7.x
    
var TDCollection = document.getElementById("limit_list").getElementsByTagName("td");
    for(var 
CellIterator = 0; CellIterator < document.getElementById("limit_list").rows.length; CellIterator ++) {
        if(
strVisibility == "visible") {
            
document.getElementById("limit_list").rows[CellIterator].cells[intColumnNumber].style.display = "table-cell";
        } else if(
strVisibility == "collapse") {
            
document.getElementById("limit_list").rows[CellIterator].cells[intColumnNumber].style.display = "none";
        }
    }
}
}



function 
ChangeRowVisibility(strVisibility, intRowIndex) {
if(
navigator.product == "Gecko" && navigator.productSub && navigator.productSub > "20041010" && (navigator.userAgent.indexOf("rv:1.8") != -1 || navigator.userAgent.indexOf("rv:1.9") != -1)) {
/*
Mozilla 1.8alpha; see bug 77019 and bug 242368; must be higher than 1.7.x
Mozilla 1.8a2 supports accordingly dynamic collapsing of rows in both border-collapse models
but not 1.7.x versions */
    
document.getElementById("limit_list").rows[intRowIndex].style.visibility = strVisibility;
} else if(
strVisibility == "visible") {
    if(
document.all && document.compatMode && document.compatMode == "CSS1Compat" && !window.opera) {
        
document.getElementById("limit_list").rows[intRowIndex].style.display = "block";
    } else if(
document.getElementById && document.getElementById("limit_list").rows) { // Mozilla prior to 1.8a2, Opera 7.x and MSIE 5+
        
document.getElementById("limit_list").rows[intRowIndex].style.display = "table-row";
        
document.getElementById("limit_list").rows[intRowIndex].style.visibility = strVisibility;
    }
} else if(
strVisibility == "collapse") {
    
document.getElementById("limit_list").rows[intRowIndex].style.display = "none";
    if(
document.getElementById("limit_list").rows[intRowIndex].style.visibility) document.getElementById("limit_list").rows[intRowIndex].style.visibility = strVisibility;
}
}



Т.е. показать скрыть столбец/колонку проблем нет. И впринципе то всё работает, вопрос в том как?! и сколько... а работает плохо и ООООЧень долго...

Делаю я это так:

PHP:

function rowz() {
if (
req.readyState == 4) { 
if (
req.status == 200) {
    
response = req.responseXML.documentElement;
    
result = response.getElementsByTagName('result')[0].firstChild.data;
    
    if(
result != 0) {
        
level  = response.getElementsByTagName('level')[0].firstChild.data;
        
cleft  = response.getElementsByTagName('cleft')[0].firstChild.data;
        
cright = response.getElementsByTagName('cright')[0].firstChild.data;
        
parent_id = response.getElementsByTagName('parent')[0].firstChild.data;

        if(
parent_id != 0) {
            
loadXMLDoc('parent_row', 'http://stat/api.php?act=get_str_kks&id='+parent_id);
        }

        
cur_string = document.getElementById('tr_'+level+'_'+cleft);
        
next_level = Number(level)+1;

        if(
cur_string.firstChild.childNodes[0].value == 'hide' && (document. getElementById('tr_'+next_level+'_'+(Number(cleft)
+
1)).style.display == "none" || document. getElementById('tr_'+next_level+'_'+(Number(cleft)
+
1)).style.visibility == "collapse")) {

            for(
c=Number(cleft); c<=Number(cright); c++) {
                if (
document.getElementById('tr_'+next_level+'_'+c)) { ChangeRowVisibility('visible', document.getElementById('tr_'+next_level+'_'+c).rowIndex); }
            }
            
cur_string.firstChild.childNodes[0].value = 'show';
            
cur_string.firstChild.childNodes[1].src = '/images/minimise.gif';
        } else if (
cur_string.firstChild.childNodes[0].value == 'show' || ((document. getElementById('tr_'+next_level+'_'+(Number(cleft)
+
1)).style.display == "table-row" || document. getElementById('tr_'+next_level+'_'+(Number(cleft)
+
1)).style.display == "block") || document. getElementById('tr_'+next_level+'_'+(Number(cleft)
+
1)).style.visibility == "visible")) {
            for(
x=Number(next_level); x<=Number(kks_max_level); x++) { for(c=Number(cleft); c<=Number(cright); c++) {
                if (
document.getElementById('tr_'+x+'_'+c)) { act_string = document.getElementById('tr_'+x+'_'+c); ChangeRowVisibility('collapse', act_string.rowIndex); if(act_string.firstChild.childNodes[0] && act_string.firstChild.childNodes[1]) { act_string.firstChild.childNodes[0].value = 'hide'; act_string.firstChild.childNodes[1].src = '/images/maximise.gif'; } }
            }}
            
cur_string.firstChild.childNodes[0].value = 'hide';
            
cur_string.firstChild.childNodes[1].src = '/images/maximise.gif';
        }
    }
}}
}


сюда нам приходит XMLка с информацией о "ветке" на которую мы нажали, (как правильно посоветовал Xrobak про деревья посм. можно здесь http://phpclub.ru/detail/article/db_tree) её id, left, right, level, parent, etc. Вот в таком виде:

code:
<?xml version="1.0" encoding="windows-1251" standalone="yes"?>
<response>
    <method>get_str_kks</method>
    <result>1</result>
    <id>2</id>
    <title>Головное отделение</title>
    <root_id>1</root_id>
    <cleft>2</cleft>
    <cright>61</cright>
    <parent>1</parent>
    <norder>1</norder>
    <level>2</level>
    <name>не указано</name>
    <info>не указано</info>
</response>


Мы её (XMLку) разобрали, и знаем, какие элементы нужно показать/скрыть. Но перебор с 2 до 61 вида
for(c=Number(cleft); c<=Number(cright); c++) {
if (document.getElementById('tr_'+next_level+'_'+c)) { ChangeRowVisibility('visible', document.getElementById('tr_'+next_level+'_'+c).rowIndex); }
}
для показа и
for(x=Number(next_level); x<=Number(kks_max_level); x++) { for(c=Number(cleft); c<=Number(cright); c++) {
if (document.getElementById('tr_'+x+'_'+c)) { act_string = document.getElementById('tr_'+x+'_'+c); ChangeRowVisibility('collapse', act_string.rowIndex); }
}}
для скрытия работают ОЧЕНЬ долго...
ТАк же стоит упомянуть о размерах таблицы (100строк Х 70столбцов).
Вот. И совственно вопрос, ПОМОГИТЕ ОПТИМИЗИÐ_ОВАТЬ Ð_ТУ ХÐ_ЕНЬ!
Что бы работало правильно и быстро... У меня уже мозги пухнут!

__________________
Админ - вождь Апачей...


Формат времени GMT. Текущее время 15:20.
Показаны 1 сообщений на этой странице

Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.