powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / HTMLTableRowElement.getElementsByName && span
6 сообщений из 6, страница 1 из 1
HTMLTableRowElement.getElementsByName && span
    #34723537
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Необходимо реализовать унифицированную функцию печати info из одной страницы-источника в другую страницу-шаблон по указанной связке "источник"-"получатель". На пальцах это выглядит так:
Страница-источник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<input type="text" id="Department" value="bla-bla-bla">
<table style="width: 100%; " cellspacing="0" cellpadding="0" border="1">
        <tr>
                <td align="center">Ф. И. О.</td>
                <td align="center">ДР</td>
        </tr>
        <tr>
                <td align="left"><span name="FIO">Иванов Иван Иванович</span></td>
                <td align="center"><span name="DR"> 01 . 01 . 1913 </span></td>
        </tr>
        <tr>
                <td align="left"><span name="FIO">Сидоров Сидор Сидорович</span></td>
                <td align="center"><span name="DR"> 01 . 01 . 1937 </span></td>
        </tr>
        <tr>
                <td align="left"><span name="FIO">Петров Петр Петрович</span></td>
                <td align="center"><span name="DR"> 01 . 01 . 1913 </span></td>
        </tr>
</table>
Страница-получатель
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
<span id="Department"></span>
<table style="width: 100%; " cellspacing="0" cellpadding="0" border="1">
        <tr>
                <td id="FIO" align="center">Ф. И. О.</td>
                <td id="DR"align="center">ДР</td>
        </tr>
</table>
Связка, ессесно,
Страница-источник.Department -> Страница-получатель.Department,
Страница-источник.FIO -> Страница-получатель.FIO, Страница-источник.DR -> Страница-получатель.DR.
В общем виде все просто, как арбуз:
Код: plaintext
1.
2.
3.
4.
5.
for(var i= 0 ; i<Связка.length; ++i)
{
   Получить значение Связка[i] control'а на странице-источнике;
   Записать значение Связка[i] control'а на странице-получателе;
}
Для control'ов, лежащих вне таблицы, это, действительно, тривиально. А, вот, когда подходим к control'ам внутри таблицы - тут получается заковыка: как получить HTMLSpanElement? HTMLTableRowElement.getElementsByName - ниц :( А в DOM'е у span'а name - ниц :( В HTMLTableRowElement.cells [ i ].innerHTML ковырятся? Хорошо. Но как тогда вычислить "кто на ком стоял" если в cell будет несколько span'ов? Брать в HTMLTableRowElement.cells [ i ].innerHTML innerHTML span'а и потом сравнивать его со всеми HTMLSpanElement.innerHTML'ями в childNodes? Неэстетично как-то:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
function RowGetElementsByName(aRow,aTag,aName)
{
        var
                OutputArray=new Array(),
                reCtrl=new RegExp("<"+aTag+".*?>.*?</"+aTag+">","ig"),
                reName=new RegExp("name=\""+aName+"\""),
                reInnerHTML=new RegExp(">.*?<","g"),
                Ctrls,
                iHs,
                CtrlsByTag,
                iH;

        for(var i= 0 ; i<aRow.cells.length; ++i)
        {
                Ctrls=aRow.cells[i].innerHTML.match(reCtrl);
                if(Ctrls.length== 0 )
                        continue;

                for(var ii= 0 ; ii<Ctrls.length; ++ii)
                {
                        if(Ctrls[ii].search(reName)==- 1 )
                                continue;

                        iHs=Ctrls[ii].match(reInnerHTML);
                        if(iHs.length== 0 )
                                continue;

                        CtrlsByTag=aRow.cells[i].getElementsByTagName(aTag);
                        for(var j= 0 ; j<iHs.length; ++j)
                        {
                                iH=iHs[j].substring( 1 ,iHs[j].length- 1 );
                                for(var jj= 0 ; jj<CtrlsByTag.length; ++jj)
                                        if(iH==CtrlsByTag[jj].innertHTML)
                                                OutputArray.push(CtrlsByTag[jj]);
                        }
                }
        }

        return(OutputArray);
}
М.б. это можно сделать более по-людськи? Какие есть другие пути решения данной проблемы?

P.S. Подсказали насчет className... Не спорю: с className, действительно, получается поэлегантнее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function RowGetElementsByClassName(aRow,aTag,aClassName)
{
        var
                OutputArray=new Array(),
                CtrlsByTag;

        for(var i= 0 ; i<aRow.cells.length; ++i)
        {
                CtrlsByTag=aRow.cells[i].getElementsByTagName(aTag);
                for(var ii= 0 ; ii<CtrlsByTag.length; ++ii)
                        if(CtrlsByTag[ii].className.substring( 0 ,aClassName.length)==aClassName)
                                OutputArray.push(CtrlsByTag[ii]);
        }

        return(OutputArray);
}
Однако, если className, юзается в прямом своем предназначении - необходимо уже вводить ограничения/правила его обзывания ;)...
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
HTMLTableRowElement.getElementsByName && span
    #34724009
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function RowGetElementsByClassName(aRow,aTag,aName)
{
        var
                OutputArray=new Array(),
                CtrlsByTag;

        for(var i= 0 ; i<aRow.cells.length; ++i)
        {
                CtrlsByTag=aRow.cells[i].getElementsByName(aName);
                for(var ii= 0 ; ii<CtrlsByTag.length; ++ii)
                        if(CtrlsByTag[ii].tagName==aTag.toUpperCase())
                                OutputArray.push(CtrlsByTag[ii]);
        }

        return(OutputArray);
}
...
Рейтинг: 0 / 0
HTMLTableRowElement.getElementsByName && span
    #34724099
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LINUXER
Код: plaintext
1.
...cells[i].getElementsByName();

Ex_Soft
HTMLTableRowElement.getElementsByName - ниц :(

аналогично и у HTMLTableCellElement ;)
C Mozilla -> Tools -> Web Development -> DOM Inspector || Mozilla FireFox -> Tools -> DOM Inspector Ну и google само собою ;) (с учетом тынць , тынць (правда, мо, щаз это уже закрыто - пока не проверял))
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
HTMLTableRowElement.getElementsByName && span
    #34724591
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
аналогично и у HTMLTableCellElement ;)

ах вот как=(
Ex_Soft
А в DOM'е у span'а name - ниц :(
И почему спану не полагается имя=(
но вот так можно достать:)
.getAttribute("name")
...
Рейтинг: 0 / 0
HTMLTableRowElement.getElementsByName && span
    #34725112
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LINUXER
getAttribute("name")


Все решилось очень даже красиво:
Код: plaintext
1.
2.
if(CtrlsByTag[i].name==aName
   || CtrlsByTag[i].getAttribute("name")==aName)
Однако осел, как всегда, оказался ослом и подложил свинью в виде getElementsByName :( ... Ну и как теперь? Полный перебор? Как можно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function GetCtrlsByIdName(aDocument,aCtrlId)
{
	var
		Ctrl,
		Ctrls;

	if(Ctrl=aDocument.getElementById(aCtrlId))
	{
		Ctrls=new Array();
		Ctrls[ 0 ]=Ctrl;
	}
	else
		Ctrls=aDocument.getElementsByName(aCtrlId);

	return(Ctrls);
}
кросс'browser'но с минимальными затратами переделать?
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
HTMLTableRowElement.getElementsByName && span
    #34726675
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft
Однако осел, как всегда, оказался ослом и подложил свинью в виде getElementsByName :( ... Ну и как теперь? Полный перебор? Как можно

Это уже сложнее =)
Можно сделать как в предыдущую, но aTag="*"
тот же перебор, но кода мало
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / HTMLTableRowElement.getElementsByName && span
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]