Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как сделать onFocus, если объектов несколько? (https://javascript.ru/forum/misc/80114-kak-sdelat-onfocus-esli-obektov-neskolko.html)

nastya97core 29.04.2020 01:46

Как сделать onFocus, если объектов несколько?
 
Здравствуйте. Есть вот такое на jquery
$(".form-input").focus(function() {
  $(this).siblings('label').addClass('active');
});
$(".form-input").focusout(function() {
  if ($(this).val() != false) {
    $(this).siblings('label').addClass('active');
  } else {
    $(this).siblings('label').removeClass('active');
  }
});

Оно работает, как часы, но мне надо на чистом JavaScript. Я написала это, но оно работает только с первым элементом. Form-input у меня несколько.
function q(e){return document.querySelector(e);}
q(".form-input").onfocus = function() {
	this.nextElementSibling.classList.add("active");
};

q(".form-input").onblur = function() {
	if (this.value != false) {
		this.nextElementSibling.classList.add("active");
	} else {
		this.nextElementSibling.classList.remove("active");
	}
};


подскажите, как сделать, чтобы класс добавлялся ко всем нажимаемым элементам

voraa 29.04.2020 07:53

document.querySelectorAll(".form-input").forEach(
	el => { el.onfocus = function() {
					this.nextElementSibling.classList.add("active");
				};
				
			el.onblur = function() {
				if (this.value != false) {
					this.nextElementSibling.classList.add("active");
				} else {
					this.nextElementSibling.classList.remove("active");
				}
			}

		}
);

laimas 29.04.2020 08:05

voraa, а если 7-11 заменить на classList.toggle ?

voraa 29.04.2020 08:22

Цитата:

Сообщение от laimas (Сообщение 523545)
voraa, а если 7-11 заменить на classList.toggle ?

И что в этом хорошего?
Там же добавление/удаление класса у следующего элемента идет не в зависимости от его наличия, а в зависимости от значения текущего элемента.

рони 29.04.2020 09:06

Цитата:

Сообщение от voraa
И что в этом хорошего?

наличие параметра Boolean

laimas 29.04.2020 10:04

Цитата:

Сообщение от voraa
Там же добавление/удаление класса у следующего элемента идет

Так 7-11, это как раз и есть "механизм" toggle :)

voraa 29.04.2020 12:17

Цитата:

Сообщение от laimas (Сообщение 523555)
Так 7-11, это как раз и есть "механизм" toggle :)

Забыл про эту возможность, т.к. никогда ей не пользовался (и не буду)
По мне toggle должна делать toggle, а для add и remove есть другие функции.
Так код понятнее

laimas 29.04.2020 12:21

Цитата:

Сообщение от voraa
Так код понятнее

А что непонятного в случае toggle, если знать ее возможности? Это как ну его нафик for, я буду так:

a += b + c
a += b + c
a += b + c
....

сколько нужно, это понятнее. :)

voraa 29.04.2020 12:48

Есть функция функция appendChild(node), а чего бы ей не прикрутили еще один параметр, что бы она могла удалять элемент?
а.appendChild(b) - добавляет элемент
а.appendChild(b, false) - удаляет элемент
Удобно же.

laimas 29.04.2020 12:55

Удобно, только имя функции в данном случае иное было бы как минимум.

Не всегда используют тернарный оператор тоже ссылаясь на "непонятки". А чего в нем непонятного, все просто и лаконично.

Это уже привередливость, а не доводы. А если не хочется и ладно, но ведь и борщ не обязательно любят все, но это не значит, что он как блюдо не имеет право на существование. :)

voraa 29.04.2020 13:19

Цитата:

Сообщение от laimas
Удобно, только имя функции в данном случае иное было бы как минимум.

Правильно.
Есть как бы три действия. add, remove, toggle.
Если с помощью последнего можно делать все, то какой смысл в существовании первых двух?

Цитата:

Сообщение от laimas
А если не хочется и ладно, но ведь и борщ не обязательно любят все, но это не значит, что он как блюдо не имеет право на существование.

Совершенно согласен.
Много чего есть, но это не значит, что этим надо пользоваться.
Я тут недавно разбирал и переделывал старый код на паскале. Я ошалел от with. Кому то это было удобно.
А with вроде еще и javascript остался. Правда не помню, что бы им кто то пользовался. Неужели кому то этот оператор неудобен и непонятен :)

nastya97core 02.05.2020 12:58

подскажите, а как узнать через this, на какой по счёту элемент нажал человек?

qs(".form-input").forEach(el => { 
el.onclick = function(){
console.log(this.........);
}
});

рони 02.05.2020 13:17

nastya97core,
qs(".form-input").forEach((el, i)=> { 
el.onclick = function(){
console.log(i);
}
});

Malleys 02.05.2020 15:58

Цитата:

Сообщение от voraa
Есть функция функция appendChild(node), а чего бы ей не прикрутили еще один параметр, что бы она могла удалять элемент?
а.appendChild(b) - добавляет элемент
а.appendChild(b, false) - удаляет элемент

Почему метод, который называется «вставить ребёнка», должен удалять ребёнка? Для этого есть «убрать ребёнка» — removeChild. А вот если говорить про вставку/извлечение ребёнка одним методом, то как раз подошёл бы метод toggleChild, который мог бы в качестве второго параметра принимать булево значение, чтобы определить, так всё-таки вставить или извлечь ребёнка, что было бы полезно при реализации всяких переключателей.

Цитата:

Сообщение от laimas
а если 7-11 заменить на classList.toggle ?

Там можно только один toggle во всём примере!

Цитата:

Сообщение от voraa
И что в этом хорошего?

Т. е. у тебя везде по две кнопки — чтобы включить компьютер ты нажимаешь на одну кнопку, а чтобы выключить на другую? А у дверного звонка тоже две кнопки? Одна включает звонок, а другая выключает? Унитаз с двумя кнопками?

Цитата:

Сообщение от laimas
Это уже привередливость, а не доводы. А если не хочется и ладно, но ведь и борщ не обязательно любят все

Так нет же, очевидно, что посимвольная оплата! Это у него такие хитрые планы по зарабатыванию. А на toggle разве много заработаешь?

Цитата:

Сообщение от voraa
Много чего есть, но это не значит, что этим надо пользоваться.

Цитата:

Сообщение от voraa
старый код на паскале

Если ты откроешь секту программистов, то у тебя будут толпа преданных поклонников, которые будут разбирать твою старую писанину и прославлять твоё имя, платить 25% за твои откровения.

Цитата:

Сообщение от voraa
Если с помощью последнего можно делать все, то какой смысл в существовании первых двух?

Если нужно именно добавить, а не переключить. Если нужно только удалить, а не переключать. Всё-таки классы и элементы это тебе не унитаз!

рони 02.05.2020 18:37

:write:
<!doctype html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
.form-input:focus+label, .form-input.active+label{
     color: #FF00FF;
}
.form-input+label {
     color: #FFFFFF;
}
</style>
<script>
  addEventListener("blur", ({target}) => {
         if(target.closest && target.closest(".form-input"))  target.classList.toggle("active", !!target.value.trim())
  }, true)
</script>
</head>
<body>
<input type="text" class="form-input">
<label for="">выбрано</label>
<input type="text" class="form-input">
<label for="">выбрано</label>
<input type="text" class="form-input">
<label for="">выбрано</label>
<input type="text" class="form-input">
<label for="">выбрано</label>
<input type="text" class="form-input">
<label for="">выбрано</label>
</body>
</html>

laimas 03.05.2020 09:12

рони,
trim бы тоже не помешал. )

рони 03.05.2020 09:30

laimas,
ок. добавил trim()

laimas 03.05.2020 09:48

И достаточно просто target.value.trim(), ибо возврат "пусто" тоже самое что false, иначе true.


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