Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как сбросить видимость нескольких объектов сразу (https://javascript.ru/forum/misc/2825-kak-sbrosit-vidimost-neskolkikh-obektov-srazu.html)

legal 15.02.2009 02:14

как сбросить видимость нескольких объектов сразу
 
Приветствую,
Есть список объектов со своими id, видимость которых попеременно переключается. Соответственно другие, кроме нужного приходиться сбрасывать. Сейчас делаю это весьма громоздкой кострукцией:

function mk1() {
	 	document.all.mark1.style.display='';
		document.all.mark2.style.display='none';
		document.all.mark3.style.display='none';
		document.all.mark4.style.display='none';
		...
                          document.all.mark66.style.display='none';
		document.all.mark67.style.display='none';
		}
        ...
        ...
	function mk67() {
	 	document.all.mark1.style.display='none';
		document.all.mark2.style.display='none';
		document.all.mark3.style.display='none';
		document.all.mark4.style.display='none';
		...
		document.all.mark66.style.display='none';
		document.all.mark67.style.display='';
		}

Понятно, что при увеличении числа объектов код растет с геометрической прогрессией. В результате файл со скриптом уже весит 200 Кб. Вопрос: Как заменить несколько инструкций по выключению видимости всех объектов (кроме нужного) на одну?

Gvozd 15.02.2009 02:49

сразу замечу что использование document.all является плохим, вследствии некросбраузерности, и проблем с name

теперь же по сути

function qwe(num=1)
{
var max=67;
if(num>max)
    {
    for(i=1;i<=max;i++)
        document.getElementById('mark'+i).style.display='none';
    return;
    }
for(i=1;i<num;i++)
    document.getElementById('mark'+i).style.display='none';
document.getElementById('mark'+i).style.display='';
for(i++;i<=max;i++)
    document.getElementById('mark'+i).style.display='none';
}

Zibba 15.02.2009 02:51

Передавайте в функцию аргументом элемент который нужно показать, а остальные скрывайте в цыкле.
И не используйте конструкцию document.all (она будет работать только в IE), лучше используйте document.getElementById('mark1') и т.д.

Добавлено: пока писал, ответили.

Gvozd 15.02.2009 03:01

Цитата:

Сообщение от Zibba
(она будет работать только в IE)

не только
еще работает в опере(по крайней мере старых версиях), и можно заставить в мозилле пахать.
но смысла в этих изварщениях нету.
ибо в all еще пихается по name-у

legal 15.02.2009 03:05

Большое спасибо, насчет цикла не подумал )) Но вот проблем с кроссбраузерностью пока не было, совсем. Наверное потому, что использую id, а не name.

Gvozd 15.02.2009 03:10

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

legal 15.02.2009 03:16

В IE, Opera, Mosilla, Netscape работает ок. До других пока просто руки не дошли )) Но попробую все же перейти на getElementById(), еще раз спасибо.

Zibba 15.02.2009 03:19

Просто document.all - это IE 4 DOM, ну в некоторые браузеры котоыре хотят поспеть везде (такие как опера), добавили поддержку. Но это не праивльно :) как уже сказали не раз.

legal 15.02.2009 04:02

Ну вот, скрипт весил 200 Кб, теперь 200 байт )) Все браузеры съели на ура...

function mk(num) {
	 	max=67;
		for(i=1;i<=max;i++) {
			if (i==num) {
			document.getElementById('mark' + i).style.display='';
			}
			else {
			document.getElementById('mark' + i).style.display='none';
			}
		}
	}

ZoNT 16.02.2009 12:02

Так будет работать быстрее:
function mk(num) {
for(var i=1;i<=67;i++) document.getElementById('mark' + i).style.display='none';
document.getElementById('mark' + num).style.display='';
}

legal 16.02.2009 12:23

Спасибо! Еще короче можно? ))

Gvozd 16.02.2009 12:33

ZoNT,
чем же твой вариант быстрее моего?
по времени выполнения идентично будет,но в моем случае элемент отображаемый скакать не будет

ZoNT 16.02.2009 12:36

function mk(n,i) {
for(i=67;i--;)document.getElementById('mark'+(i+1)).style.display='none';
document.getElementById('mark' + n).style.display='';
}

Kolyaj 16.02.2009 12:39

Цитата:

Сообщение от Gvozd
но в моем случае элемент отображаемый скакать не будет

А он и так скакать не будет. Браузер же не перерисовывает страницу после каждого изменения.

ZoNT 16.02.2009 12:40

Цитата:

Сообщение от Gvozd
чем же твой вариант быстрее моего?
по времени выполнения идентично будет,но в моем случае элемент отображаемый скакать не будет

Да, скакать будет... теоретически... Быстрее тем, что нет ветвления.

ZoNT 16.02.2009 12:45

Ну или вот :) :
function mk(n,i){
function c(j,d){document.getElementById('mark'+j).style.display=d}
for(i=67;i--;)c(i+1,'none');
c(n,'');
}

legal 16.02.2009 13:41

Ок, ну а теперь, кто длиннее... )) Только без пустых инструкций, все нужное...

ZoNT 16.02.2009 13:56

Самый длинный вариант был в первом посте (это где без цикла) :)

legal 16.02.2009 14:11

А длиннее нельзя? ))

Gvozd 16.02.2009 16:22

ZoNT,
ветвление у меня сделано для обработки исключительной ситуации.
можно и без него(возможн в контексте задачи автора это даже неправильно)

Мне понравился способ ограничения итераций в твоих последующих циклах =).я вообще сперва решил, что ошибка)))

а насчет скачет или не скачет, пускай legal проверит

serviom 25.03.2009 21:36

Цитата:

Сообщение от Gvozd (Сообщение 12671)
сразу замечу что использование document.all является плохим, вследствии некросбраузерности, и проблем с name

теперь же по сути

function qwe(num=1)
{
var max=67;
if(num>max)
    {
    for(i=1;i<=max;i++)
        document.getElementById('mark'+i).style.display='none';
    return;
    }
for(i=1;i<num;i++)
    document.getElementById('mark'+i).style.display='none';
document.getElementById('mark'+i).style.display='';
for(i++;i<=max;i++)
    document.getElementById('mark'+i).style.display='none';
}

а у меня такая конструкция не работает! почему неподскажите?

Gvozd 25.03.2009 21:39

телепаты в бессрочном отпуске

serviom 25.03.2009 21:52

Цитата:

Сообщение от Gvozd (Сообщение 12671)
сразу замечу что использование document.all является плохим, вследствии некросбраузерности, и проблем с name

теперь же по сути

function qwe(num=1)
{
var max=67;
if(num>max)
    {
    for(i=1;i<=max;i++)
        document.getElementById('mark'+i).style.display='none';
    return;
    }
for(i=1;i<num;i++)
    document.getElementById('mark'+i).style.display='none';
document.getElementById('mark'+i).style.display='';
for(i++;i<=max;i++)
    document.getElementById('mark'+i).style.display='none';
}

Цитата:

Сообщение от Gvozd (Сообщение 15231)
телепаты в бессрочном отпуске

у меня не работоет такой код document.getElementById('mitka'+i) где i переменная!!! Опера 9,2 і IE 6.0 В чем может бить проблема?

Gvozd 25.03.2009 22:33

побуду-ка я телепатом
[telepatemode src=/dev/astral]
с вероятностью 99.9% вы поставили этот JS-код до элементов с упомянутым ID
поставьте тег <script> весте с кодом перед закрывающим тегом </body>
также можно навесить код, который вы выполняете на событие window.onload
проблема в том, что если вы пишите JS-код, ранеьше в тексте, чем появляются элементы с этими ID, элементов на странице еще нету.
[/telepatemode]
PS поставьте себе в обязательном порядке Mozilla и firebug. это инструменты первой необходимости для JS-кодера. хотя можете попытатся разобратся в других средствах отладки


Часовой пояс GMT +3, время: 03:53.