Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.02.2009, 02:14
Новичок на форуме
Отправить личное сообщение для legal Посмотреть профиль Найти все сообщения от legal
 
Регистрация: 15.02.2009
Сообщений: 7

как сбросить видимость нескольких объектов сразу
Приветствую,
Есть список объектов со своими 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 Кб. Вопрос: Как заменить несколько инструкций по выключению видимости всех объектов (кроме нужного) на одну?

Последний раз редактировалось Андрей Параничев, 15.02.2009 в 18:58. Причина: Пользуйтесь bb-тегами [js] и [html] для оформления листингов кода в теле сообщения
Ответить с цитированием
  #2 (permalink)  
Старый 15.02.2009, 02:49
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

сразу замечу что использование 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, 16.02.2009 в 12:31.
Ответить с цитированием
  #3 (permalink)  
Старый 15.02.2009, 02:51
...
Отправить личное сообщение для Zibba Посмотреть профиль Найти все сообщения от Zibba
 
Регистрация: 13.10.2008
Сообщений: 225

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

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

Последний раз редактировалось Zibba, 15.02.2009 в 03:17. Причина: Добавлено
Ответить с цитированием
  #4 (permalink)  
Старый 15.02.2009, 03:01
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Zibba
(она будет работать только в IE)
не только
еще работает в опере(по крайней мере старых версиях), и можно заставить в мозилле пахать.
но смысла в этих изварщениях нету.
ибо в all еще пихается по name-у
Ответить с цитированием
  #5 (permalink)  
Старый 15.02.2009, 03:05
Новичок на форуме
Отправить личное сообщение для legal Посмотреть профиль Найти все сообщения от legal
 
Регистрация: 15.02.2009
Сообщений: 7

Большое спасибо, насчет цикла не подумал )) Но вот проблем с кроссбраузерностью пока не было, совсем. Наверное потому, что использую id, а не name.
Ответить с цитированием
  #6 (permalink)  
Старый 15.02.2009, 03:10
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

все же бы следовало бы использовать именно document.getElementById()
вы свой код везде проверяли?
он не запашет в мозилле(в завизимости от заголовка документа)
и скорее всего не запашет в хроме
Ответить с цитированием
  #7 (permalink)  
Старый 15.02.2009, 03:16
Новичок на форуме
Отправить личное сообщение для legal Посмотреть профиль Найти все сообщения от legal
 
Регистрация: 15.02.2009
Сообщений: 7

В IE, Opera, Mosilla, Netscape работает ок. До других пока просто руки не дошли )) Но попробую все же перейти на getElementById(), еще раз спасибо.
Ответить с цитированием
  #8 (permalink)  
Старый 15.02.2009, 03:19
...
Отправить личное сообщение для Zibba Посмотреть профиль Найти все сообщения от Zibba
 
Регистрация: 13.10.2008
Сообщений: 225

Просто document.all - это IE 4 DOM, ну в некоторые браузеры котоыре хотят поспеть везде (такие как опера), добавили поддержку. Но это не праивльно как уже сказали не раз.
Ответить с цитированием
  #9 (permalink)  
Старый 15.02.2009, 04:02
Новичок на форуме
Отправить личное сообщение для legal Посмотреть профиль Найти все сообщения от legal
 
Регистрация: 15.02.2009
Сообщений: 7

Ну вот, скрипт весил 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';
			}
		}
	}
Ответить с цитированием
  #10 (permalink)  
Старый 16.02.2009, 12:02
Флудер
Отправить личное сообщение для ZoNT Посмотреть профиль Найти все сообщения от ZoNT
 
Регистрация: 25.07.2008
Сообщений: 1,271

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


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ООП: как создавать наследника от встроенных объектов? Langalier Общие вопросы Javascript 17 02.02.2009 17:07
Как определить включен ли поддержака объектов ActoveX feodul Events/DOM/Window 5 02.06.2008 12:04