Здравствуйте, коллеги! Можете ли вы помочь мне разобраться с использованием ключевого слова `this` в JavaScript? В данный момент, моя функция, отвечающая за раскрытие фильтров по щелчку на категории, срабатывает только после двойного щелчка по элементу. Как я могу это исправить? В частности, вот HTML код элемента, который я использую: <br/> <br/> Код HTML <br/> <pre><code class="html"><div class="block">
<div onclick="ShowDataFilter()" class="widget-title cus-category">Цвет<i class="cus-fa fa fa-angle-double-right" aria-hidden="true"></i></div>
<ul class="cus-slide c-ip-attribute-filter__list" style="display: none">
<div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_0" id="name_0" value="1"> <label for="name_0" class="custom-control-label cus-fw-adminLte-override">Черный (2129)</label></div>
<div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_1" id="name_1" value="1"> <label for="name_1" class="custom-control-label cus-fw-adminLte-override">Синий (910)</label></div>
<div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_2" id="name_2" value="1"> <label for="name_2" class="custom-control-label cus-fw-adminLte-override">Фиолетовый (185)</label></div>
<div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_3" id="name_3" value="1"> <label for="name_3" class="custom-control-label cus-fw-adminLte-override">Серый (696)</label></div>
<div class="custom-checkbox">
Здравствуйте!
Давайте разберем проблемы с использованием `this` в вашем коде и попробуем понять, почему ваша функция `ShowDataFilter()` работает только на двойной щелчок.
### 1. Проблема с `this` и назначением обработчика события
В вашем коде у вас есть HTML элемент:
```html
<div onclick="ShowDataFilter()" class="widget-title cus-category">Цвет</div>
```
При таком назначении обработчика события `onclick` контекст `this` внутри функции `ShowDataFilter()` будет ссылаться на объект `window`, а не на сам элемент, на который вы кликнули.
### 2. Перепишите обработчик с использованием jQuery
Лучше всего назначить обработчик события с помощью jQuery, чтобы вы могли правильно использовать контекст `this`. Вот пример, как это можно сделать:
```html
<div class="block">
<div class="widget-title cus-category">Цвет<i class="cus-fa fa fa-angle-double-right" aria-hidden="true"></i></div>
<ul class="cus-slide c-ip-attribute-filter__list" style="display: none">
<!-- ваш список -->
</ul>
</div>
```
И сам JavaScript код:
```javascript
$(document).ready(function() {
$('.widget-title').click(function() {
// Здесь 'this' ссылается на элемент div, который был нажат.
var $filterList = $(this).siblings('.cus-slide');
$filterList.toggle(); // показывает/скрывает список
});
});
```
### 3. Пояснение
- Когда вы используете `$(this)`, это ссылается на элемент, на который вы кликнули — в данном случае, на `div` с классом `widget-title`.
- Метод `siblings()` получает все соседние элементы, которые отвечают селектору `'.cus-slide'`, таким образом, вы работаете непосредственно с элементом списка, относящимся к кликнутому заголовку.
- Метод `toggle()` переключает состояние видимости (`display: none` / `display: block`) для выбранного списка.
### Заключение
С помощью изменения назначения события и правильного использования `this` в jQuery, ваша функция будет корректно срабатывать при одном клике, и вы сможете избежать проблемы с двойным щелчком. Если у вас возникнут дополнительные вопросы, не стесняйтесь спрашивать!
Странное использование onclick атрибута и события on, нужно что-то одно. Если с атрибутом onclick, то будет так:
<div class="block"> <div onclick="ShowDataFilter(this)" class="widget-title cus-category">Цвет<i class="cus-fa fa fa-angle-double-right" aria-hidden="true"></i></div> <ul class="cus-slide c-ip-attribute-filter__list" style="display: none"> <div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_0" id="name_0" value="1"> <label for="name_0" class="custom-control-label cus-fw-adminLte-override">Черный (2129)</label></div> <div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_1" id="name_1" value="1"> <label for="name_1" class="custom-control-label cus-fw-adminLte-override">Синий (910)</label></div> <div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_2" id="name_2" value="1"> <label for="name_2" class="custom-control-label cus-fw-adminLte-override">Фиолетовый (185)</label></div> <div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_3" id="name_3" value="1"> <label for="name_3" class="custom-control-label cus-fw-adminLte-override">Серый (696)</label></div> <div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_4" id="name_4" value="1"> <label for="name_4" class="custom-control-label cus-fw-adminLte-override">Бордовый (168)</label></div> </ul> </div> <div class="block"> <div onclick="ShowDataFilter(this)" class="widget-title cus-category">Тип<i class="cus-fa fa fa-angle-double-right" aria-hidden="true"></i></div> <ul class="cus-slide c-ip-attribute-filter__list" style="display: none"> <div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_0" id="name_0" value="1"> <label for="name_0" class="custom-control-label cus-fw-adminLte-override">Ободковая (6227)</label></div> <div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_1" id="name_1" value="1"> <label for="name_1" class="custom-control-label cus-fw-adminLte-override">Лесочная (381)</label></div> <div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_2" id="name_2" value="1"> <label for="name_2" class="custom-control-label cus-fw-adminLte-override">Безободковая (420)</label></div> <div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_3" id="name_3" value="1"> <label for="name_3" class="custom-control-label cus-fw-adminLte-override">полуободковые (124)</label></div> <div class="custom-checkbox"> <input class="custom-control-input" type="checkbox" name="brand_4" id="name_4" value="1"> <label for="name_4" class="custom-control-label cus-fw-adminLte-override">маска (2)</label></div> </ul> </div>
function ShowDataFilter(cusCategory) { $(cusCategory).toggleClass('red').siblings('.cus-slide').slideToggle(0); }