от внешних дивов можно абстрагироваться, они просто определяют положение текущего дня в неделе.
У меня отображается целая неделя, грубо говоря если сегодня среда, то понедельник и вторник будут обернуты в div class = "past", среда в div class="today", выходные в div class="holliday", остальные usual. вот так выглядит блок с заказом: <div class="order_box"> <span class="time">7 : 00 - </span> <span class="destination">Вологда(5001)</span> <div class="seat1 place">Иванов Иван</div> <div class="seat2 place free">свободно</div> <div class="seat3 place free">свободно</div> <div class="seat4 place free">свободно</div> <div class="approved"> Статус:подтверждено</div> </div> Если мы кликаем на seat2 к примеру, то там должна появиться такая конструкция <div class="seat2 place free"> <form action="url" method="POST"> <input type="text" name="name"> <input type="submit" value="ok"> </form> </div> Человек вводит туда свое ФИО, к примеру Сидоров Андрей, нажимает ок. Отрабатывается форма, данные улетают в базу, страница перезагружается и теперь мы видим такой блок: <div class="order_box"> <span class="time">7 : 00 - </span> <span class="destination">Вологда(5001)</span> <div class="seat1 place">Иванов Иван</div> <div class="seat2 place">Сидоров Андрей</div> <div class="seat3 place free">свободно</div> <div class="seat4 place free">свободно</div> <div class="approved"> Статус:подтверждено</div> </div> |
makc9I,
так? <!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <script src="http://code.jquery.com/jquery-latest.js"></script> <script> $(function () { $(".free").mouseenter(function () { $(this).text("бронь").css({ "background": "#FAD400", "color": "#0000CD", "cursor": "pointer" }) }).mouseleave(function () { $(this).text("свободно").css({ "background": "", "color": "", }) }).click(function () { var myform = $("<form/>", { "action": "url", "method": "POST" }) $("<input/>", { "type": "text", "name": "name" }) .appendTo(myform); $("<input/>", { "type": "submit", "value": "ok" }) .appendTo(myform); $(".free").off(); $(this).html(myform) }); }) </script> </head> <body> <div class="order_box"> <span class="time">7 : 00 - </span> <span class="destination">Вологда(5001)</span> <div class="seat1 place">Иванов Иван</div> <div class="seat2 place free">свободно</div> <div class="seat3 place free">свободно</div> <div class="seat4 place free">свободно</div> <div class="approved">Статус:подтверждено</div> </div> </body> </html> |
да, это именно то, что надо.
Только интересно, почему фокус с этого инпута уже никуда не пропадает, т.е. как только мы кликнули в поле, мы уже не может просто кликнуть в соседнее поле, ничего не произойдет. Думаю это логично, но нужна кнопка отмена, которая будет возвращать прежний вид полю("свободно" или "бронь" при наведении). Еще надо дать имя инпуту такое же как и имя класса дива, внутрь которого мы кликнули, т.е. seat1-seat4. Также я немного модифицировал данные о блоке, теперь внешний див имеет такой вид: <div class="order_box" id="<уникальный id>"> Вот необходимо добавить скрытый инпут,value параметр которого будет содержать id родительского diva класса order_box. Пока это все написал и буду пробовать реализовать, может и у самого получится :) |
makc9I,
$(".free").off(); это отключило все прежние установки. ... кнопка отмена ))... вот так проект разрастается ))) пробуйте сами что неполучится страшивайте. |
стал изучать курс по Jquery от codeSchool. Хоть и курс малюсенький, но я после работы прихожу уставший и это дело тянется уже неделю. Само задание почти не движется. Пытаюсь делать методом тыка и тех малых знаний, что уже получил с курса.
Кнопку отмена добавил, но не так, как надо. добавил так: $(document).ready(function () { $(".today .free, .usual .free, .holliday .free").mouseenter(function () { $(this).text("бронь") .css({ "background": "#FAD400", "color": "#0000CD", "cursor": "pointer" }) }).mouseleave(function () { $(this).text("свободно") .css({ "background": "", "color": "" }) }).click(function () { var myform = $("<form/>", { "action": "<?PHP $_SERVER['PHP_SELF']; ?>", "method": "POST" }) $("<button> отмена</button>") .appendTo(myform); Все бы хорошо, но кнопка обрабатывается методом, указанным в форме при клике, так как лежит внутри ее(формы). Можно конечно вместо кнопки сделать какой-нибудь span или div, но хочется именно кнопку без лишних заморочек со стилями, тем более что новые браузеры позволяют вставить кнопку где угодно. Не обязательно внутри формы. Пытался сделать так: ... .click(function () { $(this).append("<button> отмена</button>"); } не получается так, грубо говоря мне надо просто добавить button ниже формы внутри этого же дива класса free. Я еще не научился грамотно ходить по DOMу видимо, и делаю какие-то нелепости. |
Проблему решил, все достаточно просто, завтра выложу, как получилось.
|
вот такой получился код:
$(".today .free, .usual .free, .holliday .free").mouseenter(function () { $(this).text("бронь") .css({ "background": "#FAD400", "color": "#0000CD", "cursor": "pointer" }) }).mouseleave(function () { $(this).text("свободно") .css({ "background": "", "color": "" }) }).click(function () { var myform = $("<form/>", { "action": "<?PHP $_SERVER['PHP_SELF']; ?>", "method": "POST" }) $("<input/>", { "type": "text", "name": "name", "class": "name_input" }) .appendTo(myform); $("<input/>", { "type": "submit", "value": "ok", "id": "name_submit" }) .appendTo(myform); $(".free").off(); $(this).html(myform); $(this).append("<button> отмена</button>") $(this).css ({ "cursor":"default" }) }) }) Теперь осталось как-то удалить всю форму по нажатию кнопки отмена. |
добавление к листингу такого:
$("button").click (function(){ $("#add_name_form").remove(); }) не работает что-то |
Практически все получилось.
Полная картина выглядит так: Имеется такой блок: <div class="order_box" id="56"> <span class="time">10 : 00 - </span> <span class="destination">п. Молочное(5007)</span> <div class="seat1 place">Иванов</div> <div class="seat2 place">Петров</div> <div class="seat3 place free">свободно</div> <div class="seat4 place free">свободно</div> <a class="approve_btn" href="/index.php?&id=56"> подтвердить </a> <div class="not_approved"> Статус:ожидает подтверждения</div> </div> Визуально выглядит так: ![]() При наведении на любую ячейку с надписью свободно видим следующее: ![]() Клик по ячейке приводит к такому: ![]() Вот код, который занимается обработкой сего чуда: $(document).ready(function () { $(".today .free, .usual .free, .holliday .free") .mouseenter(function () { $(this).text("бронь") .css({ "background": "#FAD400", "color": "#0000CD", "cursor": "pointer" }) }).mouseleave(function () { $(this).text("свободно") .css({ "background": "", "color": "" }) }).click(function () { var myform = $("<form/>", { "action": "http://auto/index.php", "method": "POST", "id": "add_name_form" }) $("<input/>", { "type": "text", "name": "name", "class": "name_input" }) .appendTo(myform); $("<input/>", { "type": "submit", "value": "ok", "id": "name_submit" }) .appendTo(myform); var cell_class = $(this).attr("class").slice(0,5); var order_id = $(this).parent().attr("id"); $("<input/>", { "type":"hidden", "name": "place", "value": cell_class }) .appendTo(myform); $("<input/>", { "type":"hidden", "name": "order_id", "value": order_id }) .appendTo(myform); $(".free").off(); $(this).html(myform); $(this).append("<button> отмена</button>"); $(this).css ({ "cursor":"default" }) $("button").click (function(){ $("#add_name_form").remove(); $(this).remove(); }) }) }) Во всем этом есть одна брешь: $(".free").off(); Как только мы вызываем метод off, мы лишаемся всех настроек для нашей ячейки, но это необходимо, чтобы можно было кликнуть в input text для ввода фамилии, и выводы мыши за пределы ячейки не приводили к отмене обработки. Но, вдруг мы случайно кликнули в ячейку и хотим отменить это действие, для этого я и добавил кнопку "отмена". Вот ее обработка: $("button").click (function(){ $("#add_name_form").remove(); $(this).remove(); }) Все, что я могу сделать, это удалить созданную ранее форму. Но хочется, чтобы вся обработка положения мышки также вернулась, думал, что для этого достаточно прикрутить назад такое: $(".today .free, .usual .free, .holliday .free") .mouseenter(function () { $(this).text("бронь") .css({ "background": "#FAD400", "color": "#0000CD", "cursor": "pointer" }) }).mouseleave(function () { $(this).text("свободно") .css({ "background": "", "color": "" }) }) Но как оказалось, прикручивать назад надо вообще весь код, но ведь в этом коде присутствует сама обработка нажатия на кнопку "отмена" и происходит рекурсия. Да и в целом не очень разумно дважды вызывать один и тот же код. Возникли мысли, что надо как-то обойтись без $(".free").off(); Но при этом как-то блокировать обработку мыши на момент клика по ячейке (бронь), чтобы выход за пределы ячейки не приходили к сбросу отображения формы, и сам клик в input text обрабатывался именно как клик туда(чтобы вводить текст), а не как клик по ячейке (бронь). Вот возникла проблема, решения пока не нашел. |
рони посоветовал использовать метод bind, теперь я реализовал все обработчики через него, вышло примерно так:
вместо .mouseenter(function () {} получилось .bind("mouseenter",( function () {} ) При обработке клика в ячейку я делаю следующее $(".free").unbind(); Как я понимаю, при нажатии на кнопку отмена нам необходима снова вызвать bind, но помимо обработчиков нужны ведь еще и сами действия, т.е. я принципиально не понимаю разницы между off и unbind. |
Часовой пояс GMT +3, время: 09:46. |