css, html, php, javascript, jQuery, ajax … – решения, примеры, рецепты
30 Янв
Эту штуку можно часто встретить, когда сталкиваешься с заполнением форм, там где требуется ввести дату или диапазон дат в нужном формате. Пользователь, он же обязательно ошибется и введет дату не в том формате, потом будет соображать, где ошибка, а потом и вовсе уйдет, не заполнив форму… Вот для того, чтобы сделать выбор даты очень простым и удобным и предназначен этот UI jQuery. Календарь, или что точнее datepicker. Внимание! Эта статья устарела! Новую статью можно почитать здесь.
Как всегда для начала демонстрация примеров, а затем разберемся, как это использовать у себя. Клик по текстовому полю слева заставит работать календарь с выбором одной даты. Справа – календарь с выбором диапазона дат.
Вы можете скачать исходный код примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.
В раздел HEAD понадобится подключить всего два файла: библиотеку jQuery – jquery-1.2.1.js и файл ui.datepicker.js
[/html] <script type="text/javascript" src="js/jquery-1.2.1.js"></script> <script type="text/javascript" src="js/ui.datepicker.js"></script> [html]
В исходном коде примера Вы сможете посмотреть стилевую таблицу, отвечающую за отображение календаря и при необходимости отредактировать ее под свой дизайн. Эта часть кода выделена комментариями /* Стили для jQuery UI Datepicker */.
HTML-код не представляет собой ничего интересного – это простые текстовые поля ввода. Не забудьте только, что наш скрипт будет обращаться к этим элементам по их идентификаторам.
И наконец приведу очень простой код, который будет вызывать UI Datepicker:
<script type="text/javascript">
$(document).ready(function(){
$("#example").attachDatepicker();
$("#exampleRange").attachDatepicker({
rangeSelect: true,
yearRange: "2000:2010",
firstDay: 1
});
});
</script>
Элементу с идентификатором #example назначен простой календарь с выбором только одной даты, т.е. это настройки по умолчанию.
Для элемента #exampleRange заданы опции:
rangeSelect: true – как раз и задает возможность выбора диапазона дат.
yearRange: ‘2000:2010′ – установка диапазона дат календаря.
firstDay: 1 – задает первый день недели, где 1 – это понедельник.
Вообще настроек масса. Это и установка начальной даты, которая будет выбрана при старте календаря, и возможность установки минимальной и максимальной разрешенной для выбора даты, и даже возможность через опции задать название дней и месяцев на родном языке и многое другое. Полный перечень можно найти здесь.
Но, честно говоря мне показалось более уместным задать некоторые настройки непосредственно в самом файле ui.datepicker.js, благо сделать это совсем несложно. Тем более, что оригинальный файл, который можно скачать на сайте разработчиков содержит все названия на английском языке, а мы будем использовать русский. Сделать это довольно просто. Надо открыть файл в текстовом редакторе и сделать совсем небольшой перевод функции Datepicker().
Кому это покажется сложным, может воспользоваться моим переводом. В архив примера включен файл datepicker.translate.js, в котором и содержится перевод.
Если найдете время оставить отзыв – спасибо!
Отзывов (56) на «Пользовательские интерфейсы jQuery: datepicker – календарь для выбора дат.»
Списабо Геннедий! Это очен помогло мне.
Спасибки! Отличный скрипт.
С jquery-1.2.6.pack.js не работает (Ошибка «Объект не поддерживает это свойство или метод»). И я посметрел в код этой страницы и не нашел подключения ни одного из вариантов datepicker.js.
И вот ссылка (http://marcgrabanski.com/pages/code/jquery-ui-datepicker) на сайт разработчика, а то пришлось искать, чтобы скачать новую версию и тамже есть куча примеров использования.
To the_hamster:
>> И я посметрел в код этой страницы и не нашел подключения…
Пример во фрейме – поэтому в коде этой страницы его быть и не может.
За ссылку спасибо. Просто учитывайте, что статья была написана в январе, когда 1.2.6 в проекте не было, а была только 1.2.1
действительно, с jquery 1.2.6 НЕ работает.
Error:
name: TypeError
message: Statement on line 5: Type mismatch (usually a non-object value used where an object is required)
Что можно сделать с этим? Или получается, более свежие версии jquery лишены этого плагина?
Когда что-то не работает, причину стоит поискать на месте, т.е. в себе, в своем коде и т.д.
Вот ссылка на рабочий пример который прекрасно работает с версией 1.2.6 – откройте исходники и посмотрите…
обидны ваши намёки на криворукость.
в коде всё отлично. линковал прямо ваш из примера — не работало.
после кучи проверок был сделан вывод о корявом кешировании в браузере (больше не начто было грешить). когда кеш сбросился, весь код, даже первоначальный, линковоый со своего локала. чудесным образом заработал корректно. почему не работало, и что за гадость была в кеше — осталось тайной.
Я правда не хотел Вас обидеть, извините…. Просто я практически каждый день сталкиваюсь с тем, что люди утверждают что где-то что-то не работает… В итоге оказывается, что собака вовсе не там порылась…. И просто невнимательно читали, не туда посмотрели, не так поняли…
Вот и наболело, как говорится. Извините.
Господи, а сколько весит то, сама библиотека jquery и то поменьше.
У меня тоже возникла проблема при попытке скопировать пример… пишет: строка 237 Ошибка «Объект не поддерживает это свойство или метод»
Ругается на вот эту строку:
$(‘#example’).attachDatepicker();
Возможно Вы пытаетесь использовать старую версию datepicker с новой jQuery… Вообще всегда самую свежую информацию можно обнаружить непосредственно у разработчиков. А в данном случае, поскольку datepicker официально включен в состав ui.jQuery, то можно смотреть на ui.jquery.com
Установил всё новое(jQuery, ui.datepicker) на сайт.
Использую тему по умолчанию – ui.datepicker.css
Но увы в IE6 она выводит календарь не правильно.
В остальных ( не IE ) браузерах всё нормально
Помогите разобраться.
То, что он умеет выводиться правильно, это факт:
http://ui.jquery.com/repository/latest/demos/functional/#ui.datepicker
Последний пример – работает!
А вот у меня нет!!!
http://193.203.61.122/index.php
Неправильно выводится в IE – это в том смысле, что выводится вверху окна браузера? Тогда это скорее всего связано с CSS.
Например: Вы хотите использовать абсолютное позиционирование какого-то блока. При этом необходимо помнить, что в этом случае для его родителя надо явно прописать правило position:relative;
Проверьте на всякий случай…
При совместном использовании плагинов effects.core.js и ui.datepicker.js возникает конфликт, вследствие чего календарик не функционирует.
effects. у меня нет!
Можт версия jQuery виновата?
Проблема не в версии jQuery.
Видимо, какой-то внутренний конфликт effects.core.js и ui.datepicker.js
Пробую запускать demo в IE – всё рулит….
Каким образом там правиться CSS , чтобы календ.не выводился криво никак не разберу!
Подтверждаю, что на asp страницах не работает.
Пришлось использовать этот гибрид: http://www.west-wind.com/weblog/posts/213015.aspx
Браузеру побарабану что на серевере – будь то ASP или PHP или что-то другое…. он выполняет то, что получит по http запросу, а это HTML, JavaScript и CSS – потом выстраивает в DOM и выводит его…
Все это верно, но проблема, как выяснилось, в том что asp сервер не может найти id контрола, которому предназначен скрипт. То же самое, кстати, случалось и с другими J-based контролами.
Если работает jQuery на стороне клиента (браузера) и использует для поиска свою функцию $(); , то при чем тут ASP ? Речь шла о проблеме отображения ui.datapiker.js в браузере IE , а отображается он JavaSript-ом ….
У меня страничка тоже формируется с помощью PHP , но я к PHP по обходу DOM не обращаюсь! Нафик это надо, если jQuery сам это отлично делает?
Можт я чё не так понимаю?
После генерации HTML разметки TextBoxId на клиента уже приходит как, например ctl00_ContentPlaceHolder__valueTextBoxId. Естественно jQuery уже не может его «увидеть». Решение и было найдено в указанной ссылке в корректном получении ID контрола: Control ctl = Root.FindControl(Id);
При совместном использовании плагинов effects.core.js и ui.datepicker.js возникает конфликт, вследствие чего календарик не функционирует!
Кто-нибудь сталкивался с такой проблемой?
Здравствуйте!
Прежде всего, спасибо Геннадий за ваш сайт.
У меня такая проблема: моя страничка в кодировке win-1251 а плагин похоже в utf-8. В общем у меня абракадабру выводит в календарике. Что мне делать? Перекодировать я пробовал, но ничего не получилось.
Почему? Открываете файл в каком-нибудь редакторе, который дает возможность сменить кодировку и сохраняете файл в нужной Вам. Ничего особенного.
А какой именно файл? С переводом? Я пробовал в «Штирлице» перекодировал все, что мог(( Никакого эффекта. Я понимаю, что большая часть проблем от невнимательности… Просто я вчера весь вечер мучился и сейчас… Уже все вроде бы проверил…
Похоже я немного поторопился. Видимо нет другого выхода, кроме как сделать страницу, куда вставляется плагин в кодировке utf-8.
Как пример: http://193.203.61.122/
всё работает и на win1251
Отлично. Поделитесь секретом с 2B…
Перекодировал из UTF8 в WIN1251, получил – http://193.203.61.122/ui.datepicker-ru.js
Да, плииз)
если у кого-то не работает с 1.2.6, советую глянуть здесь http://www.samborsky.com/javascript/jquery/233/
мне больше понравился плагин jquery.dynDateTime
правда там русификация подключается отдельным скриптом и она не работает, пришлось взять англицкую и перевести. Отослал переведенный вариант автору, он обещал в следующий релиз включить.
а datepicker заглючил даже на этой страничке – в данный момент например он у меня закрыл полностью строчку инпута…. хотя видимо это особенность конкретно этой странички, когда открывается месяц с 6 строками дат, ему не хватает места и его сносит вверх
При совместном использовании плагинов effects.core.js и ui.datepicker.js возникает конфликт, вследствие чего календарик не функционирует!
Как избежать или как лечить?
Использовал вместо стандартного длешного – отлично
почему при задании defaultDate, что бы она вписалась в поле необходимо ручками открыть и закрыть календарь ? как сделать вписывание defaultDate автоматически ?
подскажите плиз, как передать в сам календарь список или массив дат, которые надо выделить, мне нужно отобразит календарь и выделить уже существующие на этим датах какие либо события? не могу найти в документации
Здравствуйте, подскажите, пожалуйста, как сделать так, чтоб выбраное значение в календаре сабмитилось на сервер, при условии что наш input будет находиться в форме? простое добавление формы в код не решает проблемы:(
Извините, туплю, вопрос исчерпан)))))
Добрый день Геннадий, хотелось бы сделать так чтобы можно было выбрать несколько дней, а не только 2 дня, не подскажете? Может быть уже есть способ, чтобы самому не придумывать?
Можно ограничивать диапазон выбора дат – это точно. Насчет выбора более трех дат – по-моему нет, не видел. Посмотрите повнимательнее
http://jqueryui.com/demos/datepicker/#default
Здравствуйте Геннадий хочу изменить дату на такой формат 2009-06-01
делаю так:
$(document).ready(function(){
// —- —–
$(‘#example’).attachDatepicker();
$(‘#example’).attachDatepicker(‘option’, ‘dateFormat’, ‘yy-mm-dd’);
$(‘#exampleRange’).attachDatepicker({
rangeSelect: true,
yearRange: ‘2000:2010′,
firstDay: 1
});
});
Но почему то не получается где же ошибка ??
А зачем сеттер при инициализации использовать?
$(’#example’).attachDatepicker({ dateFormat: 'yy-mm-dd' });и datepicker, который «висит» на элементе с идентификатором #example будет инициализирован с соответствующим форматом даты.
Очень полезная штука, но в то же время и бесполезна. Хотелось бы получать в результате массив выбранных дат, если использовать вариант с выбором интервала. Может кто видел что то аналогичное, но чтобы возвращало массив аля
array ([dat] =>Array (
[0] => 01.06.2009 ,
[1]=>02.06.2009,
[2]=>03.06.2009))
и сохранял страницы с примерами – всёравно не работает. извиняюсь за, наверно, очередной глупый вопрос – подскажите пожалуйста где копнуть? только скобки нашёл криво расположенные. думаю проблема именно в них
Насчет массива… Я тоже не нашел, вроде в доках нет. Разве что-то искусственным образом городить по onClose или onSelect. Это просто как мысль…
Gennady, я данный вопрос решил при помощи функции на php, которую накидал минут за 25. Если кому надо пишите на ящик, скину.
Беру на Вашем сайте уже второй пример и ни один не работает. Всё приходиться дорабативать. И не говорите мне про то что не там собака зарыта
Ну тогда Вам мой добрый совет – не берите ничего на моем сайте и дорабатывать не придется. Вот Вам ссылка на первоисточник:
http://jqueryui.com/demos/datepicker/
Дерзайте
Так кто-нибудь ответит на вопрос «Почему при совместном использовании с другими компонентами, этот календарь перестаёт работать??». Или все так и будут тему переводить? Вообще, это по-любому конфликт между jQuery и этим календарём. То есть конфликтуют скорее всего из-за использования псевдонима «$». Кто-нибудь знает как это решить. $.noConflict не помогает…
NLS, да не может быть конфликта между библиотекой и плагином, для нее разработанным.
А по-хорошему, обратите внимание на начало статьи и почитайте свежие материалы на эту тему:
http://www.linkexchanger.su/2009/103.html
Есть вопрос, если я из ПХП передаю даты, более чем одну…. есть ли какой-нибудь вариант подсветить их в датапикере ?
Есть ли у него вообще (я так понимаю что недокументированная функция), которая позволит ей скармливать даты, а она их подсветит… перед созданием (выводом) датапикера
Лучше почитать статью посвежее jQuery UI – виджет Datepicker.
Вообще кое что сделать можно – я бы и рад Вам набросать пример кода, но не здесь… Пожалуйста, есть форум jQuery, задавайте свои вопросы там.
А здесь обсуждение, извините, закрыто.