как сбросить видимость нескольких объектов сразу
Приветствую,
Есть список объектов со своими 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 Кб. Вопрос: Как заменить несколько инструкций по выключению видимости всех объектов (кроме нужного) на одну? |
сразу замечу что использование 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'; } |
Передавайте в функцию аргументом элемент который нужно показать, а остальные скрывайте в цыкле.
И не используйте конструкцию document.all (она будет работать только в IE), лучше используйте document.getElementById('mark1') и т.д. Добавлено: пока писал, ответили. |
Цитата:
еще работает в опере(по крайней мере старых версиях), и можно заставить в мозилле пахать. но смысла в этих изварщениях нету. ибо в all еще пихается по name-у |
Большое спасибо, насчет цикла не подумал )) Но вот проблем с кроссбраузерностью пока не было, совсем. Наверное потому, что использую id, а не name.
|
все же бы следовало бы использовать именно document.getElementById()
вы свой код везде проверяли? он не запашет в мозилле(в завизимости от заголовка документа) и скорее всего не запашет в хроме |
В IE, Opera, Mosilla, Netscape работает ок. До других пока просто руки не дошли )) Но попробую все же перейти на getElementById(), еще раз спасибо.
|
Просто document.all - это IE 4 DOM, ну в некоторые браузеры котоыре хотят поспеть везде (такие как опера), добавили поддержку. Но это не праивльно :) как уже сказали не раз.
|
Ну вот, скрипт весил 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'; } } } |
Так будет работать быстрее:
function mk(num) { for(var i=1;i<=67;i++) document.getElementById('mark' + i).style.display='none'; document.getElementById('mark' + num).style.display=''; } |
Спасибо! Еще короче можно? ))
|
ZoNT,
чем же твой вариант быстрее моего? по времени выполнения идентично будет,но в моем случае элемент отображаемый скакать не будет |
function mk(n,i) { for(i=67;i--;)document.getElementById('mark'+(i+1)).style.display='none'; document.getElementById('mark' + n).style.display=''; } |
Цитата:
|
Цитата:
|
Ну или вот :) :
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,''); } |
Ок, ну а теперь, кто длиннее... )) Только без пустых инструкций, все нужное...
|
Самый длинный вариант был в первом посте (это где без цикла) :)
|
А длиннее нельзя? ))
|
ZoNT,
ветвление у меня сделано для обработки исключительной ситуации. можно и без него(возможн в контексте задачи автора это даже неправильно) Мне понравился способ ограничения итераций в твоих последующих циклах =).я вообще сперва решил, что ошибка))) а насчет скачет или не скачет, пускай legal проверит |
Цитата:
|
телепаты в бессрочном отпуске
|
Цитата:
Цитата:
|
побуду-ка я телепатом
[telepatemode src=/dev/astral] с вероятностью 99.9% вы поставили этот JS-код до элементов с упомянутым ID поставьте тег <script> весте с кодом перед закрывающим тегом </body> также можно навесить код, который вы выполняете на событие window.onload проблема в том, что если вы пишите JS-код, ранеьше в тексте, чем появляются элементы с этими ID, элементов на странице еще нету. [/telepatemode] PS поставьте себе в обязательном порядке Mozilla и firebug. это инструменты первой необходимости для JS-кодера. хотя можете попытатся разобратся в других средствах отладки |
Часовой пояс GMT +3, время: 03:53. |