css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
1 Июл
jQuery UI – надстройка над JavaScript-библиотекой jQuery. Она поможет создавать по настоящему интерактивные веб-приложения. Сегодня мы познакомимся с виджетом Tabs.

Виджет Tabs помогает разделить информационное наполнение между несколькими вкладками. Это может быть полезно при дефиците свободного места на веб-странице. Информационное наполнение вкладок может быть загружено с помощью ajax-запроса.
Для начала посетим страницу настраиваемой закачки на сайте jQuery UI, чтобы получить необходимые нам файлы. Щелкаем на ссылке Deselect all component , чтобы не закачивать лишнее, а затем выбираем только то, что нам потребуется – отмечаем чекбокс Tabs и видим, что вместе с ним отметился чекбокс UI Core. Работа виджета Tabs зависит от него, поэтому он необходим.
Кроме этого, справа есть выпадающий список, где можно выбрать понравившуюся тему оформления. Если все готово, кликаем кнопку Download и получаем архив. Можно испытать пример как есть, но интереснее создать свою HTML-страничку, где сначала в разделе HEAD подключить несколько файлов, которые есть в архиве.
<link type="text/css" href="css/le-frog/jquery-ui-1.7.2.custom.css" rel="stylesheet" /> <script src="js/jquery-1.3.2.min.js" type="text/javascript"></script> <script src="js/jquery-ui-1.7.2.custom.min.js" type="text/javascript"></script> <script src="js/jquery.cookie.min.js" type="text/javascript"></script>
Сначала мы подключили файл стилевого оформления виджета, затем файл библиотеки jQuery. В третьем подключенном файле объединена функциональность ядра UI и виджета Tabs. Четвертый файл понадобится в том случае, если Вам необходимо использовать cookies. Найти его можно в папке архива development-bundle/external/cookie/.
Дальше знакомимся с требованиями виджета Tabs к HTML-разметке.
<div id="tabs">
<ul>
<li><a href="#tabs-1">Nunc tincidunt</a></li>
<li><a href="#tabs-2">Proin dolor</a></li>
<li><a href="#tabs-3">Aenean lacinia</a></li>
</ul>
<div id="tabs-1">
<p>Tab 1 content</p>
</div>
<div id="tabs-2">
<p>Tab 2 content</p>
</div>
<div id="tabs-3">
<p>Tab 3 content</p>
</div>
</div>
Ярлыками вкладок являются элементы li, в атрибутах href которых содержится идентификаторы соответствующих им элементов div, которые представляют собой область информационного наполнения вкладки. Внутри элементов div содержимое может быть практически любым. Ну и все это заключено в элемент div с идентификатором #tabs.
Теперь привяжем функциональность виджета к HTML-разметке.
<script type="text/javascript">
$(function(){
$("#tabs").tabs();
});
</script>
Все. С настройками по умолчанию виджет уже работает. Теперь будем передавать ему свои настройки:
<script type="text/javascript">
$(function(){
$("#tabs").tabs({
event: "mouseover",
selected: 2
});
});
</script>
В этом примере мы заставили виджет Tabs переключать вкладки по событию mouseover (взамен установленного по умолчанию click) и открывать при инициализации третью вкладку (отсчет ведется от 0).
Сразу еще один пример, который демонстрирует приемы использования cookies для запоминания последней открытой вкладки для того, чтобы впоследствии открыть ее при инициализации. Но, до этого давайте добавим в HTML-разметку кнопку, для того, чтобы кликнув по ней, убедиться, что cookies действительно ставятся.
<button id="getCookie">Get Cookie</button>
и собственно пример установки cookies
<script type="text/javascript">
$(function(){
$("#tabs").tabs({
cookie: { expires: 7, name: "startTab" }
});
$("#getCookie").click(function(){
var cook = $("#tabs").tabs("option", "cookie");
alert("name: " + cook.name +
"\nexpires: " + cook.expires);
});
});
</script>
Мы установили cookie с именем startTab сроком на 7 дней. Щелчок по кнопке с идентификатором getCookie приведет к тому, что в окне предупреждения мы увидим имя установленной cookie и срок, на который она была установлена. Не забывайте, что для использования этой возможности необходимо подключать дополнительный файл плагина jQuery Cookie.
Мы научились передавать виджету различные опции, а их описания приведены ниже:
ajaxOptions – опции ajax-запроса, которые используются для загрузки удаленного содержимого в область информационного наполнения. По умолчанию используется значение null.
cache – опция определяет, кэшировать или нет информационное наполнение вкладки, загружаемое с помощью ajax-запросов, т.е. загрузить содержимое только однажды или загружать каждый раз, когда совершен щелчок на ярлыке вкладки. По умолчанию используется значение false, т.е. кэширование не производится. Обратите внимание – чтобы воспрепятствовать фактическому кэшированию данных браузером Вы должны дополнительно обеспечить значение false в опциях самого ajax-запроса.
collapsible – по умолчанию используется значение false. Если передать в этой опции значение true, то каждый следующий щелчок на ярлыке вкладки будет скрывать и открывать область информационного наполнения.
cookie – запоминает последнюю выбранную вкладку в cookie. В дальнейшем используется для определения вкладки, открываемой по умолчанию (если не используется опция selected). Требует подключения плагина cookie. Возможно присвоение имени cookie через опцию name.
disabled – массив, содержащий индексы вкладок (отсчет ведется от 0), которые должны быть недоступными при инициализации виджета. Например, disabled: [1, 2] сделает недоступными вторую и третью вкладки.
event – тип события, которое используется для переключения вкладок. По умолчанию используется значение ‘click’. Второе возможное значение ‘mouseover’.
fx – устанавливает анимационные эффекты при открытии/закрытии вкладок. Например: fx: { opacity: «toggle», duration: «slow» }
panelTemplate – HTML-шаблон из которого создается новая область информационного наполнения вкладки в случае создания ее с использованием метода add или при создании вкладки «на лету» с использованием ajax-запроса. По умолчанию имеет значение ‘<div></div>’.
selected – индекс вкладки, (отсчет ведется от 0) которая должна быть открыта при инициализации виджета. По умолчанию используется значение 0, т.е. открывается первая вкладка. Чтобы сделать невыбранными все вкладки, надо использовать значение -1.
spinner – HTML-код, указанный в этой строке, отображается на ярлыке вкладки во время загрузки удаленного содержимого в область информационного наполнения. Если передать пустую строку, эта возможность будет деактивирована. По умолчанию используется <em>Loading</em>.
tabTemplate – HTML-шаблон из которого создаются новые ярлыки вкладок в случае создания их с использованием метода add. #{href} and #{label} заменяются url’ом и названием вкладки, переданными в аргументах метода add. По умолчанию имеет значение ‘<li><a href=»#{href}»><span>#{label}</span></a></li>’.
Точно так же как и другие виджеты, виджет Tabs умеет реагировать на разнообразные события. Посмотрим пример использования одного из возможных событий.
<script type="text/javascript">
$(function(){
$("#tabs").tabs({
selected: 2,
select: function(event, ui) {
alert("Событие: " + event.type +
"\nui.tab: " + ui.tab +
"\nui.panel: " + ui.panel.innerHTML +
"\nui.index: " + ui.index);
}
});
});
</script>
Мы определили в опции select callback-функцию, которая будет вызываться в момент наступления события tabsselect, т.е. в тот момент, когда был совершен щелчок по ярлыку вкладки. Callback-функция принимает два аргумента. Первый аргумент – это объект event, второй аргумент – специальный объект ui. Организовав доступ к свойствам этих объектов, можно получить довольно полезную информацию (мы выводим ее в окне предупреждения).
ui.tab – ссылка на активированную в настоящий момент вкладку;
ui.panel – ссылка на элемент, в котором заключено информационное наполнение активированной вкладки ;
ui.index – индекс активированной вкладки (отсчет ведется от 0);
Ниже приведены описания событий виджета Tabs и названия опций, в которых можно определить callback-функции, вызываемые при наступлении события.
select – событие tabsselect происходит в момент щелчка по ярлыку вкладки (при наведении указателя мыши на вкладку, если используется опция event: ‘mouseover’). При щелчке на ярлыке активной вкладки ничего не происходит.
load – событие tabsload происходит, когда в область информационного наполнения вкладки было загружено содержимое из внешнего файла.
show – событие tabsshow происходит в момент отображения содержимого вкладки.
add – событие tabsadd происходит каждый раз, когда добавлена новая вкладка.
remove – событие tabsremove происходит каждый раз, когда удалена какая-либо вкладка.
enable – событие tabsenable происходит в момент, когда ранее недоступная вкладка становится доступной.
disable – событие tabsdisable происходит в момент, когда вкладка становится недоступной.
Осталось разобраться с методами виджета Tabs. Для этого добавим еще пару кнопок в HTML-разметку:
<button id="startRotate">Start Rotate</button> <button id="stopRotate">Stop Rotate</button>
и пример javascript-кода:
<script type="text/javascript">
$(function(){
$("#tabs").tabs({
selected: 2
});
$("#startRotate").click(function(){
$("#tabs").tabs("rotate", 3000, true);
});
$("#stopRotate").click(function(){
$("#tabs").tabs("rotate", null);
});
});
</script>
При щелчке на кнопке с идентификатором Start Rotate будет применен метод rotate, который заставит виджет самостоятельно переключать вкладки каждые три секунды. При щелчке на кнопке с идентификатором Stop Rotate автоматическое переключение вкладок будет остановлено.
Далее приведены описания всех доступных методов виджета Tabs.
destroy – .tabs(‘destroy’) полностью удаляет всю функциональность виджета Tabs. Возвращает элементы в состояние, предшествующее инициализации.
disable – .tabs(‘disable’) временно запрещает использование всей функциональности виджета. Вновь разрешить ее использование можно с помощью метода enable.
enable – .tabs(‘enable’) разрешает использование всей функциональности виджета, если ранее она была запрещена с использованием метода disable.
option – .tabs(‘option’, optionName, [value]) с помощью этого метода можно получить или установить значение любой опции виджета после инициализации.
add – .tabs(‘add’, url, label, [index]) метод добавляет новую вкладку. Второй аргумент содержит либо идентификатор создаваемой вкладки, (см. требования к разметке) либо является полным url (относительным или абсолютным, но без поддержки кросс-доменной загрузки) при создании вкладки с использованием ajax. Третий аргумент – название вкладки, отображаемое на ее ярлыке. Четвертый – индекс создаваемой вкладки (позиции отсчитываются от 0).
remove – .tabs(‘remove’, index ) удаляет вкладку. Второй аргумент – индекс удаляемой вкладки (позиции отсчитываются от 0).
enable – .tabs(‘enable’, index) делает доступной ранее недоступную вкладку. Чтобы сделать доступными одновременно несколько вкладок сделайте так: $(‘#tabs’).data(‘disabled.tabs’, [ ]);
disable – .tabs(‘disable’, index) делает вкладку недоступной. Активная вкладка не может быть сделана недоступной. Чтобы сделать недоступными одновременно несколько вкладок сделайте так: $(‘#tabs’).data(‘disabled.tabs’, [1, 2, 3]);
select – .tabs(’select’, index) метод позволяет выбрать вкладку так, как будто был сделан щелчок по ее ярлыку. Второй аргумент – индекс нужной вкладки (позиции отсчитываются от 0). Он же может быть идентификатором вкладки (см. требования к разметке).
load – .tabs(‘load’, index) программно перезагружает содержимое вкладки, используя ajax-запрос. Этот метод всегда загружает содержимое, даже если опция cache имеет значение true. Второй аргумент – индекс нужной вкладки (позиции отсчитываются от 0).
url – .tabs(‘url’, index, url) изменяет url, откуда с помощью ajax-запроса будет загружаться содержимое. Второй аргумент – индекс нужной вкладки (позиции отсчитываются от 0). Указанный в третьем аргументе url будет использоваться и для дальнейших загрузок.
length – .tabs(‘length’) метод просто возвращает количество вкладок.
abort – .tabs(‘abort’) метод завершает все выполняющиеся ajax-запросы и анимацию.
rotate – .tabs(‘rotate’, ms, [continuing]) метод устанавливает автоматический перебор всех вкладок. Второй аргумент – количество миллисекунд, в течение которых очередная вкладка будет активной. Чтобы остановить перебор вкладок во втором аргументе необходимо передать 0 или null. Третий аргумент определяет логику при выборе вкладки пользователем. Значение true – перебор вкладок будет продолжен. По умолчанию используется false.
Все? Пожалуй, нет. Как можно обойтись без примера, где информационное наполнение загружается с использованием ajax-запросов, верно?
Сделать это несложно, но придется немного поменять HTML-разметку:
<div id="tabs">
<ul>
<li><a href="ajax_1.html"><span>Content 1</span></a></li>
<li><a href="ajax_2.html"><span>Content 2</span></a></li>
<li><a href="ajax_3.html"><span>Content 3</span></a></li>
<li><a href="#tabs-4">Content 4</a></li>
</ul>
<div id="tabs-4">
<p>4. Информационное наполнение для вкладки №4.</p>
</div>
</div>
Изучите пример этой разметки и обратите внимание, что вкладки с информацией, загружаемой с помощью ajax-запросов, вполне успешно могут соседствовать с вкладками, созданными обычным способом.
Конечно, надо создать еще и файлы, из которых будет загружаться информация. В нашем примере – это ajax_1.html, ajax_2.html и ajax_3.html. А больше ничего и не потребуется. Что касается javascript-кода, можно использовать даже настройки по умолчанию:
<script type="text/javascript">
$(function(){
$("#tabs").tabs();
});
</script>
Все. Про стилевое оформление не пишу – планирую отдельную статью про это сразу для всех виджетов.
Отзывов (106) на «jQuery UI – виджет Tabs»
где пример посмотреть можно та?
http://jqueryui.com/demos/tabs/
Все HTML-верстка вкладок не очень семантична.
Логически, ярлык вкладки является ее заголовком, поэтому ярлыки лучше и делать как заголовки вкладок, а не выносить в отдельный список.
НЕСЕМАНТИЧНО:
<div id=»tabs»>
<ul>
<li><a href=»#tabs-1″>Nunc tincidunt</a></li>
<li><a href=»#tabs-2″>Proin dolor</a></li>
<li><a href=»#tabs-3″>Aenean lacinia</a></li>
</ul>
<div id=»tabs-1″>
<p>Tab 1 content</p>
</div>
<div id=»tabs-2″>
<p>Tab 2 content</p>
</div>
<div id=»tabs-3″>
<p>Tab 3 content</p>
</div>
</div>
СЕМАНТИЧНО:
<div id=»tabs»>
<div id=»tabs-1″>
<h3><a href=»#tabs-1″>Nunc tincidunt</a></h3>
<p>Tab 1 content</p>
</div>
<div id=»tabs-2″>
<h3><a href=»#tabs-2″>Proin dolor</a></h3>
<p>Tab 2 content</p>
</div>
<div id=»tabs-3″>
<h3><a href=»#tabs-3″>Aenean lacinia</a></h3>
<p>Tab 3 content</p>
</div>
</div>
О! Алик Кириллович….
Здравствуйте!
Никак опять комментом отметиться решили?
Кстати, требования именно к такой HTML-разметке предъявляет сам виджет. С примером Вашей разметки он работать просто не будет.
P.S. Ничего личного, но комментарий ради комментария – зачем? Кому от него в данной ситуации будет практическая польза?
Так я и не утверждаю, что с такой разметкой виджет будет работать
Я просто привел пример того, как именно могла бы быть реализована более семантическая верстка.
Цель комментария — дать небольшую дополнительную информацию и показать один (пусть и не такой значительный) недостаток плагина. Для «фанатов семантики» эта информация будет ценна.
Кстати, подобная несемантичная реализация вкладок присутствует не только в jQuery UI, но и во многих JS-библиотеках, см. например в Yahoo! UI Library: TabView. Видимо, это связанно с тем, что реализовать ярлыки вкладок через отдельный несемантичный список проще, чем через семантичные заголовки. Семантическая реализация, к сожалению — скорее исключение, чем правило.
Разумеется, моя «претензия» — исключительно к разработчикам библиотек, а не к Вам. Вы делаете большое дело, описывая различные технологии, библиотеки, плагины, и т.д., чтобы читателям легче было получить о них необходимую информацию, и сделать обоснованный выбор. Я же, в меру своих сил, стараюсь эту информацию немного дополнить. Вот собственно и все
Ладно, давайте будем считать, что мы с Вами просто разъяснили друг другу свои позиции
Собственно, я больше сторонник идей, которые Вы излагаете в своем блоге. Но практически-то все равно в подавляющем большинстве случаев приходится жертвовать красотой, во имя чего-то еще… По крайней мере у меня так обычно и получается.
Кстати, приведенный мной недостаток плагина является существенным не только для гиков, которым важна «семантика ради семантики», но и для обычных разработчиков.
Более того, недостаток делает плагин практически неприемлемым для представления информации на сайтах, ограничивая область применения одними web-приложениями.
Приведу пример:
Предположим, наша web-страница содержит несколько разделов:
* Для бизнеса
* IT-специалстам
* Разаботчикам
* …
Для экономии места на странице, мы вынесли соответствующие информационные блоки во вкладки.
См. главную страницу сайта Микрософт.
Понятное дело, что скрипт, прячущий информацию во вкладках, будет работать только при просмотре сайта на десктопе.
В версии для печати, на мобильнике, при отключенном JavaScript или CSS, скрипт запускаться не должен и будет показана изначальная HTML-страница.
Если вкладки реализованы семантично, то все будет нормально. Просто вместо вкладок, на странице будут обычные главы с заголовками: «Для бизнеса», «IT-специалистам», …
Если же вкладки реализованы несемантично, то мы увидим совершенно невнятную картину. Сначала на странице будет идти список всех заголовков, а затем, сплошняком, без всякого разбития текст всех глав. Какой заголовок относится к какой главе понять будет совершенно нереально, определить конец одной главы и начало следующей — тоже, и читать страницу будет совершенно невозможно!
Поэтому, плагины с подобной несемантической версткой совершенно не подходят для представления информации на сайтах.
Однако, их вполне можно использовать в web-приложениях, которые заведомо будут выполняться на десктопных браузерах с поддержкой JS.
Так что, приведенная информация о недостатке является важной, и более того, определяющей при выборе плагина.
ОК, хорошо что все прояснилось
Рад, что Вы читаете мой блог
Полностью согласен. Собственно, в свою статье про красоту кода я и написал:
«Ну и не стоит забывать, что отсутствие в коде приведённых «уродских приёмов» — лишь идеальная ситуация, к которой надо стремиться, но приходится жертвовать в определённых ситуациях (например, в целях производительности). Ведь умение приносить жертвы при решении практических задач — один из элементов профессионального программирования».
Однако, как я написал в предыдущем комментарии, семантика бывает нужна не только ради красоты, но и для чисто функциональных задач.
Ну, если к делу подходить очень серьезно, использование всякого рода плагинов вообще неоправдано. Тем более, что в каких-то моментах все равно можно оказаться в рамках, установленных разработчиком. Т.е. в конечном итоге все зависит от самого проекта – на кого он ориентирован в первую очередь и т.д. Вывод – надо писать самому. Но есть и другое соображение – не все могут…
Ну зачем так радикально?
Синдром «Это придумано не здесь» — не есть хорошо (да, я тоже ему подвержен — и это часто тормозит бизнес).
Повторное использование кода для того и замышлялось, чтобы при реализации рутинных действий можно было использовать имеющиеся наработки, и каждый мог сосредоточится на собственной задаче.
Поэтому, если библиотека или плагин обеспечивает необходимую функциональность, нет ничего плохого в их использовании.
Однако, есть случаи, в которых библиотеки, действительно, лучше не использовать:
Во-первых, если функциональность библиотеки не удовлетворяет наши нестандартные требования, или она плохо вписывается в существующую архитектуру.
Во-вторых, если библиотека решает не периферийные рутинные задачи, а реализует ключевые и критические функции нашего продукта. Вот что писал Джоэл Спольски по этому поводу: «Если вы разрабатываете компьютерную игру и вашим преимуществом в конкуренции является сюжет, можно использовать чужую библиотеку 3D графики. Но если вы собираетесь выделиться необычными 3D-спецэффектами, то лучше написать свою библиотеку».
Использовать-же библиотеки только из-за неумения реализовать необходимые функции самому — как-раз самая худшая из причин. Вот еще цитата оттуда же: «…исключение, как мне кажется, есть только одно: ваши сотрудники менее компетентны, чем все остальные, и все, что бы вы не сделали сами, окажется халтурой. Таких организаций довольно много. Если вы оказались в одной из них, я вам ничем не могу помочь».
Я не имел ввиду вообще отказаться от идеи многократного использования кода, а лишь остановиться на какой-то разумной отметке…
Ну да, согласен. Я собственно о том и говорил, что вообще отказываться от использования плагинов и библиотек — неправильно, но есть как минимум две причины, когда этот отказ имеет смысл.
ОК, удачно Вам отдохнуть
возможно ли его привязать к ie 6-7 если да то подскажите пожалуйста как это сделать???
Отлично! Спасибо большое за предоставленные материалы. Жму руку.
Спасибо Вам Gennady, за Ваш труд. Только есть маленький вопросик по виджету – функция corner (скругление углов) только у меня в ie6,7,8 не работает, или так и должно быть? Просто я у себя пакет MultipleIEs (все версии ie c 3-ей по 6-ю) ставил, может из-за этого бага такая вылезла, неужели разработчики jquery не учли бы поддержку «зла» от «мелкософта» )
Не понял – а где в tabs есть что-то про corner?
А, понял… Вкладки в IE с незакругленными углами получаются. Нет, тут и на демо-сайте тоже самое – это вопрос CSS, но вероятно решили, что не стоит овчинка выделки…
А не подскажешь, как можно привязать открытие/сокртыие дивов (абзацев, списков) на select’e?
Т.е. не табы, а выпадающий список select, выбираем например товар 1, получаем рядом в диве его описание. Как вот привязать тут?
Пример на скорую руку приведу. Корявенький, но смысл поясняет…
Вот HTML:
<select>
<option value=»One»>Один</option>
<option value=»Two»>Два</option>
<option value=»Three»>Три</option>
</select>
<div id=»One»>Один</div>
<div id=»Two»>Два</div>
<div id=»Three»>Три</div>
вот JS:
$("select").change(function(){ $("div").hide(); $("div[id='" + $(this).val() + "']").show(); }).change();но я бы грузил все в один div, да может быть с помощью ajax и т.д…. Но все конечно от задачи зависит.
А если очень хочется использовать именно ui-tabs, то можно так:
$('select').change(function(){ $('.tabs_container').tabs('select', this.selectedIndex) }).change()+ скрыть .ui-tabs-nav, чтобы не было видно вкладок.
Gennady, а можно простым смертным тоже BB-кодов?
На самом деле я и сам мучаюсь, но заниматься этим – руки не доходят. У меня вордпрессовский плагин стоит – CodeHighlighter, но работает как-то криво. С JS-кодом еще худо-бедно справляется, а остальное….
Gennady, спасибо за статью, вот только как добавить ссылку при нажатии которой загружалась бы страница с открытой например второй вкладкой?
Что-то я в вопрос не въезжаю…. Хоть и выходной, но я сильно-то не выпивал, только пивка с литр
Есть же опция selected – индекс вкладки, (отсчет ведется от 0) которая должна быть открыта при инициализации виджета. По умолчанию используется значение 0, т.е. открывается первая вкладка. Чтобы сделать невыбранными все вкладки, надо использовать значение -1.
А ссылка на эту страницу? Ну, обычная ссылка… Или я вопрос не так понял?
я имел введу ссылку вне вкладок, но при нажатии по ней открывались соответственные им вкладки.
Тогда это метод select. Примерно так:
$("selector").click(function(){ $("#tabs").tabs("select", index); return false; });selector – это селектор, с помощью которого надо выбрать необходимую ссылку.
index – индекс нужной вкладки.
Ну, а false возвращаем, чтобы предотвратить стандартные действия браузера, т.е. переход по ссылке.
работает) а если ссылка находится на другой странице, можно ли дополнить функцию так, чтобы у открывающейся странице была открыта (сори за тавтологию) нужная вкладка?
olliwer, Вы статью читали или нет?
Если Вы по какой-то ссылке, расположенной где-то открываете страницу на которой есть tabs, то и дополнять ничего не надо. Просто tabs должен быть инициализирован с открытой нужной вкладкой. Делается в настройках, например так:
$("#tabs").tabs({ selected: 2 });при инициализации будет открыта третья вкладка…
читал, тут другое, tabs на странице «А» открывается по умолчанию на первой вкладки, но если на страницу «A» перейти по ссылки со страницы «Б» то там будет открыта вторая вкладка, это возможно сделать?
А, ну это другой коленкор….
Параметр надо передавать какой-то через… что Вы используете? ну, тот же php к примеру. В ссылке передайте параметр, скажем s=2, где 2 – это индекс вкладки, которая должна быть открыта на целевой странице. На этой самой целевой странице код будет звучать примерно так:
$("#tabs").tabs({ selected: <?php print $_GET['s'] ?> });какой $_GET['s'] будет, такая вкладка и откроется.
о спасибо, точно))
Gennady, последний вопрос)
при обновлении страницы, активная вкладка сбрасывается, tabs переключается на вкладку та что у него в index прописана, можно это отключить? т.е чтобы обновление не переключала вкладки?
Как сделать так, чтобы ссылки на вкладках при AJAX подгрузке содержимого были такими как я хочу.
В каком смысле? Атрибут href должен изменить значение? Тогда метод url:
url – .tabs(‘url’, index, url) изменяет url, откуда с помощью ajax-запроса будет загружаться содержимое. Второй аргумент – индекс нужной вкладки (позиции отсчитываются от 0). Указанный в третьем аргументе url будет использоваться и для дальнейших загрузок.
вроде немнго не то
я хочу чтобы при наведении мышки на вкладки были сссылки допустим вида
test.php?mode=index
test.php?mode=inbox
test.php?mode=outbox
test.php?mode=trash
test.php?mode=send
чтобы я мог скопировать если мне надо сслку на любую вкладку в буфер
как обрабатывать запрос и открывать нужную вкладку я сам сделаю
вопрос в другом
заранее спасибо
Я может не очень вопрос понял, но если названия вкладок нужны в таком виде, то и напишите их в HTML-разметке. Если контент ajax-ом грузите, то в таком вот духе:
<li><a href=»test.php?mode=index»><span>test.php?mode=index</span></a></li>
<li><a href=»test.php?mode=inbox»><span>test.php?mode=inbox</span></a></li>
. . . . . . .
<li><a href=»test.php?mode=send»><span>test.php?mode=send</span></a></li>
Или вопрос все-таки не в этом?
не поможет …. адрес ссылки все равно другой … он походу формируется произвольно не зависимо что я там пишу
значит отключить сбрасывание вкладок на прописанную в индексе при обновлении странице сделать невозможно?
olliwer, извините, пропустил Ваш вопрос….
Вы его кстати несколько сформулировали… ээээ… непонятно…
Я так понимаю, что Вы хотите именно сохранить состояние tabs’а, т.е., чтобы он запоминал последнюю открытую вкладку и при обновлении страницы открывал именно ее?
Тогда читайте – это есть в статье:
Опция cookie – запоминает последнюю выбранную вкладку в cookie. В дальнейшем используется для определения вкладки, открываемой по умолчанию (если не используется опция selected). Требует подключения плагина cookie. Возможно присвоение имени cookie через опцию name.
Спасибо!
Хочу добавлять новую закладку с содержимым, созданным на лету. Как надо ?:
var d = $(»).attr(‘id’, ‘first’).html(‘Text1′).appendTo($(document.body))
t.tabs(‘add’, ‘#first’, ‘ltab1′)
(Что должно быть передано в параметр url ?)
andr, я не буду дублировать статью. Про метод add там написано совершенно четко (в т.ч. про параметр url). Есть примеры того, как используются методы виджета. Пусть другие методы, но суть одна. В общем, чтобы создать вкладку на лету много мудрить не надо:
$("#tabs").tabs("add", "path/to_file", "Заголовок");А как быть, если надо сделать несколько экзмепляров таких «окон с табами» на одной странице?
Данная конструкция работает как-то некорректно:
$(function(){
$(«#tabs0,#tabs1″).tabs({spinner: »});
});
Разобрался. Вышеназванная конструкция работает
Здравствуйте Генадий. Помогите пожалуйста… Я не могу сделать так, чтобы положение вкладки сохранялось… Выложите пожалуйста код, уме готовый с куками…
ааа, все, разобрался)))
А почему моё сообщение удалили?….
Думаю, просто потому, что это не форум. Километры кода в комментарии не приветствуются.
Можно получить ответ на вопросы о принципах, о каких-то тонкостях использования. Но вопросы типа: «почему у меня не работает это?» + несколько экранов кода впридачу – однозначно удаляются.
Без обид
подскажите тогда, пожалуста, толковый форум, где могут помочь
Действительно, какой же у меня блог-то бестолковый….
В интернете есть ПС. Например: Google или Yandex.
Не знаю насчёт бестолкового, но я вежливо попросила и заслуживаю вежливый ответ…
Итого 5 (хотя с этим уже 6) никому неинтересных комментов….
Товарищ Ляля
если у Вас есть, что спросить о принципах, каких-то деталях – спрашивайте пожалуйста! Если нет (вопросов или желания) – пожалуйста, к Вашим услугам есть поисковые системы. Там можно найти все, и толковые форумы в том числе…
Привет.
а как узнать ID активной в данной момент вкладки?
Нужно изменить контент именно «верхней», активной вкладки.
Но так как они создаются динамически, то у них неизвестно какой ID….
Вы вероятно имеете ввиду не ID, а все-таки индекс вкладки… Пример есть в статье, сразу после описания опций. См. ui.index
доходчиво и на русском)спасибо)
Уважаемый «Gennady», сцуко, мозг товарищи типа: (‘Ляля’. ‘Алик Кириллович’) нахрен выносят! Можно ли ввести репресии и модерато-убивать хлам и херню не по делу – по всему ресурсу, по причине отсутствия следственной связи между женскими половыми органами и действием…
з|ы: Поклонник, по сути.
Терпимее, товарищ Роман, терпимее…. Я бы даже сказал толерантнее
Для конкретных обсуждений вероятно уже необходим форум. Формат блога в этом плане не очень удобен…
Спасибо за статьи, материал очень нужный! Подскажите, пожалуйста:
«Обратите внимание – чтобы воспрепятствовать фактическому кэшированию данных браузером Вы должны дополнительно обеспечить значение false в опциях самого ajax-запроса» – как это делается? В аяксе я к сожалению ни бум-бум( Подгружаются файлики php, типа <a href=»appointment.php»>Записаться на прием</a>
Надежда, не очень понял, где именно «… подгружаются файлики типа … «, но не суть важно.
Имеется ввиду, что если используются ajax-запросы, то ими можно управлять. В том числе можно управлять некоторым общим «поведением» всех ajax-запросов (и кэшированием в том числе) на странице через $.ajaxSetup(options).
Почитайте следующие статьи:
jQuery и Ajax: запросы
jQuery и Ajax: события
jQuery и Ajax: разное
они должны помочь разобраться, как jQuery помогает легко управлять ajax-запросами.
Ваш блог, Gennady, сильно помогает в изучении jQuery. За что респект.
По поводу табов: Есть 3, 4 или более табов, которые не вмешаются в ограниченную область, и соответсвенно не поместившиеся переносятся на новую строку. Что просто ломает красоту =)
А в виджите нет настроек для помещения их в одну линию с возможностью прокрутки.
И нужно дописывать свое, или может есть изящное решение? А может я и не прав
Решения я не встречал. Так что дописывать свое, или решать вопрос как-то иначе (может с помощью CSS). Или ждать – может и появится решение. Наверняка такая проблема не у Вас одного во всем мире появилась…
Проблема точно не тока у меня
Но почитав данную статью, написал свою надстройку и вроде как работает. Без CSS здесь тоже не обойтись.
Геннадий не подскажите если я в этом tabs-аккородеоне http://flowplayer.org/tools/demos/tabs/accordion-horizontal.html
хочу отлавливать событие переключения вкладок я же должен по идее делать так
$(«#accordion»).tabs(«#accordion div»,
{ tabs: ‘img’, effect:’horizontal’,
select: function(event, ui)
{
alert(«Cобытие»);
}
}
);
Но аlerta нет. Вроде он сделан с использованием tabs или я не так определяю событи?
У меня проблема в том что этот виджет я использую как главное меню во вкладках скрыты подпункты, при переключении вкладок я хочу отлавливать событие и перезаписывать контент. может это можно как то по другому сделать главное чтобы при щелчке по элементу с классом .d менялась вкладка и контент переисовывался Для этого мне нужно событие select.Или можно как то по другому. Пытался live (click и бл бл бл) не работает .
Подсказали сделать так Вроде все работает.
$(«#accordion»).tabs(«#accordion div», {
tabs:’.d’,
effect:’horizontal’
});
а потом
(‘.d’).click(function(){
$(«#accordion»).trigger(‘tabsselect’);
здесь написал свой код Все работает как надо.
});
alex, не путайте народ
– это не совсем тот Tabs, о котором речь шла в статье. То что Вы сейчас используете – набор весьма полезных плагинов от Tero Piirainen, основанный на jQuery, но имеющий собственный API, с которым стоит ознакомиться внимательно. Конечно, в какой-то мере этот набор инструментов унифицирован и с UI jQuery.
З.Ы. Это я для того, чтобы не вводить в заблуждение тех, кто только начал знакомство с jQuery в общем и с UI jQuery в частности.
Геннадий да я ж не специально
Я сам из тех, кто только начал знакомство с jQuery
Прикольная штука вот допишу курсовую и начну глубоко и вдумчиво вникать. Сейчас просто приоритет показать рабочий проект. Времени нет глубоко вникать. А потом уже разберу все по полочкам кое-что переделаю. Так что извините что иногда глупости спрашиваю но….
Да не… Нормально все alex
Просто, чтобы кто читать будет не смешал в голове одно с другим…
А как сделать чтобы при обновлении открытая вкладка запоминалась?
http://docs.jquery.com/UI/Tabs#option-cookie
И даже без ссылки можно было просто внимательно читать статью – там это написано черным по белому…
А как решить проблему сворачивания Блоков?
Пока не загрузится полностю Ява скрипт все блоки видны на странице! а потом аж когда страничка прогрузилась блоки ТАБС сворачиваются в display:NONE! Как зделать чтобы браузер сразу понимал что неактивные блоки нельзя показывать?
Дмитрий, не поверите: изначально указать им display:none
Указывал!
Но кагда нажымаеш на квладку чтобы она открывалась Див элемент остается в НОНЕ!
И? давайте ссылку на проблемную страницу, что именно не показывается, пример кода. Все-таки telepate_mode = off.
ПРоблема в том что работаю не в онлайне а на домашнем сервере а потом уже закидаю на сайт!!!
telepate_mode = off ?????? Что это?
И углы отключить круглые надо???
telepate_mode = off, это значит, что режим телепата в своем мозгу я выключаю, чтобы не было лишней нагрузки. Поэтому, к сожалению, я не могу прочитать Ваши мысли и узнать, что именно работает не так.
Так что либо код в студию, либо ссылку.
Спасибо сам уже разобрался)))))
Кстати, Дмитрий, как именно? Мне например тоже интересно. Просто вполне возможно, что Вы и zantor о разном говорили. Нет?
Я говорил о том что при загрузке стриници показываются все блоки, которые потом прячутся, когда ЯВА скрипт их обробатывает!!!
Проблемы была в том чтобы блоки которые переключаются через ТАБ-меню сразу прятались без явы!
Я использовал стандартные темплейты из сайта jQuery!!!!
Когда просто ставил блокам tab-2, tab-3, tab-4 в стилях display:none; они потом при переключении не отображались! А когда привязал их к класу
class=»ui-tab» и прописал уже в таблицах display:none, то уже при загрузке страници виден был толко первый блок tab-1! А остальные прятались!!!
я в jQuery далек только учусь так что не злитесь сильно если димагогию разважу!
Кстати очень КЛАССНЫЙ у вас БЛОГ!!!
Нет, какая демагогия… Просто решение наверняка пригодится еще очень многим.
съедят…
З.Ы. Только не называйте javascript явой,
To zantor: про telepate_mode = off прикололо
ДА да! понимаю свою ошибку!!!!
P/ S
А про (telepate_mode = off) — я сначала прочитал что єто:
template_mode=off и долго сидел думал где можно выключить template в функциях!!!!!!))))))))))))))))))
Снова вернулся на ваш блог..
Использовал табы основаны на Prototype.
Но столкнулся с проблемой.
В загруженных страницах, у вас это ajax_1.html не возможно выполнить другой javascript.
Например страница ajax_1.html содержит скрипт, которые подгружает к примеру Select (как у вас есть статья о выпадающем списке). Так вот это подгруженный скрипт, не работает в странице.
Скажите, в этом случае, у меня такого не выйдет?
Все получится
Тут что надо четко понимать? Если Вы подгружаете с помощью ajax-запроса и какую-то разметку и обработчик для нее, то это однозначно должно работать. Если же подгружается только разметка, а обработчики были определены в основном файле, то такой вариант работать без дополнительных телодвижений не будет.
Чтобы понять причины, почитайте это:
http://www.linkexchanger.su/2008/73.html
только разве что сделайте поправку на то, что статья довольно старая и в jQuery появились более эффективные способы решения задачи.
Как в Prototype – не знаю, наверное тоже есть что-то подобное…
Вы правы. В Prototype почти все также..
Геннадий, в каком то вашем комменте читал о том что вас посетила идея создания форума.
Может эту идею уже пора реализовать? Дело даже уже не вашей прихоте, а в необходимости, которая жестко стала перед вашем сайтом.
Количество посетителей ростей, форма общения не очень удобная. Потребность в Ajax и JQuery растет с каждым днем, а ваш сайта является лидером в этой области (я так считаю). И по этому хочется что бы он развивался.
Если у вас просто нету времени в настройки форума, я с радостью готов вам помочь. Мой E-mail есть в профиле.
Я действительно подумываю об этом. Но тут дело не в каких-то технических трудностях – это не проблема. Просто форум должен быть действительно либо полезен, либо его быть не должно, имхо
Ну а трезво оценивая свое время, которое я мог бы этому посвящать (я ведь не только блогом занимаюсь), пока в сомнениях.
Давайте попробуем обсудить эту тему – постараюсь выбрать время и выбросить на эту тему отдельный пост, где и обсудим все…
Хорошо, договорились. И не забывайте что форум будет полезен.)) Имхо)
Не подскажете?
Если я вешаю на событие add: function(event, ui) {alert(ui.tab.text);} — я получаю этот текст, но мне надо получить это свойство у всех вкладок — как мне это сделать?
Можно воспользоваться теми именами классов, которые создает и использует для работы этот виджет. Что-то вроде этого:
$("ul.ui-tabs-nav li").each(function(){ alert($(this).text()); });действительно нужная вещь, спасибо тебе, вот только при работе с ним столкнулся с такой проблемой. Хочу содержимое наполнить таким способом:
php
#Вызов функции соединения с базой данных
db_connect();
#Функция соединения с базой данных
function db_connect(){
$user = «root»; #Имя пользователя
$pass = «»; #пароль
$DB = «max»; #название базы данных
$serv = «localhost»; #адрес сервера MySql
#соединение с сервером
mysql_connect($serv,$user,$pass) or die(«Not connected…».mysql_error());
#установка кириллицы
mysql_query(«SET NAMES utf8″);
mysql_query(«SET COLLATION_CONNECTION=utf8_GENERAL_CI»);
#выбор базы данных
mysql_select_DB($DB) or die(«Base is not selected…».mysql_error());
}
$result = mysql_query(«SELECT * FROM wp_posts LIMIT 1″);
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
$col=printf («ID: %s Name: %s», $row[5], $row["post_content"]);
}
mysql_free_result($result);
но во вкладке ничего не отображается, подскажи пожалуйста в чем причина
Я не совсем понял, где размещено все описанное выше? Отдельный файл который должен вернуть некоторые данные с помощью ajax при открытии соответствующей вкладки? Тогда запускайте его отдельно, проверяйте возвращается ли нужный результат. Если да – то скорее всего не будет никаких проблем и с наполнением вкладки. Ну, если конечно Вы убедитесь, что и сам виджет работает, запустив его на каком-нибудь примитивном примере.
Я скачал на странице закачек , как ты и писал и хотел наполнить вкладки таким образом, что бы в них выводились нужные мне записи, то есть в первой например выводится запись с базы данных max, во второй вкладке с базы данных max1 и так далее(все базы данных с одним пользователем и паролем, тот же wordpress). Так вот сам виджет просто так работает, то есть переключается, это без проблем, но вот вывести с помощью приведенной мною функции записи не получается, почему то не делает запрос (сразу поясню что приведенный выше пример отлично работает вне виджета)
Отлично, что все работает отдельно. Дальше просто – не надо php-код, который выбирает данные из БД запихивать во вкладки Tab’s (я понимаю – есть именно такая попытка?) Пхпшный код оформляется отдельным файлом (наверное с какой-то логикой – получил такие-то данные в запросе – вернул такой-то результат). Далее, в статье есть пример, как организовать вкладки, которые заполняются результатом ajax-запроса. Ничего особенного сложного нет. Всего то и требуется – указать url нужного файла. Если в примере из статьи это ajax_1.html, ajax_2.html и ajax_3.html, то будет что-то вроде somefile.php?param=1, somefile.php?param=2, somefile.php?param=3
Как сделать, чтобы можно было на странице размещать больше одного скрипта с табами?
Спасибо.
$("#tabs").tabs();так Вы связываете функциональность плагина с элементом, который имеет идентификатор tabs.
А вот так:
$("div.tabs").tabs();со всеми элементами div с классом tabs.
Не так все просто.
Я сделал два вызова для двух разных элементов через id
$(«#tabs»).tabs();
$(«#anotherel»).tabs();
В итоге у нас создается один объект ui на два набора закладок. Когда вы нажимаете, например, на вторую вкладку, то она одновременно открывается как в первом, таки во втором наборе.
Виноват с поспешным выводом. Локально оттестировал. Работает как надо. Буду искать ошибку. У себя
Бывает
А уж полез проверить…
Не вызвать смех своим поведением…но по поводу глюка я оказался прав.
Взял пример вызова табов отсюда:
http://docs.jquery.com/UI/API/1.7.2/Tabs#options
вместо id=»tabs» поставил class=»tabs»
и сделал вызов $(”div.tabs”).tabs();
Итак что мы наблюдаем:
При переключении табов на на втором наборе вкладок одновременно происходит переключение вкладок и на первом наборе. Если же на первом наборе переключать вкладки, то на втором наборе будет все в порядке. Увы это так.
Вот весь JS
$(function(){ $("div.tabs").tabs(); });Вот разметка:
ну, она ясно несколько раз повторяется…
И вкладки работают независимо друг от друга… Могу моментально код скинуть….
P.S. Только в следующем «этапе» разметки id вкладок ясно дело другие, может у Вас в этом дело?
ВАЖНЫЙ МОМЕНТ! (хотя и вполне закономерный):
Нужно, чтобы id контейнеров и соот-но ссылки на них не должны повторяться в двух наборах элементов:
<a href=»#tab-1″ rel=»nofollow»>One</a>
<a href=»#tab-2″ rel=»nofollow»>Two</a>
<a href=»#tab-3″ rel=»nofollow»>Three</a>
…………
<a href=»#tab-1″ rel=»nofollow»>One</a>
<a href=»#tab-2″ rel=»nofollow»>Two</a>
<a href=»#tab-3″ rel=»nofollow»>Three</a>
………………….
Ну, да… Я же про это в P.S. предыдущего коммента и написал…
Когда писал свой последний пост, не видел еще вашего сообщения.
Ладно, не важно… Главное, что может быть это кому-то еще поможет.
Обсуждение статьи можно продолжить на форуме jQuery.