Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.10.2019, 22:06
Интересующийся
Отправить личное сообщение для Байт Посмотреть профиль Найти все сообщения от Байт
 
Регистрация: 06.10.2019
Сообщений: 14

Смена класса
Вот такая простенькая страничка (выжимка проблемы)
Идея - по клику мышки выделять или снимать выделение
Код:
<style type="text/css">
.unsel {
 background-color: #ffffff;
 cursor: pointer;
}
.sel {
 background-color: #9999ff;
 cursor: pointer;
}
</style>

<script>

$(document).ready(function() {
 /*
 $(".It").click( function() {  // (1) Так работает
      if ($(this).is('.sel'))
        $(this).removeClass('sel').addClass('unsel');
      else
        $(this).removeClass('unsel').addClass('sel');
 });
 */
 $(".sel").click( function() {  // (2) Так валяет дурака
        alert("sel");
        $(this).removeClass('sel').addClass('unsel');
 });
 $(".unsel").click( function() {
        alert("unsel");
        $(this).removeClass('unsel').addClass('sel');
 });
});
</script>
</head>

<body>
<span class='sel It'> Солнце </span><br>
<span class='unsel It'> Луна </span><br>
<span class='unsel It'> Меркурий</span><br>

</body> </html>
В варианте (1) все прекрасно работает.
Но почему не работает в варианте (2)??? Точнее, работает - однократно.
Клик на Солнце снимает выделение. И инспектор показывает, что класс стал unsel. Но повторный клик - и элемент ведет себя как sel. Это и alert подтверждает. Аналогично ведут себя и другие элементы.
В чем может быть дело? Чего я очень глубоко не понимаю?
ЗЫ. Есть еще вариант с toggleClass. Тоже работает на ура!
Но вопрос - чего же я не понимаю? продолжает мучить...
Ответить с цитированием
  #2 (permalink)  
Старый 07.10.2019, 22:15
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Дурака никто не валяет, ибо после удаления класса не почему уже щелкать.

Последний раз редактировалось laimas, 07.10.2019 в 22:25.
Ответить с цитированием
  #3 (permalink)  
Старый 07.10.2019, 22:40
Интересующийся
Отправить личное сообщение для Байт Посмотреть профиль Найти все сообщения от Байт
 
Регистрация: 06.10.2019
Сообщений: 14

Не понял. Я же добавил другой класс... Был sel. Стал unsel. На него есть реакция $(".unsel").click... В инспекторе показывает...
И почти идентичный код в варианте (1) прекрасно работает!
Может быть глаз замылился? Чего-то простейшего не вижу?
Ответить с цитированием
  #4 (permalink)  
Старый 07.10.2019, 22:42
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Байт
почему не работает в варианте (2)??? Точнее, работает - однократно.
Потому, что обработчик установлен по классу ".sel", а в нем сразу же $(this).removeClass('sel'). Вопрос - по чему щелкать дальше будем?
Ответить с цитированием
  #5 (permalink)  
Старый 07.10.2019, 22:49
Интересующийся
Отправить личное сообщение для Байт Посмотреть профиль Найти все сообщения от Байт
 
Регистрация: 06.10.2019
Сообщений: 14

laimas, Но я же тут же делаю addClass('unsel'). И совершенно тоже самое делаю в рабочем варианте (1)
Ответить с цитированием
  #6 (permalink)  
Старый 07.10.2019, 22:52
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Байт
Но я же тут же делаю addClass('unsel')
И что? С таким классом следующие две кнопки, вот для них третий обработчик и определен.

PS. Если хочется "не терять или переопределять", то нужно делегировать обработку.

Последний раз редактировалось laimas, 07.10.2019 в 22:54.
Ответить с цитированием
  #7 (permalink)  
Старый 07.10.2019, 23:05
Интересующийся
Отправить личное сообщение для Байт Посмотреть профиль Найти все сообщения от Байт
 
Регистрация: 06.10.2019
Сообщений: 14

laimas, понимаете, мне действительно очень хочется в этом деле разобраться. Чтобы не ходить по JS, как по минному полю. Хотя для конкретного проекта все более-менее сложилось, но мне же дальше надо жить... И что меня там ждет, какие засады и западни?
То есть - понять механизмы. Вот я делаю alert. Научился смотреть инспектор (пока слабо этим смотрением владею). Что еще можно предпринять? Может быть какая-то литература есть, где рассказывается не Что, а Как? Так сказать, изнутри.
В Вебе я - зеленый новичок. Но вообще-то в программировании кой-какой опыт есть
Ответить с цитированием
  #8 (permalink)  
Старый 07.10.2019, 23:10
Интересующийся
Отправить личное сообщение для Байт Посмотреть профиль Найти все сообщения от Байт
 
Регистрация: 06.10.2019
Сообщений: 14

laimas, Ничего таки не понимаю, да и башка уже не варит, но буду думать над вашими словами...
Ответить с цитированием
  #9 (permalink)  
Старый 08.10.2019, 00:05
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Байт,
$(".sel") это элемент/ы на момент загрузки страницы, jquery не телепат, она не следит в этом случае, какие элементы ещё возникнут с этим классом sel в дальнейшем.
если вам нужно отследить клики на любых элементах с данным классом, тогда обработчик события ставят на родителя( делегирование) , пример ниже, и в родителе проверяют класс элемента который был нажат.
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
.unsel {
 background-color: #ffffff;
 cursor: pointer;
}
.sel {
 background-color: #9999ff;
 cursor: pointer;
}
</style>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script>
$(function() {
   $("body").on("click", ".unsel, .sel", function() {
   $(this).toggleClass('unsel sel');
})
});
  </script>
</head>

<body>
<span class='sel It'> Солнце </span><br>
<span class='unsel It'> Луна </span><br>
<span class='unsel It'> Меркурий</span><br>


</body>
</html>
Ответить с цитированием
  #10 (permalink)  
Старый 08.10.2019, 00:10
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Байт
Ничего таки не понимаю
А чего тут не понятного. В комнате живут один Ваня и два Пети. Звонок, пришел курьер с доставкой: Ване квас, Петям пиво, вручил и ушел. Петям приколько, Ване обидно. А давай Ваня и ты будешь Петей - решили друзья. Появится ли после этого у Вани пиво, если курьер уже ушел?

Тоже самое и с кнопками - трем кнопкам: А и две В, по их именам установили обработчик во время Т1. Получит ли после кнопка А обработчик кнопок В если сменит имя на В во время Т2?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматическая смена активного класса по таймеру MiHALbI4 Общие вопросы Javascript 4 08.04.2019 18:21
Смена класса при скроллинге Dayros Общие вопросы Javascript 17 24.01.2017 20:32
Смена класса с запоминание joker95 Элементы интерфейса 1 11.04.2016 12:00
смена класса div Gwin Библиотеки/Тулкиты/Фреймворки 5 11.04.2013 16:13
Использование классов в JavaScript devote Ваши сайты и скрипты 70 01.02.2013 17:17