Изменение содержания по mouseOver, mouseOut
Всем привет.
Вот код: function showText(classname, data) { document.getElementByClassName(classname).inerHTML = data; } <span class="freeseat" onMouseOver = "showText('freeseat','бронь');" onMouseOut = "showText('freeseat','свободно');" > </span> Ничего не происходит, где я накосячил? попробовал убрать событие onMouseOut, оставил лишь <span class="freeseat" onMouseOver = "showText('freeseat','бронь');" > </span> Все равно не работает |
makc9I,
найдите 3 отличия ))) <!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <script> function showText(classname, data) { document.getElementsByClassName(classname)[0].innerHTML = data; } </script> </head> <body> <span class="freeseat" onMouseOver = "showText('freeseat','бронь');" onMouseOut = "showText('freeseat','свободно');" >свободно </span> </body> </html> |
Вложений: 1
рони, спасибо за помощь.
Понял, что мой способ в принципе не подходит для решения задачи. Опишу ее здесь. Проблема такова: Есть такие блоки с данными: <div class="order_box"> <span class="time">10 : 30- </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> </div> Данные дергаются с базы и отображаются в таком виде. Если место свободно, то добавляется класс free. Задача: при наведении на блок с надписью "свободно" менять надпись на "бронь", добавлять пару css стилей(изменение цвета фона блока), а при клике на данный блок показывать <input type=text> с кнопкой OK, нажатие на которую отправит форму и внесет эти данные в бд. |
makc9I,
Вариант ... <!DOCTYPE HTML> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> <!-- div div, span, button { float: left; text-align: center; width: 200px; } div.order_box { width: 404px; } --> </style> <script src="http://code.jquery.com/jquery-latest.js"></script> <script> $(function () { $(".free").mouseenter(function () { $(this).text("бронь").css({ "background": "#FAD400", "color": "#0000CD" }) }).mouseleave(function () { $(this).text("свободно").css({ "background": "", "color": "" }) }).click(function () { var parent = $(this).parent(); var i = $(this).hasClass("seat3")? 0 : 1; $(this).replaceWith($("<button/>", { "text": "OK", "css": { "float": i ? "right" : "left" }, "click": function () { i++; alert($(".seat" + i, parent).text()); i--; $(this).replaceWith($("<span/>", { "text": "заказ принят", "css": { "border": "#32CD32 solid 1px", "color": "#0000FF", "float": i ? "right" : "left" } })) } })); }); }) </script> </head> <body> <div class="order_box"> <span class="time">10 : 30- </span> <span class="destination"> п. Молочное(5007)</span> <br> <div class="seat1 place">Иванов Иван</div> <div class="seat2 place">Сидоров Василий</div> <br> <div class="seat3 place free">свободно</div> <div class="seat4 place free">свободно</div> <br> </div> <br> <div class="order_box"> <span class="time">10 : 30- </span> <span class="destination"> п. Молочное(5007)</span> <br> <div class="seat1 place">Иванов Иван1</div> <div class="seat2 place">Сидоров Василий1</div> <br> <div class="seat3 place free">свободно</div> <div class="seat4 place free">свободно</div> <br> </div> <br> <div class="order_box"> <span class="time">10 : 30- </span> <span class="destination"> п. Молочное(5007)</span> <br> <div class="seat1 place">Иванов Иван2</div> <div class="seat2 place">Сидоров Василий2</div> <br> <div class="seat3 place free">свободно</div> <div class="seat4 place free">свободно</div> <br> </div> </body> </html> |
спасибо за помощь, давно хотел jQuery познать, учиться на живой практике, то, что нужно. Возникло несколько вопросов, но пока не решена основная проблема, нет смысла их задавать. Всё это чудо не работает у меня на IE 9. Конкретно не работает такое:
... <head> <meta charset="windows-1251" /> <title>Заказ автомобилей</title> <link rel="stylesheet" href="css/style.css" /> <script src="js/jquery-1.9.1.min.js"></script> <script> $(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": "", }) }) }) </script> ... </head> <body> ... <div class = 'usual'> <div class = "DateLabel"><span class="date">21 03 2013</span> - <span class="DayName" >Четверг</span></div> <div class="order_box"> <span class="time">11 : 30 - </span> <span class="destination">с. Верховажье(5009)</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="not_approved"> Статус:ожидает подтверждения</div> </div> </div> ... </body> ... |
Цитата:
в обьекте параметров css у вас лишняя запятая и желательно использовать <!DOCTYPE HTML> в начале документа |
Спасибо, действительно проблема была в этом. Декларация документа у меня присутствует, просто я не стал вносить весь код сюда.
Тогда вопросы по существу. Мне нужно немного другое.. Первые 2 события, которые я указал в листинге выше отлично работают и это то, что мне надо. С этим я даже более-менее разобрался что к чему. Но дальнейшая реакция должна быть другой. При клике должно появиться поле ввода для фамилии с кнопочкой ок. Грубо говоря форма с одним инпутом типа текст и кнопкой отправки(submit). По вашему обработчику событий: Я не очень понял смысл этой строчки: var i = $(this).hasClass("seat3")? 0 : 1; как я понимаю, если объект принадлежит к классу seat3 (зачем вообще это проверять?), то i присваивается значение 0, иначе 1. Все дальнейшие манипуляции с этим i тоже вводят меня в ступор. |
Цитата:
css вы не предоставили и это я сделал на своё усмотрение. ...и возможно вам стоит обратится в раздел работа? |
Цитата:
|
makc9I,
смутно представляю чего вы хотите до сих пор ))) может вы дадите живой пример как выглядит <div class = 'usual'> до нажатия кудато там и после нажатия 2 дива на странице с css ... |
от внешних дивов можно абстрагироваться, они просто определяют положение текущего дня в неделе.
У меня отображается целая неделя, грубо говоря если сегодня среда, то понедельник и вторник будут обернуты в 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. |
кое-что получилось, работает почему-то исключительно в IE, хотя обычно происходит наоборот)
Сделал вот такие действия: .mouseenter(function () {} заменил на .bind("mouseenter", function f_mouse_ent() {} ) .mouseleave(function () {} заменил на .bind("mouseleave", function f_mouse_leave() {} ) .click(function () {} заменил на .bind("click", function f_mouse_click() {} ) $(".free").off(); заменил на $(".free").unbind(); Повесил на кнопку отмена такой обрабочик: $("button").click (function(){ $("#add_name_form").remove(); $(this).remove(); $(".free").bind("click", f_mouse_click); $(".free").bind("mouseenter",f_mouse_ent); $(".free").bind("mouseleave",f_mouse_leave); }) |
Смущает меня последний блок.
ведь по идее вызывать функцию надо так: $(".free").bind("click", f_mouse_click () ); Но так не работает, хотя и текущий вариант работает видимо благодаря странному интерпретатору ИЕ, так как он, как мне кажется не правильный. |
Часовой пояс GMT +3, время: 14:54. |