PageSourceSearch

https://www.le357.org/js/waitforimage.2.4.0.js

js le357.org collected 2026-10-10 01:22:48 UTC 8,128 bytes, 229 lines download raw bytes

vendor: 8,128 bytes, lines 1-229
1/*! waitForImages jQuery Plugin - v2.4.0 - 2018-02-13
2* https://github.com/alexanderdickson/waitForImages
3* Copyright (c) 2018 Alex Dickson; Licensed MIT */
4;(function (factory) {
5    if (typeof define === 'function' && define.amd) {
6        // AMD. Register as an anonymous module.
7        define(['jquery'], factory);
8    } else if (typeof exports === 'object') {
9        // CommonJS / nodejs module
10        module.exports = factory(require('jquery'));
11    } else {
12        // Browser globals
13        factory(jQuery);
14    }
15}(function ($) {
16    // Namespace all events.
17    var eventNamespace = 'waitForImages';
18
19    // Is srcset supported by this browser?
20    var hasSrcset = (function(img) {
21        return img.srcset && img.sizes;
22    })(new Image());
23
24    // CSS properties which contain references to images.
25    $.waitForImages = {
26        hasImageProperties: [
27            'backgroundImage',
28            'listStyleImage',
29            'borderImage',
30            'borderCornerImage',
31            'cursor'
32        ],
33        hasImageAttributes: ['srcset']
34    };
35
36    // Custom selector to find all `img` elements with a valid `src` attribute.
37    $.expr.pseudos['has-src'] = function (obj) {
38        // Ensure we are dealing with an `img` element with a valid
39        // `src` attribute.
40        return $(obj).is('img[src][src!=""]');
41    };
42
43    // Custom selector to find images which are not already cached by the
44    // browser.
45    $.expr.pseudos.uncached = function (obj) {
46        // Ensure we are dealing with an `img` element with a valid
47        // `src` attribute.
48        if (!$(obj).is(':has-src')) {
49            return false;
50        }
51
52        return !obj.complete;
53    };
54
55    $.fn.waitForImages = function () {
56
57        var allImgsLength = 0;
58        var allImgsLoaded = 0;
59        var deferred = $.Deferred();
60        var originalCollection = this;
61        var allImgs = [];
62
63        // CSS properties which may contain an image.
64        var hasImgProperties = $.waitForImages.hasImageProperties || [];
65        // Element attributes which may contain an image.
66        var hasImageAttributes = $.waitForImages.hasImageAttributes || [];
67        // To match `url()` references.
68        // Spec: http://www.w3.org/TR/CSS2/syndata.html#value-def-uri
69        var matchUrl = /url\(\s*(['"]?)(.*?)\1\s*\)/g;
70
71        var finishedCallback;
72        var eachCallback;
73        var waitForAll;
74
75        // Handle options object (if passed).
76        if ($.isPlainObject(arguments[0])) {
77
78            waitForAll = arguments[0].waitForAll;
79            eachCallback = arguments[0].each;
80            finishedCallback = arguments[0].finished;
81
82        } else {
83
84            // Handle if using deferred object and only one param was passed in.
85            if (arguments.length === 1 && $.type(arguments[0]) === 'boolean') {
86                waitForAll = arguments[0];
87            } else {
88                finishedCallback = arguments[0];
89                eachCallback = arguments[1];
90                waitForAll = arguments[2];
91            }
92
93        }
94
95        // Handle missing callbacks.
96        finishedCallback = finishedCallback || $.noop;
97        eachCallback = eachCallback || $.noop;
98
99        // Convert waitForAll to Boolean.
100        waitForAll = !! waitForAll;
101
102        // Ensure callbacks are functions.
103        if (!$.isFunction(finishedCallback) || !$.isFunction(eachCallback)) {
104            throw new TypeError('An invalid callback was supplied.');
105        }
106
107        this.each(function () {
108            // Build a list of all imgs, dependent on what images will
109            // be considered.
110            var obj = $(this);
111
112            if (waitForAll) {
113
114                // Get all elements (including the original), as any one of
115                // them could have a background image.
116                obj.find('*').addBack().each(function () {
117                    var element = $(this);
118
119                    // If an `img` element, add it. But keep iterating in
120                    // case it has a background image too.
121                    if (element.is('img:has-src') &&
122                        !element.is('[srcset]')) {
123                        allImgs.push({
124                            src: element.attr('src'),
125                            element: element[0]
126                        });
127                    }
128
129                    $.each(hasImgProperties, function (i, property) {
130                        var propertyValue = element.css(property);
131                        var match;
132
133                        // If it doesn't contain this property, skip.
134                        if (!propertyValue) {
135                            return true;
136                        }
137
138                        // Get all url() of this element.
139                        while (match = matchUrl.exec(propertyValue)) {
140                            allImgs.push({
141                                src: match[2],
142                                element: element[0]
143                            });
144                        }
145                    });
146
147                    $.each(hasImageAttributes, function (i, attribute) {
148                        var attributeValue = element.attr(attribute);
149                        var attributeValues;
150
151                        // If it doesn't contain this property, skip.
152                        if (!attributeValue) {
153                            return true;
154                        }
155
156                        allImgs.push({
157                            src: element.attr('src'),
158                            srcset: element.attr('srcset'),
159                            element: element[0]
160                        });
161                    });
162                });
163            } else {
164                // For images only, the task is simpler.
165                obj.find('img:has-src')
166                    .each(function () {
167                    allImgs.push({
168                        src: this.src,
169                        element: this
170                    });
171                });
172            }
173        });
174
175        allImgsLength = allImgs.length;
176        allImgsLoaded = 0;
177
178        // If no images found, don't bother.
179        if (allImgsLength === 0) {
180            finishedCallback.call(originalCollection);
181            deferred.resolveWith(originalCollection);
182        }
183
184        // Now that we've found all imgs in all elements in this,
185        // load them and attach callbacks.
186        $.each(allImgs, function (i, img) {
187
188            var image = new Image();
189            var events =
190              'load.' + eventNamespace + ' error.' + eventNamespace;
191
192            // Handle the image loading and error with the same callback.
193            $(image).one(events, function me (event) {
194                // If an error occurred with loading the image, set the
195                // third argument accordingly.
196                var eachArguments = [
197                    allImgsLoaded,
198                    allImgsLength,
199                    event.type == 'load'
200                ];
201                allImgsLoaded++;
202
203                eachCallback.apply(img.element, eachArguments);
204                deferred.notifyWith(img.element, eachArguments);
205
206                // Unbind the event listeners. I use this in addition to
207                // `one` as one of those events won't be called (either
208                // 'load' or 'error' will be called).
209                $(this).off(events, me);
210
211                if (allImgsLoaded == allImgsLength) {
212                    finishedCallback.call(originalCollection[0]);
213                    deferred.resolveWith(originalCollection[0]);
214                    return false;
215                }
216
217            });
218
219            if (hasSrcset && img.srcset) {
220                image.srcset = img.srcset;
221                image.sizes = img.sizes;
222            }
223            image.src = img.src;
224        });
225
226        return deferred.promise();
227
228    };
229}));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.