Решение задач по JQuery, JS, HTML и CSS
Здравствуйте! По интернету я уже довольно долго ищу помощь по своему не очень удобному вопросу. У меня есть довольно старые задачи по JQuery, которые мне тяжело решить толково. Очень рассчитываю на местную помощь, критику, советы и поправки, я все принимаю :help: :help: .
Итак: 1. jQuery модель событий. 1) Напишите обработчик события, который делает следующее. При клике мышью на любом из названий мотоциклов в этом блоке: <ol id="moto_models"> <li>Харлей Дэвидсон</li> <li>Кроссовый мотоцикл</li> <li>Гоночный мотоцикл</li> <li>Концептуальный мотоцикл</li> </ol> У Вас в таблице с id="moto_table" должна появляться новая строчка, в которой плавно появляется текст из элемента, по которому кликнули. 2) Вам нужно написать обработчик события, который будет подсвечивать строку таблицы (id="moto_table"), на которую навели курсор мыши вот таким цветом: #1F233C, а текст будет делать белым. Подсказка: если нет идей, как решить данную задачу, то повторите урок «Функции css()». Код здесь у меня вышел так: ФАЙЛ HTML
<!DOCTYPE html>
<html>
<head>
<title> Практическая работа № 16 (1) </title>
<script="text/javascript" src="jquery-3.4.1.min.js"></script>
<style type="text/css">
.color_table th,
#first_tr
</style>
</head>
<body>
<ol id="moto_models">
<li>Харлей Дэвидсон</li>
<li>Кроссовый мотоцикл</li>
<li>Гоночный мотоцикл</li>
<li>Концептуальный мотоцикл</li>
</ol>
<table border='1' id="moto_table" style="display:none;" class="color_table">
<tr>
<th>Таблица</th>
</tr>
</table>
<script src="script.js">
</script>
</body>
</html>
ФАЙЛ JS:
$('ol li:nth-child(4)').css({
'color': 'blue'
});
$("#moto_table").show(1500);
$('th').hover(function() {
$('th').css("background-color", "#1F233C");
$('th').css("color", "#FFFFFF");
}, function() {
$('th').css("background-color", "#FFFFFF");
$('th').css("color", "#000000");
});
jQuery("#moto_models li").click(function() {
var t = $(this)[0].innerText;
$("#moto_table").append("<tr><td>" + t + "</td></tr>");
$('tr td:last').hide(0).show(1000);
$(".color_table tr:not(#first_tr)").addClass("colors");
$(".colors:last").css("background-color", "#FF0000");
var tr_clr = $(".colors:last").css("background-color");
$(".colors:last").css("background-color", "white");
$(".colors").hover(function() {
if ($(this).css("background-color") != tr_clr) $(this).css("background-color", "#1F233C")
}, function() {
if ($(this).css("background-color") != tr_clr) $(this).css("background-color", "white")
});
$(".color_table tr:not(#first_tr)").addClass("texts");
$(".texts:last").css("color", "#FF0000");
var txt_clr = $(".texts:last").css("color");
$(".texts:last").css("color", "black");
$(".texts").hover(function() {
if ($(this).css("color") != txt_clr) $(this).css("color", "white")
}, function() {
if ($(this).css("color") != txt_clr) $(this).css("color", "black")
});
});
Здесь в принципе все было хорошо, но если у вас есть слова насчет этого кода (улучшения, сокращения, критика и т.п.), то буду очень рада услышать. П. С. Можете не обращать внимание на первую строку JS-кода. Она чисто для теста и к заданию пока что отношения не имеет. 2. jQuery события hover() и toggle(). Перед вами стоит 2 задачи: 1. С помощью события hover() и функции css() сделайте так, чтобы при наведении на кнопку "Отправить заявку", ее свойства менялись: а. Фоновый цвет должен меняться на #32375D. б. Цвет текста на белый. Когда же курсор мыши убирается с элемента, то все должно возвратиться на свои места. 2. С помощью toggle() сделайте так, чтобы при первом щелчке строка таблицы подсвечивалась, а при повторном принимала обычное положение (здесь уже css() использовать не обязательно, можете использовать классы). Код преобразовался следующим образом: ФАЙЛ HTML
<!DOCTYPE html>
<html>
<head>
<title> Практическая работа № 16 (1) </title>
<script="text/javascript" src="jquery-3.4.1.min.js"></script>
<style type="text/css">
.color_table th,
#first_tr,
.button
</style>
<style>
.sting_flash {
background-color: yellow;
}
</style>
</head>
<body>
<ol id="moto_models">
<li>Харлей Дэвидсон</li>
<li>Кроссовый мотоцикл</li>
<li>Гоночный мотоцикл</li>
<li>Концептуальный мотоцикл</li>
</ol>
<button class="button">
Отправить заявку
</button>
<p></p>
<table border='1' id="moto_table" style="display:none;" class="color_table">
<tr>
<th>Таблица</th>
</tr>
</table>
<script src="script.js">
</script>
</body>
</html>
ФАЙЛ JS:
$('ol li:nth-child(4)').css({
'color': 'blue'
});
$("#moto_table").show(1500);
$('th').hover(function() {
$('th').css("background-color", "#32375D");
$('th').css("color", "#FFFFFF");
}, function() {
$('th').css("background-color", "#FFFFFF");
$('th').css("color", "#000000");
});
$('button').hover(function() {
$(this).css("background-color", "#32375D");
$(this).css("color", "#FFFFFF");
}, function() {
$(this).css("background-color", "#FFFFFF");
$(this).css("color", "#000000");
});
jQuery("#moto_models li").click(function() {
var t = $(this)[0].innerText;
$("#moto_table").append("<tr><td>" + t + "</td></tr>");
$('tr td:last').hide(0).show(1000);
$(".color_table tr:not(#first_tr)").addClass("colors");
$(".colors:last").css("background-color", "#FF0000");
var tr_clr = $(".colors:last").css("background-color");
$(".colors:last").css("background-color", "white");
$(".colors").hover(function() {
if ($(this).css("background-color") != tr_clr) $(this).css("background-color", "#1F233C")
}, function() {
if ($(this).css("background-color") != tr_clr) $(this).css("background-color", "white")
});
$(".color_table tr:not(#first_tr)").addClass("texts");
$(".texts:last").css("color", "#FF0000");
var txt_clr = $(".texts:last").css("color");
$(".texts:last").css("color", "black");
$(".texts").hover(function() {
if ($(this).css("color") != txt_clr) $(this).css("color", "white")
}, function() {
if ($(this).css("color") != txt_clr) $(this).css("color", "black")
});
});
var flashing = document.getElementById('moto_table');
flashing.addEventListener('click', function(e) {
var target = e.target;
if (target.tagName === 'TD') {
target.classList.toggle('sting_flash');
}
}, false);
А здесь у меня возникли уже серьезные недомогания. Опять же, можно сказать, что все работает по условиям задания, но это не совсем так. С условием "Когда же курсор мыши убирается с элемента, то все должно возвратиться на свои места" я не смогла справиться, так как не понимаю, как правильно отменить эффект hover'а здесь. Мне нужно именно вернуть кнопку в исходное положение, а не преобразовать ее как-то иначе, то есть после того, как сработал hover, мне нужно, чтобы кнопка вернулась в состояние по умолчанию. По условиям желательно бы, чтобы это было осуществлено так же в файле скрипта JS. Далее идет toggle. Честно, я боюсь нарушать построение функций и с условием toggle'а я дольше всего боролась, но это все, что я смогла понять и сделать. Здесь нет JQuery, но должен быть. Плюс подсветку таблицы желательно бы сделать плавной и именно светящейся, хотя я вообще не понимаю, как в такую функцию можно встроить эти миллисекунды. 3. Понятие объекта события. Вам надо написать скрипт, который делает следующее. При щелчке на любом из наших 4-х мотоциклов, вокруг него должна появляться сплошная рамка в 4px. При этом, если в момент щелчка мышью по мотоциклу была зажата клавиша shift, то цвет рамки должен быть #cc0000, а если не была зажата то цвет рамки должен быть #333333. При повторном щелчке по тому же самому мотоциклу рамка должна исчезать. Я сделала в этой части довольно мало, ну практически ничего, так как рамки проблемные вышли - click в css им не подходит, focus им не нравится, а active просто работает иначе. Здесь также важно, чтобы зафиксированный на пункте li клик мог переходить на другой пункт, то есть, когда я нажимаю уже иной пункт li, рамка переходит на него, исчезая с предыдущего нажатого пункта. Здесь появляется недочет в виде того, что при повторном нажатии на пункт в таблице опять появится эта надпись, поэтому если есть возможность это исправить, то скажите, а если нет, то ничего страшного. И так можно оставить. С клавишами я пока что молчу - абсолютно не знакомая для меня тема. Возможно, слишком многое спрашиваю для новичка на форуме и может быть это не такие уж и сложные задачи, за что извиняюсь, но мне больше некуда нормально обратиться. Я а так не очень хорошо разбираюсь с html и css, JS для меня очень и очень слабо раскрыт, так что о jQuery даже страшно говорить. Как я уже говорила, для меня любые советы, критика, пояснения или поправки могут помочь. Надеюсь, успею получить что-нибудь в ближайшие дни. Заранее спасибо всем, кто заметил мою тему :thanks: :thanks: . П. С. И совсем забыла сказать -сайты не должны использовать никакие веб-ресурсы и ссылки, т. е. короче работать только между файлами. |
Безнадежный программист,
Пожалуйста, отформатируйте свой код! Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [html run] ... минимальный код страницы с вашей проблемой [/html] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Простите, попытаюсь.
|
Цитата:
|
Цитата:
А нет альтернативы похожей? Как у меня, например, но только + jQuery? Просто мне надо следовать хотя бы приближенно этим условиям, устарели они или нет. |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
https://www.google.com/search?client...UTF-8&oe=UTF-8 |
Безнадежный программист,
https://beautifier.io/ |
Цитата:
|
Цитата:
А что дальше, проблемы "как?" |
Цитата:
|
Цитата:
Если именно jQuery интересует, то примеров на нем в сети уйма, почему бы на них не учится, разбирая и анализируя? А вас в коде и JQ, и нативный JS. И по задаче добавляются строки в таблицу, но почему-то нет делегирования обработчика события. Вот может простые легкие примеры и помогут в обучении? |
Цитата:
Я вам рекомендую использовать текстовый редактор с подсветкой синтаксиса, чтобы вы видели хотя бы синтаксические ошибки. Например, Visual Studio Code — https://code.visualstudio.com/ Если у вас нет возможности установить, или вы не хотите ничего устанавливать, то вы можете использовать CodeSandBox — редактор, который работает без установки, вы пишете код и сразу видите результат — https://codesandbox.io/ Давайте начнём с того, что конструкции вида...
$(".colors").hover(function () {
if ($(this).css("background-color") != tr_clr)
$(this).css("background-color", "#1F233C")
}, function () {
if ($(this).css("background-color") != tr_clr)
$(this).css("background-color", "white")
});
могут быть заменены на соответствующий CSS, в конце концов вы именно CSS и меняете...
.colors {
background-color: white;
}
.colors:hover {
background-color: #1F233C;
}
Также ваш скрипт, который добавляет этот функционал, находится внутри обработчика события click, а это значит, что у вас при каждом нажатии добавляется всё больше и больше обработчиков событии mouseover и mouseout (именно так сделан hover в jQuery) на строчки таблицы. Притом у первых строк получается больше всего обработчиков, т. к. на только что добавленную строчку добавляется 1 обработчик и на каждую предыдущую добавленную строчку также добавляется по обработчику. Однако стоит учитывать, что у вас в коде определяются по два обработчика на строчку — один для цвета текста, а другой для цвета фона строчки, т. е. общее число удваивается. Для событии mouseover и mouseout — число ещё удваивается. Так что если 332 раза нажать на ваш список, то к 332-ум созданным строчкам добавится 2 * 2 * (1 + 2 + ... + 331 + 332) = 221112 обработчиков событии! ![]() Также анимация появления должна делаться на CSS эффективным способом при помощи @keyframes. Также вместо... var t = $(this)[0].innerText;можно написать... var t = this.innerText;Но jQuery-писатели без jQuery-обёрток уже не могут, поэтому напишут так... var t = $(this).text(); После очистки кода от мусора, вскрылись ваши истинные помыслы — вы хотите вставить нажатый текст из списка в таблицу...
jQuery("#moto_models li").click(function () {
var t = $(this).text();
$("#moto_table").append("<tr><td>" + t + "</td></tr>");
});
Также стоит учитывать, что элементы списка не фокусируемые, а следовательно доступность для нажатия ограничена. Вам стоит заменить текст на кнопки. Кнопки для того и существуют, чтобы на них нажимать! Насчёт отмены hover — зачем вам изобретать костыли, когда есть CSS, и именно его вы меняете через JS, что практически сложно затем отлаживать. Почему бы сразу не писать CSS? Цитата:
Вот некие исправления в коде, и только два обработчика событии...
<!DOCTYPE html>
<html>
<head>
<title> Практическая работа № 16 (1) </title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.0/jquery.min.js"></script>
<style>
ol li:nth-child(4) { color: blue; }
ol li button {
all: unset;
border: 4px solid transparent;
}
tr > th, tr > td {
background-color: white; color: black;
animation: 1s appear;
border: 1px solid #888;
padding: 1em;
transition: 300ms;
}
tr > th:hover, tr > td:hover {
background-color: #1F233C; color: white;
}
tr > td.highlight {
background: gold; color: black;
}
#moto_table {
animation: 1.5s appear;
border-collapse: collapse;
cursor: default;
}
@keyframes appear { from { opacity: 0; } }
.button {
border: 0; border-radius: 0.5em;
padding: 1em; margin: 1em;
background-color: #f1f1f5;
font: inherit;
}
.button:hover {
background-color: #32375d;
color: white;
}
</style>
</head>
<body>
<ol id="moto_models">
<li><button>Харлей Дэвидсон</button></li>
<li><button>Кроссовый мотоцикл</button></li>
<li><button>Гоночный мотоцикл</button></li>
<li><button>Концептуальный мотоцикл</button></li>
</ol>
<button class="button">Отправить заявку</button>
<table id="moto_table" class="color_table">
<tr><th>Таблица</th></tr>
</table>
<script>
var activeElement;
$("#moto_models").on("click", "button", function (event) {
$("#moto_table").append("<tr><td>" + $(this).text() + "</td></tr>");
if(this == activeElement) {
$(this).css("border-color", "transparent");
activeElement = null;
} else {
$(activeElement).css("border-color", "transparent");
$(this).css("border-color", event.shiftKey ? "#c00" : "#333");
activeElement = this;
}
});
$("#moto_table").on("click", "td", function() {
$(this).toggleClass("highlight");
});
</script>
</body>
</html>
Вызов $("#moto_models") вернёт вам не ссылку на элемент или список узлов DOM, а некий jQuery-объект. Это означает, что jQuery-объект содержит совершенно другие методы, чем обычная ссылка на элемент или список список узлов DOM. Тем не менее, эти ссылки всё время вылазят наружу в реальных проектах. Как бы jQuery не старался уйти от них, вам всё равно постоянно приходится оперировать ими, пусть даже просто оборачивая эти ссылки в $(). Как у вас было... var t = $(this)[0].innerText;Это не ваша проблема — это плохой дизайн. Так что же делать дальше? Не учите jQuery, учите современную web-разработку — список тем, которую нужно знать: https://andreasbm.github.io/web-skills/ |
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
Однако, благодарю вас за то, что подметили. Я, наверно, передам это замечание, если что. |
| Часовой пояс GMT +3, время: 04:54. |