За последние 24 часа нас посетили 23034 программиста и 1710 роботов. Сейчас ищут 1677 программистов ...

Не запускается функция CLICK jQuery

Тема в разделе "JavaScript и AJAX", создана пользователем tavintavan, 23 июн 2018.

  1. tavintavan

    tavintavan Новичок

    С нами с:
    29 апр 2018
    Сообщения:
    34
    Симпатии:
    3
    В чем проблема?
    На сайте при нажатии на кнопку, jQuery создает выпадающее меню из тегов <li>. т.е. li генерирятся динамически.
    Первоначально на сайте их нет, то есть если на кнопку нажать 5 раз, то создается 5 тегов <li> т.е меню из 5 строк.
    Но вот когда я нажимая на сами теги <li>
    Т.е привязываю к тегам li функцию click то она не работает

    Код (Javascript):
    1. генерация выпадающего меню
    2. if ($(".menu").find("li").length = 0 ){
    3.                     $(".menu").html('<li class="submenu"><a name="' + src + '" href="javascript:void(0)">Video1</a></li>');
    4.                 }else{
    5.                     $(".menu").prepend('<li class="submenu"><a name="' + src + '" href="javascript:void(0)">Video' + (mylikes) + '</a></li>');
    6.                 };
    7.  
    8. Привязываю к строке выпадающего меню click функцию
    9.  
    10. $('.submenu').click(function(){ //при клике на строке выпад меню
    11.                 alert("сработало");});
     
  2. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Код (Javascript):
    1. $('.menu').on('click', '.submenu', function(){
    2.                 alert("сработало");
    3. });
     
    TeslaFeo нравится это.
  3. tavintavan

    tavintavan Новичок

    С нами с:
    29 апр 2018
    Сообщения:
    34
    Симпатии:
    3
    Спасибо заработало, а можете объяснить разницу?
    просто в коде у меня есть такая функция и она работает
    Код (Javascript):
    1.  $('#palets').click(function(){});
    В чем разница через .on() или .click()
     
  4. Danil005

    Danil005 Активный пользователь

    С нами с:
    2 янв 2015
    Сообщения:
    528
    Симпатии:
    30
    Разница в том, что ты создаешь элемент и jquery не успевает инициализировать его. Поэтому поиск происходит от родителя. Что касаемо on и click - то они не отличаются ничем. Вы могли использовать $('#element').click('#button', function() {}); и ничего не изменилось бы. Просто это мой стиль кода и иногда on выгоднее использовать, например:
    Код (Javascript):
    1. var typeOn = 'click';
    2. $('element').on(typeOn, function() {});
     
  5. tavintavan

    tavintavan Новичок

    С нами с:
    29 апр 2018
    Сообщения:
    34
    Симпатии:
    3
    Спасибо что объяснили, такие вещи в справочниках как правило мало упоминаются. Всегда полезна спросить у профессионала
     
    Danil005 нравится это.
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Разница в том, что ни о каком "успевании инициализации" тут речи быть не может. Даже на этом форуме не раз звучало такое понятие, как "делегирование событий". Вот тут начинаются все разницы, в том числе и между методами .on() и другими методами событий, как, например, .click().
    Это всё потому, что начинаете изучение не с того, что нужно. jQuery - это JavaScript библиотека и было бы логичней сначала изучить именно язык, а потом использовать его производные.
    Если попробовать коротко, то идея делегирования состоит в том, что обработчик события устанавливается не на какой-то конкретный элемент(ы), а на статический и предполагаемо родительский для ожидаемого. Такой принцип чаще всего используется для динамически создаваемых элементов документа. Всё дело в том, что JS "живёт" в том же временном промежутке, что и DOM, с которым он загружается на клиенте. Т.е. JS знает только о тех элементах, которые были загружены в браузер до того, как был загружен он сам, а обо всех элементах, которые могут появляться позже - он понятия не имеет. Поэтому можно установить обработчик события на известный элемент и, ориентируясь на "объект события" и его свойство "target", вычислять нужный нам. Свойство target возвращает именно тот элемент, на котором реально произошло событие. Например, у нас есть <div>, а внутри него <span> или другой дочерний элемент. Обработчик события "click" устанавливаем на <div>. При клике внутри div-а на span, сработает событие и target вернет нам именно span, хотя на него событие мы не вешали. Дальше мы можем проверить - тот ли это элемент, что мы ожидаем и, если да, то можем с ним работать. Это же будет рабоnать, если span появиться внутри div-а позже (динамически).
    Вот простейший пример.
    HTML:
    1. <div class="parent">
    2.   <div class="child">
    3.     <div class="grandchild"></div>
    4.   </div>
    5. </div>
    6.  
    Код (Javascript):
    1. document.addEventListener('click', e => {
    2.   if (e.target.tagName === 'BUTTON') {
    3.     console.log('А вот и наша кнопка приехала!');
    4.   } else {
    5.     console.log('Это не кнопка...');
    6.   }
    7. });
    8.  
    9.  
    10. // Через 5сек добавим кнопку
    11. setTimeout(() => {
    12.   document.querySelector('.grandchild').innerHTML = `<button>Hi there!</button>`;
    13. }, 5000);
     
    Danil005 и TeslaFeo нравится это.
  7. tavintavan

    tavintavan Новичок

    С нами с:
    29 апр 2018
    Сообщения:
    34
    Симпатии:
    3
    Спасибо за ваше пояснение.
    Понял ваши мысли после 7 прочтения.
    Тяжело для восприятия вы пишите, просьба, для людей который только начинают свой путь, писать:
    1. короче.
    2. приводит аналогии доступные людям, которые первый раз взялись за изучение ЯП (те кто уже имеют опыт в каком то другом языке программирования для них ваши пояснения более менее понятны).
    К примеру мне нравятся аналогии из "Изучаем php и mysql" Линн бейли и и Майкл Морисон.
    Вообще все ЯП как правило пишутся с высоким уровнем абстракции, не доступный рядовым и начинающим . И чтоб понимать эту абстракцию надо затратить много времени.
    В одной из книг мне понравилась ассоциация
    Что присвоение переменной это как взять обувную коробку написать на ней название (имя переменой) и положить в нее записку (присвоить значение).
    А ссылка на переменную это как взять ниточку и привязать записку расположенной внутри коробки.
    Для профессиональных программистов то что я пишу наверное ужас, но начинающим надо начинать с понятных и доступным для понимания вещей.