11

I want to load a Masonry view of some images but an error occurs:

TypeError: $(...).masonry is not a function

HTML Code:

<div data-masonry-options="{&quot;columnWidth&quot;: 105, &quot;itemSelector&quot;:&quot;.item&quot;}" class="img-container js-masonry" style="position: relative; height: 381.417px;">
    <div class="item">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/889/88940833.jpg">
    </div>
    <div class="item">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/907/90775901.jpg">
    </div>
    <div class="item">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/294/29489326.jpg">
    </div>
    <div class="item ">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/100/100656385.jpg">
    </div>
    <div class="item ">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/889/88940839.jpg">
    </div>
    <div class="item ">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/111/111773987.jpg">
    </div>
    <div class="item ">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/146/146371016.jpg">
    </div>
    <div class="item">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/103/10313578.jpg">
    </div>
    <div class="item ">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/554/55473337.jpg">
    </div>
    <div class="item ">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/537/53727259.jpg">
    </div>
    <div class="item ">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/111/111246515.jpg">
    </div>
    <div class="item">
        <img src="https://s3.amazonaws.com/clarifai-img/demo/461/46176355.jpg">
    </div>
</div>

jQuery Code:

<script type='text/javascript'>
$('.grid').masonry({
    // options
    itemSelector: '.grid-item',
    columnWidth: 200
});
var elem = document.querySelector('.grid');
var msnry = new Masonry(elem, {
    // options
    itemSelector: '.grid-item',
    columnWidth: 200
});

// element argument can be a selector string
//   for an individual element
var msnry = new Masonry('.grid', {
    // options
});                         
</script>

I also include:

<script src="https://cdnjs.cloudflare.com/ajax/libs/masonry/3.3.2/masonry.pkgd.js"></script>
Chad Nouis
  • 6,316
  • 1
  • 25
  • 27
Zisu
  • 485
  • 2
  • 6
  • 24

5 Answers5

8

That error is because jQuery isn't loaded when you are trying to run the inline script.

This is because you are running the script inline from the html, while you are referencing jQuery using the "src" attribute. Even if you put the jQuery reference first in the html order, the browser will try to run inline javascript before it loads the external jQuery library. And so you get the error.

You can easily fix this two ways:

  1. Putting everything in the inline script tag in a js file
  2. Use vanilla js instead. Add a "masonry-grid" id to the container div, then change the inline script to this:

    <script type='text/javascript'>
    var container = document.querySelector('#masonry-grid');
    var msnry = new Masonry( container, {
       columnWidth: 200,
       itemSelector: '.item'
    });          
    </script>
    

A good guide for getting started with JS Masonry is here.

chasmani
  • 1,770
  • 1
  • 18
  • 30
1

You are calling masonry on a container with a class grid yet you have not given the container the class="grid".

<div data-masonry-options="{'columnWidth': 105, 'itemSelector':'.item'}" class="grid img-container js-masonry">

You do not need to escape your data-masonry-options ("), you should use a current version of jQuery (1.11, not 1.72) and you don't need to call masonry 3x as your current code does. Just do this:

$('.grid').masonry({
// options
itemSelector: '.grid-item',
columnWidth: 200
});

The jsfiddle by @Mr.Happy shows the following errors because of this issue:

[Error] Bad element for masonry: null
Outlayer (masonry.pkgd.js, line 2128)
Layout (masonry.pkgd.js, line 2932)
(anonymous function) (show, line 34)
dispatch (jquery.min.js, line 3)
i (jquery.min.js, line 3)
[Error] Bad element for masonry: .grid
Outlayer (masonry.pkgd.js, line 2128)
Layout (masonry.pkgd.js, line 2932)
(anonymous function) (show, line 42)
dispatch (jquery.min.js, line 3)
i (jquery.min.js, line 3)
Macsupport
  • 5,144
  • 3
  • 24
  • 41
  • Still error TypeError: $(...).masonry is not a function but i included $('.grid').masonry({ – Zisu Sep 04 '15 at 14:09
0

Try this.

This is working example of yours and you can also check on jsFiddle: http://jsfiddle.net/mananpatel/6mbhphvj/1/

 $('.grid').masonry({
   // options
   itemSelector: '.grid-item',
   columnWidth: 200
 });
 var elem = document.querySelector('.grid');
 var msnry = new Masonry(elem, {
   // options
   itemSelector: '.grid-item',
   columnWidth: 200
 });

 // element argument can be a selector string
 //   for an individual element
 var msnry = new Masonry('.grid', {
   // options
 });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/masonry/3.3.2/masonry.pkgd.js"></script>
<div data-masonry-options="{&quot;columnWidth&quot;: 105, &quot;itemSelector&quot;:&quot;.item&quot;}" class="img-container js-masonry" style="position: relative; height: 381.417px;">
  <div class="item">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/889/88940833.jpg">
  </div>
  <div class="item">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/907/90775901.jpg">
  </div>
  <div class="item">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/294/29489326.jpg">
  </div>
  <div class="item ">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/100/100656385.jpg">
  </div>
  <div class="item ">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/889/88940839.jpg">
  </div>
  <div class="item ">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/111/111773987.jpg">
  </div>
  <div class="item ">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/146/146371016.jpg">
  </div>
  <div class="item">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/103/10313578.jpg">
  </div>
  <div class="item ">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/554/55473337.jpg">
  </div>
  <div class="item ">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/537/53727259.jpg">
  </div>
  <div class="item ">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/111/111246515.jpg">
  </div>
  <div class="item">
    <img src="https://s3.amazonaws.com/clarifai-img/demo/461/46176355.jpg">
  </div>
</div>
Mr.Happy
  • 2,559
  • 8
  • 32
  • 67
  • I copy & paste your code still error I include js Still console error TypeError: $(...).masonry is not a function $('.grid').masonry({ – Zisu Sep 04 '15 at 14:00
0

I had this same issue. I fixed it by moving the script reference (script type="text/javascript" src="\masonry.pkgd.min.js") up to the header of my aspx page.

0

The solution is quite simple! Include the new JS 3.5.1 library, then include jquery-migrate-3.3.1 to support the old functionality, after all this comment out the line:

//    function initGrid()
//    {
//      setTimeout(function()
//      {
//          $('.grid').masonry(
//          {
//              itemSelector:'.grid-item',
//              columnWidth: 80,
//              gutter: 15
//          });
//     }, 500);
            

Then you initialize:

$(document).ready(function()
{
    //"use strict";
    /* 

    1. Vars and Inits
    */
    var header = $('.header');
    var menuActive = false;
    var menu = $('.menu');
    var burger = $('.hamburger');
    setHeader();
    $(window).on('resize', function()
    {
        setHeader();
    });

    $(document).on('scroll', function()
    {
        setHeader();
    });
    initMenu();
    initHomeSlider();
    initVideo();
    initTopSlider();
    initVidSlider();
    initEventsSlider();
//  initGrid();
    $('.grid').masonry(
    {
        itemSelector:'.grid-item',
        columnWidth: 80,
        gutter: 15
    });
    /* 

And everything should work !! If you have any questions, write to me on Telegram @Svanolson

Daniel Manta
  • 5,682
  • 13
  • 35
  • 38