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='';
}


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