Как вызвать функцию внутри foreEach?

Я добавил eventListener на маленькие картинки, при нажатии на картинку PhotoSwipe открывает всю галерею, но не напоминает об открытии ...

Если я раскомментирую //openPhotoSwipe() в конце js файла, галерея PhotoSwipe появится при загрузке страницы, и eventListener будет работать должным образом. Но я не этого хочу ... Я новичок в javascript ... Помощь и объяснение были бы очень признательны

 function openPhotoSwipe() {

    var pswpElement = document.querySelectorAll('.pswp')[0];

    var pics =  Array.from(document.getElementsByTagName('img'));

    var items = []

    pics.forEach(function(e){
                    items.push({src: e.src, w: 0, h: 0});
                    })
    var options = {

        history: false,
        focus: false,
        showAnimationDuration: 0,
        hideAnimationDuration: 0,
        closeOnScroll: false,
        closeOnClick: false,

    };

    var gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);

    gallery.listen('gettingData', function(index, item) {
      if (item.w < 1 || item.h < 1) {
        var img = new Image(); 
        img.onload = function() {
            item.w = this.width;
            item.h = this.height;
            gallery.invalidateCurrItems();
            gallery.updateSize(true);
        }
        img.src = item.src;
      }
    });

    gallery.init();
};


   var open = Array.from(document.getElementsByClassName("open_gallery"));

open.forEach(function(e){
    e.addEventListener('click', openPhotoSwipe);
})
// openPhotoSwipe();

вот часть моего взгляда:

   <div class = "container">

    <h1><%= @article.title %></h1>
    <p><%= @article.description %></p>

    <div class = "thumb_images">
        <% @article.attachments.each do | art| %>

        <%= link_to image_tag art.url, class: "open_gallery" %>

        <% end %>
    </div>

</div>


<div class = "pswp" tabindex = "-1" role = "dialog" aria-hidden = "true">

    <div class = "pswp__bg"></div>

    <div class = "pswp__scroll-wrap">


        <div class = "pswp__container">
            <% @article.attachments.each do | art| %>
                <div class = "pswp__item">
                    <%= image_tag art.url %>
                </div>
            <% end %>
        </div>


        <div class = "pswp__ui pswp__ui--hidden">

            <div class = "pswp__top-bar">

                <div class = "pswp__counter"></div>

                <button class = "pswp__button pswp__button--close" title = "Close (Esc)"></button>

                <button class = "pswp__button pswp__button--share" title = "Share"></button>

                <button class = "pswp__button pswp__button--fs" title = "Toggle fullscreen"></button>

                <button class = "pswp__button pswp__button--zoom" title = "Zoom in/out"></button>

                <div class = "pswp__preloader">
                    <div class = "pswp__preloader__icn">
                        <div class = "pswp__preloader__cut">
                        <div class = "pswp__preloader__donut">
                        </div>
                    </div>
                    </div>
                </div>

            </div>

            <div class = "pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
                <div class = "pswp__share-tooltip">
                </div> 
            </div>

            <button class = "pswp__button pswp__button--arrow--left" title = "Previous (arrow left)">
            </button>

            <button class = "pswp__button pswp__button--arrow--right" title = "Next (arrow right)">
            </button>

            <div class = "pswp__caption">
                <div class = "pswp__caption__center">
                </div>
            </div>

        </div>

    </div>

</div>

Но это работает в этом небольшом примере jsbin.com/dicudivimo/edit?html,js,console,output ..

Arup Rakshit 05.09.2018 22:26

Что вы увидите, если добавите console.info(open.length)?

Arup Rakshit 05.09.2018 22:27
console.info(open.length) возвращает 4 (так как в этой статье у меня четыре изображения)
johan 05.09.2018 22:29

Вы можете записать link_to как <%= link_to "#", class: "open_gallery" do %><%= image_tag art.url %><%end%>?

Arup Rakshit 05.09.2018 22:31

Спасибо @ArupRakshit! Вы дали мне лучший способ :) <%= link_to "#" do %> <%= image_tag art.url , class: "open_gallery" %> <% end %> работал лучше

johan 05.09.2018 22:35

вы можете сохранить класс в элементе a, он все равно будет работать из-за всплытия событий в JS.

Arup Rakshit 05.09.2018 22:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как вы подтвердили в комментарий, что мое предположение было правильным, ваш link_to в основном не создает желаемую разметку HTML. Итак, здесь я помещаю комментарий в качестве ответа. Напишите ссылку на метод, как показано ниже:

<%= link_to "#", class: "open_gallery" do %>
  <%= image_tag art.url %>
<%end%>

Еще раз спасибо за эту бесценную помощь! Вот как я это написал: <%= link_to "#" do %> <%= image_tag art.url , class: "open_gallery" %> <% end %>

johan 05.09.2018 22:41

@NEL, вы можете оставить класс в link_to ... он все равно будет работать, попробуйте. И я думаю, что это должна быть ваша наценка, чтобы она покрывала область хорошего клика.

Arup Rakshit 05.09.2018 22:42

Я пробовал, но это испортило мой стиль ... (кстати, я все еще могу создать другой класс) Это лучший рубиновый способ написать его так, как вы, или это нормально "по-моему"?

johan 05.09.2018 22:47

@NEL по-моему .. :) Хорошо. добавьте JS-класс в тег a и сохраните open_gallery в imgae для стилизации .. или сделайте наоборот .. Но я предлагаю подключить обработчик событий к тегу <a> вместо img

Arup Rakshit 05.09.2018 22:48

Другие вопросы по теме