Форум программистов, компьютерный форум, киберфорум
jQuery
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978

Неправильно определяется класс

24.09.2019, 14:54. Показов 1073. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот такая штука
Хочу по клику менять фон элемента.
HTML5
1
2
3
<span class='sel'> Солнце </span><br>
<span class='unsel'> Луна </span><br>
<span class='unsel'> Меркурий</span>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
$(document).ready(function() {
 $(".unsel").click( function() {
    alert('Unsel'+$(this).text());
    $(this).removeClass().addClass('sel');
 });
 $(".sel").click( function() {
    alert('Sel'+$(this).text());
    $(this).removeClass().addClass('unsel');
 });
 ...
});
CSS
1
2
3
4
5
6
.unsel {
 background-color: #ffffff;
}
.sel {
 background-color: #9999ff;
}
При первом клике на элементе цвет меняется. В инспекторе класс показывает правильно.
Но при следующем клике по тому же элементу вход происходит в обработчик того класса, который был изначально.
То есть если кликаю на "Солнце", alert говорит "Sel Солнце" в инспекторе становится class="unsel", цвет белый, все Ок.
Но при следующем клике alert опять говорит "Sel Солнце" и ничего не меняется.
То есть используется изначальное значение класса.
В чем может быть закавыка?
Все глаза просмотрел, ничего не понимаю. Вещь-то как бы простейшая...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.09.2019, 14:54
Ответы с готовыми решениями:

Неправильно определяется количество страниц paginate.parts size
В общем, сайт сбрендил, пишет что-то в стиле &quot;страница 22 из 7&quot;, не могу понять где косяк, почему он не может посчитать сколько страниц?...

HDD определяется в BIOS но не запускается и неправильно определяется объем диска
Всем доброго времени суток, прошу вас о помощи в борьбе с моим винтом от ноута. Попробую описать подробно, как все было. В один прекрасный...

Неправильно определяется флешка
Знакомый попросил посмотреть флешку, сказал что не открывается, а на ней какая-то ценная для него информация. При ее включении в диспетчере...

10
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
24.09.2019, 15:17
Байт, $(".unsel") получает элементы с классом unsel и навешивает обработчики. Нужно немного изменить логику, добавить како-йто общий класс.
HTML5
1
2
3
<span class='item sel'> Солнце </span><br>
<span class='item unsel'> Луна </span><br>
<span class='item unsel'> Меркурий</span>
JavaScript
1
2
3
4
5
$(document).ready(function() {
  $(".item").click( function() {
    // замена классов sel на unsel и наборот
   });
});
1
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
24.09.2019, 15:29
"Закавыка" в том, что обработчики событий назначаются на элементы существующие в документе в момент их (обработчиков) определения - в вашем примере смысл таков:
  • документ "готов"
    • найти элементы .unsel > по клику по этим элементам убрать классы, добавить класс .sel
    • найти элементы .sel > по клику по этим элементам убрать классы, добавить класс .unsel
Всё. Элемент "Солнце" всегда будет убирать класс .sel и добавлять .unsel. Аналогично с элементами "Луна" и "Меркурий". Скрипт завершен, всем обработчики назначены, больше никого искать в документе не будем.
Сразу находите нужные элементы и реализуйте логику в самом обработчике клика
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<style>
  .unsel {
    background-color: #ffffff;
  }
 
  .sel {
    background-color: #9999ff;
  }
 
</style>
<span class='sel'> Солнце </span><br>
<span class='unsel'> Луна </span><br>
<span class='unsel'> Меркурий</span>
<script src="https://unpkg.com/jquery"></script>
<script>
  $(document).ready(function() {
    $('span').click(function() {
      // $(this).toggleClass('sel unsel'); // too easy
 
      var $this = $(this);
      if ($this.is('.sel')) {
        $this.removeClass().addClass('unsel');
      } else {
        $this.removeClass().addClass('sel');
      }
    });
  });
 
</script>
2
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
24.09.2019, 15:29
Еще пишут, что так должно работать
JavaScript
1
2
3
4
5
6
// https://stackoverflow.com/questions/7002039/easiest-way-to-toggle-2-classes-in-jquery
$(document).ready(function() {
  $(".sel, .unsel").click(function() {
    $(this).toggleClass("sel unsel");
   });
});
но по-моему это менее понятный вариант
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
24.09.2019, 16:26  [ТС]
Цитата Сообщение от shvyrevvg Посмотреть сообщение
так должно работать
Спасибо! Так заработало.
Да, мне еще учиться и учиться...

Добавлено через 23 минуты
Цитата Сообщение от shvyrevvg Посмотреть сообщение
$(".item").click( function() {
* * // замена классов sel на unsel и наборот
* *});
Так тоже заработало

Добавлено через 5 минут
Цитата Сообщение от j2FunOnly Посмотреть сообщение
Всё. Элемент "Солнце" всегда будет убирать класс .sel и добавлять .unsel. . Скрипт завершен, всем обработчики назначены, больше никого искать в документе не будем.
Вот этого чегой-то никак понять не могу...
Мы же класс у "Солнца" заменили на unsel
Впрочем, работает - и слава Богу!
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
24.09.2019, 16:34
Цитата Сообщение от Байт Посмотреть сообщение
Вот этого чегой-то никак понять не могу...
Мы же класс у "Солнца" заменили на unsel
Цитата Сообщение от Байт Посмотреть сообщение
А в момент обработки $("div") внутренних дивов еще просто не существовало!
Из той же оперы.

Класс заменили, но в момент, когда вы вешали обработчик клика на элементы документа, этот элемент не входил в набор с классом unsel
Цитата Сообщение от j2FunOnly Посмотреть сообщение
Всё. Элемент "Солнце" всегда будет убирать класс .sel и добавлять .unsel.
Точнее Элемент "Солнце" всегда будет убирать все классы и добавлять .unsel
Да, можно делегировать, но зачем?
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<style>
  .unsel {
    background-color: #ffffff;
  }
 
  .sel {
    background-color: #9999ff;
  }
 
</style>
<span class='sel'> Солнце </span><br>
<span class='unsel'> Луна </span><br>
<span class='unsel'> Меркурий</span>
<script src="https://unpkg.com/jquery"></script>
<script>
  $(document).ready(function() {
    $(document).on('click', '.unsel', function() {
      alert('Unsel' + $(this).text());
      $(this).removeClass().addClass('sel');
    });
    $(document).on('click', '.sel', function() {
      alert('Sel' + $(this).text());
      $(this).removeClass().addClass('unsel');
    });
 
  });
 
</script>
1
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
24.09.2019, 17:45
Байт, может, в императивном стиле будет наглядней
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
let elements = [
  { text: "Солнеце", className: "sel", onclick: null },
  { text: "Луна", className: "unsel", onclick: null },
  { text: "Меркурий", className: "unsel", onclick: null }
];
 
// $('.sel')
let selElements = [];
for (let i = 0; i < elements.length; i++) {
  if (elements[i].className == "sel") {
    selElements.push(elements[i]);
  }
}
// .click(function(){...})
for (let i = 0; i < selElements.length; i++) {
  selElements[i].onclick = function() {
    selElements[i].className = "unsel";
    console.log('Sel', selElements[i]);
  };
}
 
// $('.unsel')
let  unselElements = [];
for (let i = 0; i < elements.length; i++) {
  if (elements[i].className == "unsel") {
    unselElements.push(elements[i]);
  }
}
// .click(function(){...})
for (let i = 0; i < unselElements.length; i++) {
  unselElements[i].onclick = function() {
    unselElements[i].className = "sel";
    console.log('Unsel', unselElements[i]);
  };
}
 
elements[1].onclick(); // кликаем по Луне
elements[1].onclick(); // кликаем по Луне
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
24.09.2019, 22:27  [ТС]
Цитата Сообщение от j2FunOnly Посмотреть сообщение
Всё.
Вот не могу понять, чем мое "наивное" изменение классов отличается от того, что делает toggleClass. Проще всего, конечно, посмотреть исходники JQuery, и я посмотрел, но в силу своей "зелености" совершенно ничего не понял. То есть toggleClass заставляет перестроить таблицы, включить в одну "Солнце" и выключить из другой? Или как?
То есть в моей дурной голове выстраивается такая логика.
По "документ готов" к функции $('.sel').click составляется список (массив, коллекцию, таблицу) элементов ДОМа, к которым эта функция будет применяться. И изменения, происходящие в ДОМе, в этой таблице не отражаются. Так? А как же тогда заставить их отражаться? Как это делает toggleClass?
В общем, мне очень интересны механизмы. Не "сделай так, и все будет хорошо", а что и когда происходит на уровне данных. Внутренняя логика языка. И пока я ее не пойму, я буду барахтаться, как это самое в проруби.
Вот тут Годная книга за JavaScript есть мой писк. И хотелось увидеть именно механизмы. Данные. Без излишней детализации. Как это реализуется, последовательно или кэшем - дело для понимания десятое.
0
1786 / 1036 / 445
Регистрация: 12.05.2016
Сообщений: 2,550
25.09.2019, 02:18
Цитата Сообщение от Байт Посмотреть сообщение
По "документ готов" к функции $('.sel').click составляется список (массив, коллекцию, таблицу) элементов ДОМа, к которым эта функция будет применяться. И изменения, происходящие в ДОМе, в этой таблице не отражаются. Так?
Так
Цитата Сообщение от Байт Посмотреть сообщение
А как же тогда заставить их отражаться?
Выбрать все элементы и с классом sel и с unsel
Цитата Сообщение от Байт Посмотреть сообщение
Как это делает toggleClass?
Это делает не toggleClass. Следующая запись
JavaScript
1
2
3
$(".sel, .unsel").click(function() {
    $(this).toggleClass("sel unsel");
});
эквивалент
JavaScript
1
2
3
4
5
6
$(".sel").click(function() {
    $(this).toggleClass("sel unsel");
});
$(".unsel").click(function() {
    $(this).toggleClass("sel unsel");
});
а toggleClass только переключает классы между собой. Если бы Вы написали в своем коде переключение, а не удаление-добавление класса, то Все бы заработало!
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
25.09.2019, 10:28  [ТС]
Цитата Сообщение от shvyrevvg Посмотреть сообщение
эквивалент
Понял. Спасибо
А остальное таки нет. Туповат стал, увы
Ладно, может быть само как-то уложится....
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
08.10.2019, 11:51  [ТС]
Однако удалось разобраться и понять. Дело в том, что привязка события к элементу - статическая. Привязалась - все - привязана. Никакие последующие изменения в этом элементе эту привязку не отменяют и новых не создают.
Ура!
Всем, принявшим участие в обсуждении - большое спасибо!

Добавлено через 4 минуты
Сейчас перечитал топик, да мне же об этом несколько раз говорили! А у меня в башке совсем друга парадигма сидела, другой механизм. Думалось, что должны отслеживаться все изменения. Ясен пень, что это слишком дорого было бы.
Еще раз прошу прощения за свою глупость...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.10.2019, 11:51
Помогаю со студенческими работами здесь

Процессор неправильно определяется
недавно собрал пк на процессоре g4500, и через несколько дней заметил что в программе speccy он определяеться как i5-6600k. может ктото...

Неправильно определяется кодировка
здравствуйте. есть php-скрипт, берущий первую строку из загруженного на сайт файла. путём отладки я выяснил, что при извлечении...

Неправильно определяется радиус окружности
Помогите пожалуйста,не могу понять в чем ошибка. У круга радиус должен быть по идее 10, но на картинке это не так Private Sub...

Неправильно определяется get_global_id на OpenCL?
Итак, использую OpenCL. Прежде чем что-то написать надо понять, как определяются координаты Work-item, для этого я решил использовать 2d...

Неправильно определяется разрешение экрана
Определяю разрешение экрана с помощью Screen.Width Screen.Height Delphi определяет как 1475x829 хотя у меня разрешение 1920x1080. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru