I'm currently developing a webpage and started using webpack in my build process. I've managed to use slick-carrousel plugin downloaded via npm but can't make fancybox to work!
I've downloaded it via npm and imported it as stated in the documentation:
var $ = require("jquery");
var slick = require("slick-carousel");
var fancybox = require("fancybox")($);
Then in my code I try to initailize a fancybox object and nothing happens. It throws no errors at all.
$(".filtros__filtrar").on('click', function() {
$.fancybox.open({
src : '#tns-filtros',
type : 'inline',
opts : {
smallBtn: false
}
});
});
If I do a console log of those variables I get:
console.log(fancybox); -> undefined
console.log(slick); -> {}
Which means slick module is loading correctly but not fancybox.
Somewhere I read that you have to use imports-loader to make fancybox recognize jquery variables. So I downloaded it via npm and included this in my webpack.config file:
module: {
rules: [
{
test: /fancybox[\/\\]dist[\/\\]js[\/\\]jquery.fancybox.cjs.js/,
use: "imports-loader?jQuery=jquery,$=jquery,this=>window"
}
]
}
But it doesn't work either.
Can someone give me a light on this subject? Thanks in advance!
To attach Fancybox to the images, you need to add the attribute [data-fancybox="optional-gallary-identifier"] to the element. You can do this manually via HTML or with jQuery. Here are 2 ways you can do this with jQuery.
jQuery(document). ready(function($) { $('button'). on('click', function() { $. fancybox(); }); });
fancyBox is a tool that offers a nice and elegant way to add zooming functionality for images, html content and multi-media on your webpages. More information and examples: http://www.fancyapps.com/fancybox/
Ok. I managed to solve the problem like this.
First, I realized that I installed Fancybox 2 instead of Fancybox 3 so I uninstalled the first and installed the last (Thanks to @Mikhail Shabrikov for making me realize that!).
npm uninstall fancybox --save-dev
npm install @fancyapps/fancybox --save
Second, I dig through Fancybox original code and saw that it requires jQuery to be passed to it as window.jQuery
and not $
so in my requires I did this:
var $ = require("jquery");
window.jQuery = $; <-- This is what do the magic!!
var slick = require("slick-carousel");
require("@fancyapps/fancybox");
And voila! Everything works now.
This is not entirely true - "I've downloaded it via npm and imported it as stated in the documentation". You do not have to assign require('fancybox')($)
into variable, this calling returns nothing. Below - it is a snippet from docs
var $ = require('jquery');
require('fancybox')($); <------- (2)
You can check if your jQuery object has fancybox
method with console.log($.fancybox)
. If it returns a function, it means that you successfully import a fancybox package to your code. So you should seek the cause of the error in another place. In this case, check if the object which you passed to $.fancybox.open
is correct. As I know, the property src
of this object should contain an url to image or video what you want to show. Like in this example from fancybox official site.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With