css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
22 Фев
Разберем еще один пример для библиотеки jQuery – построение диалогового окна. При всей полезности этого плагина не могу не отметить, что по крайней мере в IE и Opera присутствуют небольшие огрехи (их можно увидеть и на сайте разработчиков), но они связаны скорее со стилевым оформлением, чем с работой самой библиотеки. В FireFox же и Netscape Navigator никаких проблем не наблюдалось. Поскольку штука получилась весьма полезная – разберем ее подробнее. Внимание! Эта статья устарела! Новую статью можно почитать здесь.
Итак, что мы можем получить подключив несколько javascript-файлов, задав соответствующее стилевое оформление и написав вот такой небольшой кусочек кода.
$("#example").dialog();
Мы получаем диалоговое окно, которое можно перемещать по экрану в любом направлении. Мы можем менять размеры этого окна. И конечно, содержимое этого окна может быть вполне функциональным. Испытайте все это на примере.
Принимайте во внимание, что пример демонстрируется во фрейме.
Вы можете скачать исходный код примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.
В раздел HEAD понадобится подключить довольно много файлов: кроме самой библиотеки jQuery – jquery-1.2.1.js, файлы jquery.dimensions.js, ui.resizable.js, ui.draggable.js, ui.mouse.js и конечно ui.dialog.js
<script type="text/javascript" src="js/jquery-1.2.1.js"></script> <script type="text/javascript" src="js/jquery.dimensions.js"></script> <script type="text/javascript" src="js/ui.dialog.js"></script> <script type="text/javascript" src="js/ui.resizable.js"></script> <script type="text/javascript" src="js/ui.mouse.js"></script> <script type="text/javascript" src="js/ui.draggable.js"></script>
В исходном коде примера Вы сможете посмотреть стилевую таблицу, отвечающую за отображение диалогового окна и при необходимости отредактировать ее под свой дизайн. Обращаю Ваше внимание на, то что имена классов менять нежелательно. В противном случае Вам придется самостоятельно править код в файле ui.dialog.js.
HTML-код не представляет собой ничего интересного – элемент div, который будет служить диалоговым окном с идентификатором и именем класса.
И наконец приведу полностью тот код, который отвечает за диалоговое окно.
<script type="text/javascript">
$(document).ready(function(){
$("#example").dialog({
title: "Пример диалогового окна",
width: 250,
height: 150,
resizable: true,
draggable: true,
position: "center",
buttons: {
"Отправить": function() {
alert("Вы нажали кнопку Отправить");
},
"Закрыть": function() {
$(this).dialog("close");
alert("Вы нажали кнопку Закрыть");
}
}
});
});
</script>
Элемент с идентификатором #example будет служить диалоговым окном. В файле ui.dialog.js большинство опций заданы по умолчанию, мы же для примера попробуем переопределить большинство из них.
title: ‘Пример диалогового окна’ – задаем название диалогового окна.
width: 250 – ширина окна в px.
height: 150 – высота окна в px.
resizable: true – диалоговое окно может (или false – не может) изменять свои размеры.
draggable: true – диалоговое окно может (или false – не может) перемещаться по экрану.
position: center – начальное положение окна на экране. Доступны значения center, left, top.
buttons – об этом несколько подробнее. Эта опция определяет кнопки, которые понадобится отображать в диалоге. Определяются они парами ключ/значение, где ключ – это текст, который необходимо отобразить на кнопке, а в качестве значения может выступать функция, которая должна быть вызвана при клике на соответствующую кнопку.
Вот собственно и все. А внутри диалогового окна можно предусмотреть то, что угодно Вам. Будь то авторизационная форма или форма для отправки e-mail с сайта, или еще что-то…
Отзывов (61) на «Пользовательские интерфейсы: jQuery dialog – диалоговое окно.»
Вид замечательный и работа его удовлетворяет, но есть одно замечание! Впишите в div больше текста чем размер окна – полосы прокрутки нет! Пожалуйста как сделаете доработку – напишите на почтовый ящик и вышлите файлы.
С уважением.
To Владимир a.k.a. misterio:
Вы наверное так поняли, что плагин я писал? Но это вовсе не я. Все что я сделал – это перевод на русский язык того материала, что и Вы можете найти тут: http://docs.jquery.com/UI/Dialog
Правда я старался не столько перевод делать, сколько по-русски растолковать как этим плагином пользоваться. Так что доработка – это не ко мне. Кстати мне плагин не очень понравился. Я для себя использую приемы несколько попроще…
документация по jQuery в удобном виде
http://visualjquery.com/
Помогите, возникла проблема.
Где взять jquery.dimensions.js и ui.mouse.js. Не могу найти -(
Например тут: http://www.linkexchanger.su/download
На самом деле библиотека развивается и сейчас уже появилось ui.core.js, (т.е. ядро ui), где аккумулированы все основные методы работы с пользовательскими интерфейсами.
Постараюсь в ближайшее время рассказать и об этом.
Понятно. Спасибо за ответ.
Отличная статья.
Но вот назрел вопрос: как вызывать диалоговое окно по нажатии на ссылку.
Это довольно просто. Диалоговое окно находится в элементе div с id=»example», так? Вы же можете с помощью таблицы стилей изначально скрыть этот блок, написав для него CSS-правило:
#example {display:none;
}
А дальше, в javascript-коде, что-то вроде этого:
$("a").click(function() {$("#example").show();
});
где a – это как раз ссылка по которой надо кликнуть, чтобы показать диалоговое окно.
Не получается…
Уже мозг лопается…
Блок скрыл!
Далее. Куда это вставить?
$(«a»).click(function() {
$(«#example»).show();
});
Метода show() у dialog’a нет или я не нашел, есть open, но и его применить не получилось…
Помогите пожалуйста…
Ну, то что мозг лопается – это нормально. Это поначалу. Немного освоитесь с библиотекой и будет все намного легче.
Блок скрыли – уже отлично!
Дальше: там где Вы пишете это
$(document).ready(function(){
$("#example").dialog();
});
(Я конечно сократил код, но для понимания принципа это неважно).
Заметьте, что все обернуто в
$(document).ready(function(){...});что позволяет начать выполнять код в тот момент, когда готова объектная модель документа.Дальше, внутри этой функции, до или после
$("#example").dialog();поместите блок кода, который и будет обрабатывать клик по ссылке. Т.е. этот кусок:
$(”a”).click(function() {$(”#example”).show();
});
При таком раскладе диалог будет открываться при клике вообще на любой ссылке на странице. Чтобы задать конкретную ссылку – присвойте ей какой-нибудь id например…
Не знаю как с точки зрения правильности написания кода – но работает
добавил следующее
$(«#example»).dialog(‘close’);
И все! То что хотел. Огромное спасибо за помощь.
Буду дальше мучать jquery или он меня.
И последний вопрос если можно.
У меня в диалоговом окне 2 кнопки ОК и Отмена. Как при нажатии ОК сделать переход на страницу, только в том же окне?
Заранее спасибо.
Возможно Вам стоит попробовать использовать load( url, [data], [callback] ) – загружает HTML из файла и вставляет его в объекную модель документа (DOM). Вот статья: jQuery и Ajax: запросы
А по большому счету совет таков: не привязывайте себя к каким-то плагинам, как правило, они решают общий и широкий круг задач из которых Вам вероятно понадобится только некоторые. Посвятите некоторое время изучению API jQuery и я ручаюсь, что через какое-то время Вы сможете решить большинство задач самостоятельно. Это действительно не так сложно, как может показаться на первый взгляд.
Подскажите как выравнить dialog,что-бы он был в правом верхнем углу?
Знаете, вполне возможно, что у меня в описании неточность. Посмотрел только что вот тут: http://docs.jquery.com/UI/Dialog/dialog#options
position может принимать ‘center’, ‘left’, ‘right’, ‘top’, ‘bottom’ или даже массив, содержащий пару координат (offset от левого верхнего угла вьюпорта).
Создаю диалоговое окно и в него копирую кусок html из другого места. Кусок html представляет собой форму с input-ами. Все отображается нормально. Далее по нажатию кнопки «Ок», я эту форму хочу получить (с измененными данными) и убрать туда, откуда взял. Но вот беда – данные формы толи кэшируются и остаются старыми, то ли просто не изменяются!
Попробуйте почитать статью jQuery Form – делаем ajax-форму. Может мне удастся убедить Вас, что при Вашей задаче не стоит использовать еще и плагин диалогового окна. А использовать форму в отдельном, изначально скрытом div’е например… Его же можно сделать и перемещаемым по странице. А диалоговое окно… Красивый плагин, но в нашем деле чем проще, тем надежнее ИМХО.
Поверьте, лучше посвятить какое-то время изучению документации и через какое-то время Вы обнаружите, что гораздо выгоднее решить свою задачку десятком строк кода, чем использовать плагин на сотню-другую строк…
так и не понял,пишу position: ‘top,right’ а диалог всёравно по центру.помогите.
Вы немного неправильно поняли. Position может принимать значения ‘center’, ‘left’, ‘right’, ‘top’, ‘bottom’ только в виде строки, т.е. иначе говоря, по одному и если Вы напишите ‘bottom’ то диалог расположится внизу, но по центру. Чтобы Вам его расположить в нужных координатах, надо в position написать:
position: [50, 100],
где первая цифра – расстояние в пикселах от левого края родительского контейнера, а вторая, соответственно от верхнего края. По-другому никак…
Cпасибо,понял
Подскажите как сделать так, чтобы фон немного потемнел, на офсайте посмотрел, там сказано про некое свойство overlay, default: none, побробнее CSS.. По этой ссылке ничего не понял..
В стилевом оформлении:
.myDialog.ui-dialog {
background-color: #e6f7d4;
}
задайте свое значение для background-color, именно это свойство отвечает за цвет фона диалогового окна.
Если я конечно правильно понял Ваш вопрос.
Нет, вы неправильно поняли, я имел ввиду фон overlay, фон не диалогового окна, а всего остального.. То есть визуально это может выглядеть как промежуточный полупрозрачный слой полностью закрывающий все содержимое, а диалоговое окно выше это слоя
Надеюсь, что теперь понял. Одной из опций надо передать следующее:
overlay: {
opacity: 0.5,
background: «black»
}
Сам не проверял, но скорее всего эта возможность появилась уже после того, как писалась статья и поэтому лучше попробовать с последней версией самой библиотеки jQuery, вместо jquery.dimensions.js и ui.mouse.js надо будет использовать ui.core.js
В общем как тут http://docs.jquery.com/UI/Dialog
$(”#example”).show(); не работает. Смотрим документацию: http://docs.jquery.com/UI/Dialog/dialog#.22open.22
Работает $(«#example»).dialog(‘open’);
Я бы только уточнил, что это не вообще, а в случае именно с dialog. А то могут подумать, что show() в принципе не работает…
Угу именно это я и имела ввиду, спасибо за уточнение
у вас position: center
а надо position: ‘center’
Да, конечно. Спасибо, что поправили. В исходниках все в порядке, а в статье действительно кавычек не хватало. Исправил…
Здравствуйте у меня вот такая проблемка, пользуюсь ui.resizable, у меня плавающий див и я его ресайзу, так вот если у дива появляються скроллы, то рамка для ресайза оказываеться внутри, а скроллы снаружи. Не подскажите как мне сделать так, чтобы скроллы оказались внутри рамки для ресайза дива. Спасибо
Aberda, вряд ли у Вас проблема в чем-то еще кроме как в стилях… свойство overflow для этого div’а например…
Свой-во overflow здесь не причем, мне как раз и нужно чтоб скроллы были. Я впринципе понимаю почему так происходит, просто рамка которая появляется для ресайза дива – это тоже дивы, которые располагаються внутри тянущегося дива, и там как не крути скроллы все равно будут появляться снаружи этой рамки. Придеться менять в самой ui.resizable чтоб распологал эти дивы за пределами главного дива.
Подскажите пожалуйста, знатоки jQurey – существует ли такая библиотека, с помощью которой пользователь мог бы вращать слой или изображение, так же как и изменять размер? Вообще, реально ли это на Ajax?
2Александр
Стоит копать в сторону тега CANVAS
Спасибо большое за статью. Все бы ничего, да вот проблема:
При клике по ссылке появляется окно, но после его закрытия оно не открывается второй раз.
Очень нужна помощь, в чем может быть проблема? =(
Спасибо за статью. Очень важный у меня к вам вопрос – появился диалог с заданными свойствами. Как после открытия получить доступ к этим свойствам и в нужный момент изменить? Очень нужно сделать что-то типа Wizard-а на странице и включить кнопку Ок например только после заполнения всех страниц.
Лучше всего просто не использовать плагин, а написать этот диалог под себя. Поверьте, это не так сложно как кажется. Просто любой плагин – это некое универсальное решение, зачастую в нем довольно много лишнего и проще написать что-то новое, чем поменять под себя плагин. Если он конечно не содержит в себе ту функциональность, которая Вам и нужна.
Меня вполне устраивает перепиливание уже существующего плагина под себя.
Каким-либо образом обратиться к уже существующим свойствам не получится?
Если коротко, то – Ваш диалог ведь имеет идентификатор например, верно? Соответственно имеется возможность обратиться к элементу с этим идентификатором и всему, что внутри него находится.
Ну например:
$(«#myDialog»).find(«input»).css(«background-color»,»red»);
т.е. всем input’ам внутри диалога установить красный бэкграунд…
Gennady, спасибо огромное. Я правда не полный нуб. Имелось в виду, что создавая из элемента диалог $(this).dialog() при повторном применении создаются те же стили с указанными свойствами, которые сформируют новый диалог. Т.е. переопределить свойства старого диалогового окна через вызов .dialog() не получится.
Детальнее, именно по использованию плагина, я уже вряд ли подскажу что-то полезное. В практике его не пользую. Обычно беру draggable() и на его основе ваяю то, что нужно. Поэтому и говорил несколькими постами выше, что свое – проще…
Здравствуйте, объясните мне пожалуйста почему ко мне на почту приходят пустые письма с заголовком о новом комментарии на какую-то из ваших тем?
Я не подписана и не участвую в обсуждении этих тем! Можно как то это прекратить?
Спасибо
Вообще-то Вы были подписаны на две темы:
«Пользовательские интерфейсы: jQuery dialog – диалоговое окно.» и «jQuery API: Events – события. Часть 2.»
Ваши подписки удалены.
Спасибо! Просто если б эти письма приходили не пустые, а хотя бы с ссылками на поступивший комментарий, то другое дело, а так заходишь в письмо и пусто не перейти не посмотреть, а на сайт самому заходить искать эту тему знаете как то долго….
Может исправили бы пустое содержание писем…
какие бы вы плагины посоветовали для скругления углов окна?
или может быть это легче сделать средствами css?
В каждом случае наверняка будет свое решение. Если говорить о JS, то есть довольно простой плагин к jQuery – jQuery Corner. Либо с помощью CSS – «раздвижные двери» или «горная вершина».
Совместил диалог и яджак форму, всё бы хорошо, но работает только один раз, потому что при закрытии диалога не чистится DOM и контент остаётся, в том числе и форма с айдишником. Как заставить плагин подчищать за собой. Я так понял можно при передаче параметров сделать close: function() {//а вот здесь фантазия уже закончилась}
Aderba, насчёт скролов ты не прав, всё работает
.ui-dialog-content {overflow: auto;}
Возникла проблема при попытки вывести в диалоговом окне flash
Во всех браузерах кроме Firefox все нормально, а в Firefox страница не выводится вообще, а flash выводится дважды.
По умолчанию диалоговое окно закрыто.
Кто-нибудь пробовал flash в диалоговом окне выводить?
Подскажите пожалйста, вызываю диалоговое окно таким образом. Открывается, но при закрытии этого окна больше открыть не возможно. В чём может быть проблема?
onclick=»$(‘#example’).dialog();»
Для открытия окна пишем (”#example”).dialog(’open’);
Вы open в скобках не указали
Кто-нибудь знает, как сделать, чтобы при изменении содержимого внутри диалога (ajax), изменялся размер диалога? У меня все, что загружается внутри диалогового окна, в результате обрезается и приходится вручную изменять размер.
Я блок с диалогом скрыл.
Hello
Повесил его открытие на клик по .a_open. Но при открытии страницы всё-равно появляется диалог, но без текста внутри, ‘Hello’ появляется при клике на .a_open. Как это исправить?
Смотреть тут самую свежую версию – это во-первых. Во-вторых, часть разметки диалогового окна насколько помню, создается в самом плагине, в общем может и поэтому у Вас проблема возникает. Попробуйте все-таки свежие примеры с сайта jQuery посмотреть.
Геннадий, не могли бы Вы подсказать, как ’повесить’ действие на событие сlose диалогового окна?
из документации:
$(‘.selector’).bind(‘dialogclose’, function(event, ui) {
…
});
функция принимает 2 аргумента:
1)event
2)ui
что это за аргументы?
$('.selector').dialog({ close: function(event, ui) { ... } });это, когда Вы можете сразу (при загрузке страницы) предоставить callback-функцию, которая будет вызываться при закрытии диалога.
$('.selector').bind('dialogclose', function(event, ui) { ... });это, когда Вам необходимо связать callback-функцию с закрытием диалога уже после загрузки страницы (по каким-то причинам).
Что касается аргументов event, ui – то:
event – это объект события, которое имеет определенные свойства. Например свойство type в котором содержится имя события (click, mouseover и т.д.), или target (srcElement для IE) и т.д.
ui – это собственно объект диалоговое окно, правда что-то в доках я про его свойства не могу найти информацию, но скорее всего по аналогии с draggable есть свойства position и offset.
Использую jquery UI dialog.
используется несколько диалогов, основной, с формой для внесения данных и диалог для вывода ошибок обработки формы. оба диалога модальные.
Проблема в том, что при появлении сообщения об ошибке и последующем возврате к форме, теряется возможность изменять данные в полях сформированных через . При этом поля типа textarea вполне нормально работают. есть идеи как с этим бороться?
Вряд ли дельное посоветую – UI вообще стараюсь не использовать. Много лишнего имхо. Может из тех кто активно использует, что-то подскажет…
Можно ли сделать чтобы диалоговое окно перемещалось за пределы фрейма поверх других фреймов на странице?
Комментирование статьи завершено.