Сверлим чат MTV F-22 Хакер, номер #082, стр. 082-076-3 [скрываем html-элемент из javascript] document.getElementById("bla").style.display = 'none'; // скрыли document.getElementById("bla").style.display = 'block'; // показали Значение block работает не во всех браузерах, поэтому иногда вместо него пишут inline. Возможность иметь на странице скрытые поля появилась относительно давно, и все современные браузеры поддерживают эту спецификацию (имеется ввиду IE >gt; 5.0, Opera >gt; 5.0, Firefox 1.x, и так далее). Используются они в основном для сокрытия от глаз пользователя ненужной информации, той, которая, например, предназначена для поисковых систем. Однако разработчики чата Mtv решили использовать «скрытые» поля совсем для других целей… [интересное в chat.js] Как я уже отмечал выше, файл chat.js содержит в себе набор функций, которые реализуют все управление клиентской частью чата: например, добавляют сообщения в основной фрейм, и дописывают ники новых пользователей в общий список. Меня особенно интересовала именно эта функция. Выглядит она следующим образом: [функция добавления нового пользователя чата] function addUser(id, name, isAdmin) { removeUser(id); var currFrame = top.frames['co_list']; var listDiv = currFrame.document.getElementById('userList'); …//skipped var img = infoArea.appendChild(currFrame.document.createElement('IMG')); img.src = 'i/' + (isAdmin ? 'info-admin.gif' : 'info-user.gif'); img.width = 13; img.height = 9; img.border = 0; img.align = 'absmiddle'; img.alt = 'Info'; Просматривая код функции дальше, я натолкнулся на еще более интересный участок кода: [интересный участок кода] var adminArea = newUserDiv.appendChild(currFrame.document.createElement('SPAN')); adminArea.className = 'block'; adminArea.style.display = bIsAdmin ? 'inline' : 'none'; //эта строка интереснее всего eval('adminArea.onclick = function() { openAdminInteface(\'' + id + '\'); return false; }'); На самом деле, не нужно глубоко вникать в объектную модель системы, чтобы понять: в зависимости от переменной bIsAdmin (true или false) у объекта adminArea меняется свойство display (inline или none, то есть показать или скрыть). Совершенно понятно, что изучаемый сценарий также управлялся снаружи серверным приложением, которое передавало переменную bIsAdmin, в зависимости от значения которой и принимается решение: показывать ли пользователю ссылку на административный интерфейс. Просмотрев код chat.js дальше, я наткнулся на еще более удивительную вещь: адреса страниц для администрирования чата и для получения информации о пользователе были прописаны в скрипте явно, это были aspx-скрипты, которые принимали своим параметром id пользователя и назывались userblock.aspx и userinfo.aspx, соответственно. Вот это супер! |