magnific-popup-rails icon indicating copy to clipboard operation
magnific-popup-rails copied to clipboard

Integration with turbolinks

Open asok opened this issue 10 years ago • 13 comments

Hey, as far I've tried it does not well with turbolinks. I have such peace of code:

setupProducts = -> 
        $('.photo-gallery').magnificPopup
                type: 'image',
                delegate: 'a',
                gallery: {enabled: true}
$ ->
  document.addEventListener "page:load", setupProducts
  setupProducts()

When I start in a page with element $('.photo-gallery') I click on it and magnific show the gallery. Then I go to some other page using turbolinks. When I go back to the first page after clicking on the element nothing happens.

It seems like it was already initialized for this element (that at this time is in the turbolinks cache (?)). And magnific stops working if initialized for the second time on the same element. Is there a way to check if magnific was already initialized for a giving element?

asok avatar Jan 26 '14 00:01 asok

You could try something like this to check if Magnific popup is already initialized:

$(".photo-gallery").data("magnificPopup") is `undefined`
  # initialize magnific popup

But I think there may be another problem, because even without binding a second time it still doesn't work properly. I've added some callbacks ( http://dimsemenov.com/plugins/magnific-popup/documentation.html#api ) and even though all these callbacks are triggered just like they do on the first request, the popup just won't show.

For now I'm just opting out of turbolinks for the page that uses magnific popup by adding data-no-turbolink to the parent container.

<li data-no-turbolink><%= link_to "Home", root_url %></li>

joshuajansen avatar Jan 26 '14 10:01 joshuajansen

@joshuajansen thanks. Indeed it seems like using data-no-turbolink is the only solution. It is definitely worth mentioning that in the README.

It looks that turbolinks are not specific to rails only now. Maybe it's worth opening such issue in the mainstream?

asok avatar Jan 26 '14 17:01 asok

I've tried: 1: Using

$(document).on('page:load ready', function()

instead of

$(document).ready()

2: Checking for double binding.

3: Adding jquery.turboolinks to the application.js

None of these helped. The only solution for now is to turn off turbolinks on those links that lead to Magnific Popup pages.

It can turn into a maintenance nightmare over time. I can't even write automated tests for this.

veriel avatar Feb 05 '14 15:02 veriel

+1 to this one, I just spent 6+ hours trying to track this one down

andrewnguyen42 avatar Feb 28 '14 05:02 andrewnguyen42

Here's how it works for me: Comment the condition if (!_body) https://github.com/joshuajansen/magnific-popup-rails/blob/master/vendor/assets/javascripts/magnific-popup/jquery.magnific-popup.js#L148-L150 here. So it always gets current document.body.

glebtv avatar Apr 01 '14 21:04 glebtv

Thanks @glebtv ! Commenting the condition did the trick :+1:

jeremyrajan avatar Apr 08 '14 04:04 jeremyrajan

That link doesn't show any condition on (!_body) but _body = $(document.body); so I assumed it's been changed.

Has anyone managed to get this to work with the newer code?

tirdadc avatar May 27 '14 18:05 tirdadc

Looks like it's opening everything under the original document.body element. So change the line to:

_body = $("body");

mitchellfyi avatar Jun 13 '14 15:06 mitchellfyi

+1 to your solution with always loading

_body = $("body");

I guess this would be a problem with other JavaScript frameworks that replace the body.

lassebunk avatar Jun 28 '14 12:06 lassebunk

@glebtv great thanks @joshuajansen please update the gem on rubygems

now I've fixed it with the fork of the repo and replaced a line with the gem by: gem 'magnific-popup-rails', github: 'itsNikolay/magnific-popup-rails' now it works well with it will help other developers

itsNikolay avatar Sep 07 '14 22:09 itsNikolay

@itsNikolay this fix actually belongs in the core (https://github.com/dimsemenov/Magnific-Popup), but it seems that they're not too eager with merging the open pull requests. So feel free to create a pull to this repo, I'll merge it in right away! :shipit:

joshuajansen avatar Sep 09 '14 08:09 joshuajansen

Thank you guys for the suggested solution! It works.

mtomov avatar Oct 16 '14 21:10 mtomov

Update, currently this:

$(document).on('page:change', ->
  $.magnificPopup.close()
)

is also required or pop up won't open if turbolinks navigation was triggered when pop ups were open, or it stops working.

glebtv avatar Aug 22 '15 12:08 glebtv