Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.12.2018, 12:50
Интересующийся
Отправить личное сообщение для AndriiS Посмотреть профиль Найти все сообщения от AndriiS
 
Регистрация: 05.09.2018
Сообщений: 28

Помогите правильно перехватить событие
Здравствуйте, коллеги! :-)

Помогите пожалуйста с перехватом события там где нужно.

Есть карточки. Нужно навел на карточку курсор (mouseover), - появилась тень, убрал курсор, - пропала тень.

1. Я реализовал путем навешивания двух addEventListener на один элемент двух функций. Можно ли попроще?

2. Внутри карточки есть ребенок <p>, - при наведении точно на него, событие не происходит. Как сделать так, чтобы addEventListener навесить на родителя <ul> и отлавливать события только на карточках <li>, игнорируя внутренние <p>?

Спасибо!

<nav class="main__menu">
                <ul class="main__menu__list">
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">I am</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">I have</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">I know</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">I want</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">I dream</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">Lorem</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">Lorem</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">Lorem</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">Lorem</p>
                    </li>
             
                </ul>
            </nav>


.main__menu__list {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-evenly;
}

.main__menu__list__item {
    width: 100px;
    height: 100px;
    list-style-type: none;
    font-weight: bolder;
    font-family: Tahoma;
    border-radius: 20px;
    -webkit-border-radius: 20px;
    -moz-border-radius: 20px;
    -ms-border-radius: 20px;
    -o-border-radius: 20px;
    background-color: #69B8E7;
    text-transform: uppercase;
    color: white;
    font-size: 1em;
    text-shadow: 2px 2px blue;
    display: flex;
    justify-content: center;
    align-items: center;
    margin-bottom: 0.3rem;
    cursor: pointer;
    /* box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5); */
    transition: 0.5s;
    -webkit-transition: 0.5s;
    -moz-transition: 0.5s;
    -ms-transition: 0.5s;
    -o-transition: 0.5s;
}



.test {
    box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
}


'use strict';

const button = document.querySelectorAll ('.js__button');

function createColor () {
  const R = Math.random () * 256;
  const G = Math.random () * 256;
  const B = Math.random () * 256;
  return `rgb(${R},${G},${B})`;
}

function createArr (arr) {
  const colorArr = [
    createColor (),
    createColor (),
    createColor (),
    createColor (),
    createColor (),
    createColor (),
    createColor (),
    createColor (),
    createColor (),
  ];
  colorArr.forEach (function (item, i) {
    arr[i].style.backgroundColor = item;
  });
}

createArr (button);

const clickButton = document.querySelector ('.main__menu__list');
clickButton.addEventListener ('mouseover', handler1);

function handler1 (event) {
  const target = event.target;
  if (target.nodeName !== 'LI') return;
  target.classList.add ('test');
  //   target.classList.remove('test');
  console.log (target);
}

clickButton.addEventListener ('mouseout', handler2);

function handler2 (event) {
  const target = event.target;
  if (target.nodeName !== 'LI') return;
  //   target.classList.add('test');
  target.classList.remove ('test');
  console.log (target);
}

Последний раз редактировалось AndriiS, 25.12.2018 в 13:02.
Ответить с цитированием
  #2 (permalink)  
Старый 25.12.2018, 13:06
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,791

А на css это не сделать? Почему?
Ответить с цитированием
  #3 (permalink)  
Старый 25.12.2018, 13:06
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от AndriiS
Можно ли попроще?
Можно, без JS, в CSS: element:hover {тень}
Ответить с цитированием
  #4 (permalink)  
Старый 25.12.2018, 14:31
Интересующийся
Отправить личное сообщение для AndriiS Посмотреть профиль Найти все сообщения от AndriiS
 
Регистрация: 05.09.2018
Сообщений: 28

Может там событие клик будет висеть, я не знаю точно. Я хочу понять вот что: можно ли поймать событие на исключительно <li>(на промежуточном элементе), чтобы при наведении на <p> оно не пропадало, тем не менее <p> чтобы продолжало быть ребенком <li>.

<ul>

<li>
<p></p>
</li>

</ul>
Ответить с цитированием
  #5 (permalink)  
Старый 25.12.2018, 15:42
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

AndriiS,
css лучше, но если хочется погорячее ...
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
   .main__menu__list {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-evenly;
}

.main__menu__list__item {
    width: 100px;
    height: 100px;
    list-style-type: none;
    font-weight: bolder;
    font-family: Tahoma;
    border-radius: 20px;
    -webkit-border-radius: 20px;
    -moz-border-radius: 20px;
    -ms-border-radius: 20px;
    -o-border-radius: 20px;
    background-color: #69B8E7;
    text-transform: uppercase;
    color: white;
    font-size: 1em;
    text-shadow: 2px 2px blue;
    display: flex;
    justify-content: center;
    align-items: center;
    margin-bottom: 0.3rem;
    cursor: pointer;
    /* box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5); */
    transition: 0.5s;
    -webkit-transition: 0.5s;
    -moz-transition: 0.5s;
    -ms-transition: 0.5s;
    -o-transition: 0.5s;
}



.test {
    box-shadow: 5px 5px 10px rgba(0, 0, 0, 0.5);
}

  </style>


</head>

<body>
<nav class="main__menu">
                <ul class="main__menu__list">
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">I am</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">I have</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">I know</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">I want</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">I dream</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">Lorem</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">Lorem</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">Lorem</p>
                    </li>
                    <li class="main__menu__list__item js__button">
                        <p clas="main__menu__content">Lorem</p>
                    </li>

                </ul>
            </nav>
 <script>
'use strict';

const button = document.querySelectorAll ('.js__button');

function createColor () {
  const R = Math.random () * 256|0;
  const G = Math.random () * 256|0;
  const B = Math.random () * 256|0;
  return `rgb(${R},${G},${B})`;
}

function createArr (arr) {
  arr.forEach (function (item, i) {
    item.style.backgroundColor = createColor();
  });
}

createArr (button);

const clickButton = document.querySelector ('.main__menu__list');
clickButton.addEventListener ('mouseover', handler1);
let temp;

function handler1 (event) {
  const target = event.target;
  if (target.nodeName == 'LI'&& temp !== target){
   handler2();
   temp = target;
   target.classList.add ('test');
  }

}

clickButton.addEventListener ('mouseleave', handler2);

function handler2 () {
  let target = clickButton.querySelector('.test');
  target && target.classList.remove('test');
  temp = null;
}

  </script>
</body>
</html>
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ребята помогите правильно реализовать цепочки функций как в jquery mrgordon Общие вопросы Javascript 6 04.06.2012 20:40
Помогите сменить событие .hover на .click serdeles jQuery 2 22.11.2010 17:07
Плагин JQuery tabs как подписаться нв событие перекл.вкладок xela1980 jQuery 6 15.12.2009 18:00
Событие вращения колесика мышки demoniqus Общие вопросы Javascript 1 09.02.2009 18:31
Как правильно обработать событие? BAnder Events/DOM/Window 19 03.02.2009 14:09