За последние 24 часа нас посетил 16621 программист и 1643 робота. Сейчас ищут 1309 программистов ...

как в js привязать несколько событий к клику

Тема в разделе "JavaScript и AJAX", создана пользователем AlexsaiL, 13 дек 2017.

  1. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Подскажите пожалуйста, как правильно привязать несколько событий к одному клику, чтобы при нажатии на элемент, мог получить данные из нескольких вкладок(табов), передать их на сервер и вернуть данные в раздельные (разные) блоки в свои же вкладки. Или подскажите где можно ознакомится с данным материалом работы с событиями и возвращением с сервера и раздельный вывод данных.
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Если нужно несколько событий, то element.AddEventListener() в помощь. Но учтите, что обработчики выполняются асинхронно и без гарантии, что порядок вызова будет тот же, что порядок объявления. Если нужно несколько действий по клику совершить, то просто опишите их в рамках одного обработчика.
     
  3. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Код (Javascript):
    1. $('#item').on('click', function(){
    2. // получаем 1
    3. // отправляем 1
    4.  
    5. // получаем 2
    6. // отправляем 2
    7.  
    8. // ...
    9. });
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    А без подключения жиквери ради того, чтобы навесить обработчик события, слабо?

    Код (Javascript):
    1. document.getElementById("item").addEventListener('click', function(){
    2. // получаем 1
    3. // отправляем 1
    4.  
    5. // получаем 2
    6. // отправляем 2
    7.  
    8. // ...
    9. });
     
  5. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Не понятно, что именно вам нужно
    клик (click) - это уже событие. Если у вас есть несколько обработчиков разных событий и вам нужно, чтобы по клику они выполнились, то это можно сделать программно:
    Код (Javascript):
    1. // от простого вызова, который будет работать далеко не со всеми событиями
    2. myElement.click();
    3. // до триггерования
    4. var evt = document.createEvent("Events");
    5. evt.initEvent('click', true, true);
    6. myElement.dispatchEvent(evt);
    7. // или даже использования кастомных событий
    8. var evt = new CustomEvent('click', {bubbles: true, cancelable: true});
    9. myElement.dispatchEvent(evt);
    Формируете на сервере ассоциативный массив и по его ключам ориентируетесь - что и в какой блок нужно выводить.
     
  6. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    пока что, я им пользуюсь не только для навешивания событий, но потихоньку, всё больше юзаю нативный JS внутри функций.

    опять ты за своё)
    сколько лет ты в программировании в целом и в ВЕБе в частности?
     
  7. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    У меня идет страница продукта, где имеется несколько вкладок(табов), в главной(активной) вкладке идет изображения продукта, название, краткое описание,цена и выбор цвета. при выборе другого цвета у меня меняется всё содержимое в первой вкладке подставляется в зависимости от выбранного цвета, теперь необходимо мне реализовать чтобы при данном клике менялись данные на других вкладках(характеристики, сертификаты) так как у продукта разного цвета есть небольшие различия.
    P. S. js я только начал изучать, так что знаю совсем малую часть основы.
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    В программировании что-то около 13, в Вебе - что-то около 4-5, наверное.
    --- Добавлено ---
    1)Посылаем запрос на сервер, получаем пачку данных сразу для всех вкладок.
    2)Собираем вкладки в массив и в цикле обновляем.
    3) ...
    4) PROFIT!!1

    Куча однотипных действий всегда может быть представлена как одно циклическое :)
     
    AlexsaiL нравится это.
  9. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Звучит легко))) с моим опытом в js по времени займет намного больше.
    --- Добавлено ---
    отображу код, но он немного не правильный, с рекурсией проблемы, а также беру только один массив данных с первой вкладки, остальные массивы в других вкладках не передаю тут, а надо бы.
     
  10. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    А главное, что и реализуется так же. С массивами на PHP вы уже умеете работать. Остаётся самая малость - Объекты в JS. Думаю, что часа хватаит с головой, чтобы понять основы.
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    А зачем в данной задаче рекурсия? Мб потому и проблемы, что она не нужна? :)
     
  12. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    вот такой код в js у меня:
    Код (Javascript):
    1. <script>
    2.  
    3. $(document).on('click','.individOnClick', function(event){
    4.     event.preventDefault();
    5.     var  idClick;
    6.     idClick = $(this).attr('id'); // id другого цвета
    7.     var obj = {json_encode($jsonZ)}; // многомерный ассоц.массив в smarty (содержит ключи в значении которых-массив с img другого цвета и др.парамметров)
    8.     var url = {$url};// номер категории
    9.     var idd = {$itemId}; // ид. продукта
    10.     function find(obj, value) {// в функции перебираю многомерный массив, нахожу значение ключа идентичного с idClick и беру весь его родительский массив с данными
    11.         for (var i in obj) for (var j in obj[i])
    12.          if (obj[i][j] == value) return [obj[i], obj[i][j]];
    13.         return false;
    14.     }
    15.     var mass = find(obj, idClick);
    16.     var massString = JSON.stringify(mass[0]);
    17.      
    18.     $.ajax({
    19.         async: false,
    20.         type: "POST",
    21.         url: "ProductController.php?category="+url+"&controller=product&id="+idd+"&lang=ru",
    22.         {literal}data:  {mass : massString}, {/literal}
    23.         dataType: 'text',
    24.         success: function(data) {
    25.             console.log('Данные успешно отправлены.');
    26.             var description = document.getElementById("indivRemoveJs");
    27.             description.remove();// удаляю родительский блок на странице
    28.             $('.individAppendJs').html(data); // полученные данные с сервера сформированные на другой странице .tpl вывожу в блок с классом- individAppendJs
    29.            
    30.             name_of_my_function();
    31.         }
    32.     });
    33.    
    34. });
    35.  
    36. function name_of_my_function(){
    37.     $(".individOnClick").off('click').click(function(event){
    38.     event.preventDefault();
    39.     var  idClick;
    40.     idClick = $(this).attr('id'); // id другого цвета
    41.     var obj = {json_encode($jsonZ)}; // многомерный ассоц.массив в smarty (содержит ключи в значении которых-массив с img другого цвета и др.парамметров)
    42.     var url = {$url}; // номер категории
    43.     var idd = {$itemId}; // ид. продукта
    44.     function find(obj, value) {// в функции перебираю многомерный массив, нахожу значение ключа идентичного с idClick и беру весь его родительский массив с данными
    45.         for (var i in obj) for (var j in obj[i])
    46.          if (obj[i][j] == value) return [obj[i], obj[i][j]];
    47.         return false;
    48.     }
    49.     var mass = find(obj, idClick);
    50.     var massString = JSON.stringify(mass[0]);
    51.      
    52.         $.ajax({
    53.             async: false,
    54.             type: "POST",
    55.             url: "ProductController.php?category="+url+"&controller=product&id="+idd+"&lang=ru",
    56.             {literal}data:  {mass : massString}, {/literal}
    57.             dataType: 'text',
    58.             success: function(data) {
    59.                 console.log('Данные успешно отправлены.');
    60.                 var description = document.getElementById("indivRemoveJs");
    61.                 description.remove();
    62.                 $('.individAppendJs').html(data);
    63.                
    64.                 name_of_my_function();
    65.             }
    66.         });
    67.     });
    68. }
    69. </script>

    на стороне сервера:
    PHP:
    1.       if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
    2.             // Если к нам идёт Ajax запрос, то ловим его
    3.             $arr = json_decode($_POST['mass'], true);
    4.             $smarty->assign('arr', $arr);
    5.    
    6.       $template_output = $smarty->fetch("supportListProd.tpl");
    7.       echo $template_output;
    8.       return false;
    9.       }
    Правда после отправки с сервера, на новом контенте не срабатывают сторонние скрипты и при первых переключениях цветов контент дергается несколько раз, потом сменяется нормально. С рекурсией не разобрался до конца.
    --добавлено

    При переключении несколько раз одного и того же цвета, переставало выводить новый контент, пришлось прибегнуть к рекурсии.
     
  13. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    в js массив уже идет объектом как я понимаю.
    Т.е. в js я беру массив с первой вкладки присваиваю ему переменной, с других вкладок беру другие массивы, присваиваю им переменные;
    Создаю новый объект, помещаю туда все переменные в значении которых массивы;
    В ajax через data: я передаю этот объект строкой серверу;
    На стороне сервера я его разбираю,
    Создаю другие страницы с таким же DOM только уже с новыми данными;
    И возвращаю в success, где уже необходимо будет вернуть каждый массив в свою вкладку?
     
  14. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    перед этим завернуть в JSON
     
    AlexsaiL нравится это.
  15. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    а на стороне сервера как правильно обработать и вернуть данные в success чтобы каждый массив ушел в свой блок?
     
  16. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Способы зависят от вашей фантазии. Например:
    PHP:
    1. // tab_1, tab_2 - могут быть конретными селекторами табов, напр. ID,
    2. // а 'a' и 'b' - классами
    3. $data = [
    4.     'tab_1' => [
    5.         'a' => 'Text A for Tab 1',
    6.         'b' => 'Text B for Tab 1',
    7.         /* ... */
    8.     ],
    9.     'tab_2' => [
    10.         'a' => 'Text A for Tab 2',
    11.         'b' => 'Text B for Tab 2',
    12.         /* ... */
    13.     ]
    14. ];
    15.  
    16. exit(json_encode($data));
    На клиенте что-то в этом роде
    Код (Javascript):
    1. // Объект, который получили в ответе
    2. const myObj = {
    3.     tab_1: {
    4.         a: 'Text A for Tab 1',
    5.         b: 'Text B for Tab 1',
    6.     },
    7.     tab_2: {
    8.         a: 'Text A for Tab 2',
    9.         b: 'Text B for Tab 2',
    10.     },
    11. };
    12.  
    13. // Раскидываем данные в нужные места
    14. for (let [id, data] of Object.entries(myObj)) {
    15.     let tab = document.getElementById(id);
    16.     for (let [cls, txt] of Object.entries(data)) {
    17.         tab.querySelector('.' + cls).textContent = txt;
    18.     }
    19. }
    --- Добавлено ---
    P.S. Не забудьте, что если пишем без jQuery, то json-строку в ответе нужно сначала распарсить - JSON.parse(); Если всё-таки jQuery, то указываем тип ожидаемых данных явно - dataType: 'json' и в success сразу получаем готовый объект.
     
    AlexsaiL нравится это.
  17. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Благодарю всех за помощь! Попробую реализовать!:)
     
  18. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Ждём новостей через неделю :)
     
  19. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Сделал все, извиняюсь что раньше не отписал, в общем реализовал все без ajax, используя js и цикл for({section}) в шаблонизаторе, элементы одни скрываю, другие отображаю, все работает, знание js+ajax необходимы, так что буду изучать потихоньку, благодарю ВСЕХ за помощь!:)
     
  20. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    @AlexsaiL ajax понять очень просто.
    Смысл в том, что js, точно так же как браузер, обращается к серверу по определенной ссылке
    и возвращает тебе в переменную всё, что вернул сервер.

    Это может быть уже готовый html, который ты просто вставишь, куда тебе надо,
    или JSON строка, которую ты превратишь в объект/массив/массив объектов
    и сам на клиенте соберешь нужный тебе html и вставишь куда надо :)
    или JSON с массивом html, который ты разберешь...

    короче дай волю фантазии))
     
  21. Taktreba

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

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    я когда начал учить программирование (год назад), сначала изучил на курсах циклы, а потом конструкцию ifelse, была какая то задача, не как не мог решить (не важно какая), потом прихожу на лекцию, говорю парням - "а как это сделать", они говорят "так ты в цикл запихни проверку if", я говорю "а что так можно?" :):D
     
    denis01 и TeslaFeo нравится это.
  22. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Мне наверное повезло больше
    я в 9 классе уже так делал)
    только в QBasic или TurboPaskal - помню)
    --- Добавлено ---
    помню как мы на первых пеньках в QBasic использовали пустой цикл от 1 до 5000 в качестве задержки для перемещения точки на экране :)
    нас так учила училка :D
     
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Помню, как две трети игр времен MS-DOS вместо таймеров использовали такой "хак". А потом, когда на компе более мощном игру запускаешь, она начинает работать в N раз быстрее, кратно повышению мощности машины.

    В итоге, в DOSbox-е даже вбили костыль, ограничивающий количество "тиков" для приложений, чтобы они работали так, как было задумано, а не так, как позволяет железка.
     
  24. AlexsaiL

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

    С нами с:
    23 дек 2016
    Сообщения:
    327
    Симпатии:
    23
    Да мне надо побольше почитать+ (попрактиковать) про ajax+json+js, а то когда передавал данные на сервер и потом возвращал готовый html(tpl) то у меня переставали работать скрипты на подгруженном контенте, был лимит на переключение, делал рекурсию чтобы лимита небыло на переключение, но как-то криво получилось:D:confused:. В общем пошел другим путем. А в школе у нас на информатики ничего нормального не рассказывали херню несли и все рубились в игры, вот приходится наверстывать самому те знания о которых никто никогда не рассказывал)).
     
  25. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    хак не дальновидный
    у нас тоже не рассказывали. Я ходил на программирование отдельно)