Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Решение задач по JQuery, JS, HTML и CSS (https://javascript.ru/forum/misc/80152-reshenie-zadach-po-jquery-js-html-i-css.html)

Безнадежный программист 03.05.2020 10:15

Решение задач по 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: .

П. С. И совсем забыла сказать -сайты не должны использовать никакие веб-ресурсы и ссылки, т. е. короче работать только между файлами.

рони 03.05.2020 10:18

Безнадежный программист,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

Безнадежный программист 03.05.2020 10:19

Простите, попытаюсь.

рони 03.05.2020 10:22

Цитата:

Сообщение от Безнадежный программист
С помощью toggle() сделайте так, чтобы при первом щелчке строка таблицы подсвечивалась, а при повторном принимала обычное положение

выкиньте ваш задачник, так toggle в jQuery не работает уже лет 10.

Безнадежный программист 03.05.2020 10:33

Цитата:

Сообщение от рони (Сообщение 523756)
выкиньте ваш задачник, так toggle в jQuery не работает уже лет 10.

Я исправила. Надеюсь, так лучше будет.
А нет альтернативы похожей? Как у меня, например, но только + jQuery? Просто мне надо следовать хотя бы приближенно этим условиям, устарели они или нет.

рони 03.05.2020 10:51

Цитата:

Сообщение от Безнадежный программист
Надеюсь, так лучше будет.

:yes:

рони 03.05.2020 10:54

Цитата:

Сообщение от Безнадежный программист
А нет альтернативы похожей?

mytoggle

Безнадежный программист 04.05.2020 04:43

Цитата:

Сообщение от Rise (Сообщение 523772)
Безнадежный программист, что с отступами?

Не могу осуществить отступы, простите. У меня нет для этого специальной программы, а вручную, думаю, сами знаете, как долго. Это как-то нарушает работу кода?

laimas 04.05.2020 06:56

Цитата:

Сообщение от Безнадежный программист
У меня нет для этого специальной программы

Достаточно простого

https://www.google.com/search?client...UTF-8&oe=UTF-8

рони 04.05.2020 07:30

Безнадежный программист,
https://beautifier.io/

Безнадежный программист 04.05.2020 18:04

Цитата:

Сообщение от laimas (Сообщение 523776)
Достаточно простого

https://www.google.com/search?client...UTF-8&oe=UTF-8

Хорошо, я попыталась исправить и это, спасибо, но что дальше?

laimas 04.05.2020 18:21

Цитата:

Сообщение от Безнадежный программист
но что дальше?

Учится, учится и еще раз учится! :)

А что дальше, проблемы "как?"

Безнадежный программист 04.05.2020 18:36

Цитата:

Сообщение от laimas (Сообщение 523795)
Учится, учится и еще раз учится! :)

А что дальше, проблемы "как?"

Я понимаю, что смешно спрашивать помощь в чем-то, что вы считаете очевидным и возможным для изучения, но я не нахожу нужной мне информации для решения этих задач, и никто меня нормально, к сожалению, не научил работать с jQuery. Знаю, что это здесь говорить здесь не к чему, но мне просто уже некуда податься с этими проблемами. Я надеялась на какие-то еще наводки, но хотя бы и за эти советы вам спасибо, полагаю.

laimas 04.05.2020 18:53

Цитата:

Сообщение от Безнадежный программист
Я понимаю, что смешно спрашивать помощь в чем-то

В этом нет ничего смешного, для этого и форум. Это я как "шутку" написал ибо не понимаю смыла вопроса "что дальше?".

Если именно jQuery интересует, то примеров на нем в сети уйма, почему бы на них не учится, разбирая и анализируя?

А вас в коде и JQ, и нативный JS. И по задаче добавляются строки в таблицу, но почему-то нет делегирования обработчика события. Вот может простые легкие примеры и помогут в обучении?

Malleys 04.05.2020 22:57

Цитата:

Сообщение от Безнадежный программист
Хорошо, я попыталась исправить и это, спасибо, но что дальше?

Совершенно правильный вопрос! Вы написали пару сотен тысяч обработчиков событии для решения трёх проблем, а код совершенно запутанный и непонятный! В такой запутанности нет ничего необычного — jQuery не предназначен для работы с состоянием, в вашем примере можно сделать «одну хитрость» — для jQuery оставить простенькие задачи типа переключить имя класса у элемента или добавить строчку в таблицу, а анимацию элементов делать на CSS. Такой подход отодвигает проблемы до тех пор пока вы опять не начнёте управлять состоянием.

Я вам рекомендую использовать текстовый редактор с подсветкой синтаксиса, чтобы вы видели хотя бы синтаксические ошибки. Например, 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?

Цитата:

Сообщение от Безнадежный программист
JS для меня очень и очень слабо раскрыт, так что о jQuery даже страшно говорить.

jQuery заставляет писать сложный, запутанный код... Вы сами убедились в этом, когда попытались написать простенькое переключение вспышки или возвратить исходное состояние кнопки... В поисковой системе можно найти сотни статей «Вам не нужен jQuery», если только вы не китайский коммунист, который любит решать простые проблемы чрезвычайно сложными и не очевидным образом.

Вот некие исправления в коде, и только два обработчика событии...
<!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/

Безнадежный программист 05.05.2020 19:04

Цитата:

Сообщение от Malleys (Сообщение 523801)
в вашем примере можно сделать «одну хитрость» — для jQuery оставить простенькие задачи типа переключить имя класса у элемента или добавить строчку в таблицу, а анимацию элементов делать на CSS. Такой подход отодвигает проблемы до тех пор пока вы опять не начнёте управлять состоянием.

Я очень благодарна, что вы мне ответили, спасибо большое! Проблема в том, что когда я уточняла условия, то вкратце мне сказали, что я должна работать больше всего именно в файле JS и вместе с jQuery, поэтому css можно использовать только тогда, когда это никак не противоречит условиям задания. То есть я понимаю, что использовать css гораздо более эффективней, проще и яснее, но от меня хотят не этого вообще.

Цитата:

Сообщение от Malleys (Сообщение 523801)
Я вам рекомендую использовать текстовый редактор с подсветкой синтаксиса, чтобы вы видели хотя бы синтаксические ошибки.

Да, я пару дней назад смогла разобраться с тем, какой редактор использовать. Все же запомню вашу рекомендацию на всякий случай, благодарю.

Цитата:

Сообщение от Malleys (Сообщение 523801)
Так что же делать дальше? Не учите jQuery, учите современную web-разработку — список тем, которую нужно знать: https://andreasbm.github.io/web-skills/

Я бы с радостью уже про него забыла, если честно.

Безнадежный программист 05.05.2020 19:09

Цитата:

Сообщение от Rise (Сообщение 523830)
Кстати, если внимательно посмотреть условия задач, то в 1.2 не требуется события отведения, потому что, когда требуется, это явно указывается, как в 2.1. А в задаче 3 вообще не понятно о каком блоке идет речь, список или таблица, 4 мотоцикла могут быть в обоих, гугл говорит, что это изображения, видимо задачи у вас не полные или вы как-то вольно трактуете.

Такое вполне возможно, я тоже это заметила во время поисков, но мне сказали, что если этого нет, значит этого и нет.

Цитата:

Сообщение от Rise (Сообщение 523830)
Вольно трактовать прекрасно, но новичка это может только запутать, обычно задания составляются так, чтобы научить определенному приему, что на первый взгляд не очевидно, например, 1.2 учит вешать событие на динамические элементы - делегирование. Поэтому, если должны быть изображения, надо с ними и работать, иначе может произойти наложение событий, стилей, из предыдущих последовательных заданий, результат может стать не предсказуем.

Это не моя трактовка. Это то, что дали делать. Я все, кроме некоторых прочих моментов и уточнений в теме, передала так же, как и там написано.
Однако, благодарю вас за то, что подметили. Я, наверно, передам это замечание, если что.


Часовой пояс GMT +3, время: 22:16.