Пишем простой Tab list с prototype.js
Как я написал свой Tab list и почему не использовал доступные в интернете готовые примеры.
Вот примеры Tab листов, которые я раньше использовал:
На примерах этих tab листов, трудно понять как работает сам механизм связанный с переключаниями между tab’ами.
И один из больших недостатков я не смог застивить работать эти tab листы на динамически вызваных страницах, которые вызваются через методы библиотеки prototype.js (Ajax.Updater и др.). Вот по этой причине я решил написать свой tab лист.
Первое, создаем простой html документ:
[cc lang="php"]
[/cc]
Обратите внимание на кодировку в документе используется UTF-8, так как библиотека prototype.js не дружит с нашими кодировками windowds-1251
Если у вас все же есть необходимость использовать в работе кодировку windows-1251, вам поможет библиотека Дмитрия Котерова JsHttpRequest. Которая полностью совместима с prototype.js
В моем примере tab list я использую CSS стили из проекта Dexagogo.
Перед закрытием тега </head> , добавляем подключение библиотеки prototype.js, которую я использую для переключения между tab’ами, и динамеческой загрузки информации в выбранный tab.
Второе, собственно сами закладки:
[cc lang="php"]
этот таб загружен вместе со страницей
этот таб так же загружен вместе со страницей
[/cc]
Для приведенного кода я думаю особых объяснений не нужно. Основное, что может вызвать не монимание, это функция tab(’one’) именно вызывая ее происходит переключение, более подробоно будет описана ниже.
Также в этом листинге в содержании третьего таба (id=threethree), вызвается метод Ajax.Updater(’threethree’, ‘inner.html’, {method: ‘get’}), где:
- ‘threethree’ — id в innerHTML (внутренность) которого будет загружен внешний файл
- ‘inner.html’ — внешний загружаемый файл
- {method: ‘get’} — передаваемый параметр, в это месте можно добавить свои значения, которые мы хотим передать внешнему файлу.
более подробно об методе Ajax.Updater я раскажу в следующий записях моего дневника, незабудьте подписать на рассылку вконце этой записи.
Третье, javascript функци, которые переключают Tab’ы:
[cc lang="javascript"]
[/cc]
Фукнция tab() — переключает верхние <div> заголовки tab’ов
В первой строке определяем текующий активный tab
[cc lang="javascript"]active = document.getElementsByClassName(’active-tab’);[/cc]
Обратите внимание на метод getElementsByClassName использовать его позволяет библиотека prototype.js
Делаем текущий активный tab не активным
[cc lang="javascript"]active[0].className = ”[/cc]
Назначаем новый выбранный tab активным
[cc lang="javascript"]document.getElementById(id).className = “active-tab”;[/cc]
Библиотека prototype.js предлагает для упрощения несколько сокращений для стандартных методов, один из них $, который заменяет вызов document.getElementById. Так можно заменить запись вида document.getElementById(id) на равнозначную запись $(id)
Вызываем функцию tabBody() — переключает нижние <div> тело tab’ов.
Функция tabbody() работает аналогично tab().
Посмотреть Демо переключатель tab, скачать все одиним архивом tab.zip.
Библиотека prototype.js в архив не включена, скачайте послденюю версию с офф сайта http://prototypejs.org
Не забудьте подписаться на RSS и e-mail рассылку.
В следующей статье я раскажу как работать с Ajax.Autocompleter и покажу недокументированные функкции, а так же основную ошибку, которую совершают при работе с этим методом от http://script.aculo.us/


January 14th, 2008 at 2:48 pm
Табы хорошие, но возникла проблема: если много контента и табы внизу, то при загрузке страницы он автоматически алайнится на div с табами, т.е. табы размещаються в самом верху браузера. Как это можно побороть? Javascript тут не причем, а в CSS решить проблему не удалось.
January 15th, 2008 at 12:22 am
Как раз тут связка ссылки через # и javascript, без вызова маркера # , не произойдет открыти нового вкладки. Я это не удобство тоже заметил, но не было не обходимости найти как переделать правильнее. Здесь нужно сделать так, чтоб браузер не реагировал на маркер # скролингом длинной страницы до этого маркера. К сожелению я сейчас не смогу подсказать как это сделать, нужно просто отдельно занятся этой проблемой, хотя я не думаю, что это сложно решить.
May 12th, 2008 at 2:53 pm
Супер, то что надо, сейчас же попробую заскриптовать в своем проекте.
May 13th, 2008 at 3:22 pm
Столкнулся с серьезной проблемой при использовании табов в табах
May 13th, 2008 at 3:30 pm
Поделись, что за проблема.
Вообще реализаций таб листов очень много, данная реализация написана для новичков те кто хочет познакомиться, а как вообще оно работает.
May 18th, 2008 at 4:02 pm
При использовании такого таба в табе, за счет того что используется доступ к элементам по классам, перестают нормально работать и родительские и дочерние табы. Поэтому можно немного универсальности внести в данную реализацию сделав однозначный доступ по id элемента допустим.
May 19th, 2008 at 9:36 am
Да действительно правильнее сделать по id - эта проблема как раз и проявляется когда табы в табах, тогда идет пересение классов.