desandro / imagesloaded

:camera: JavaScript is all like "You images done yet or what?"
https://imagesloaded.desandro.com
MIT License
8.88k stars 1.15k forks source link

obj is not iterable #308

Open Craigy- opened 1 year ago

Craigy- commented 1 year ago

After updating this script from 4.1.0 to 5.0.0 without any changes of initialization code, it's now thrown error and doesn't work:

Uncaught TypeError: obj is not iterable

Initialization code:

$('.js-b').each(function () {
    console.log($(this));
    $(this).imagesLoaded().done(function () {
      ...
    });
});

console.log => Object { 0: div.all-b.vertical-b.js-b, context: div.all-b.vertical-b.js-b, length: 1 }

dan-bizango commented 1 year ago

@Craigy- I was having the same issue.

I made a simple test with the jquery version of images loaded with a simple container loading a number of images as immediate children and was still getting the 'obj not iterable' error.

I just went in and updated the code in the in the script to use the Object.values() method to convert to an array so that I didn't run into the iterable issue with the Object.

I updated this if (isArrayLike) return [...obj]; To this if (isArrayLike) return Object.values(obj);

And all is working now,

r-anwar commented 6 months ago

The issue also occurs on WordPress 6.4.2.

The following combination is running there:

After modifying line 138 in the imagesloaded script, the script runs without errors:

Line 138:

if ( isArrayLike ) return [ ...obj ];

Changed to:

if (isArrayLike) return Object.values(obj);

Please take a close look at the issue and fix it. All WP pages currently upgrading and using imagesloaded with masonry will encounter this problem. Furthermore, the current fix is not persistent, as the file will be overwritten with the original during the next upgrade.