[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 YUI.add('yui2-imageloader', function(Y) { 2 var YAHOO = Y.YUI2; 3 /* 4 Copyright (c) 2011, Yahoo! Inc. All rights reserved. 5 Code licensed under the BSD License: 6 http://developer.yahoo.com/yui/license.html 7 version: 2.9.0 8 */ 9 /** 10 * The ImageLoader Utility is a framework to dynamically load images according to certain triggers, 11 * enabling faster load times and a more responsive UI. 12 * 13 * @module imageloader 14 * @namespace YAHOO.util.ImageLoader 15 * @requires yahoo, dom, event 16 */ 17 18 if (typeof(YAHOO.util.ImageLoader) == 'undefined') { 19 YAHOO.util.ImageLoader = {}; 20 } 21 22 /** 23 * A group for images. A group can have one time limit and a series of triggers. Thus the images belonging to this group must share these constraints. 24 * @class YAHOO.util.ImageLoader.group 25 * @requires YAHOO.util.Dom 26 * @requires YAHOO.util.Event 27 * @constructor 28 * @param {String|HTMLElement} trigEl The HTML element id or reference to assign the trigger event to. Can be null for no trigger 29 * @param {String} trigAct The type of event to assign to trigEl. Can be null for no trigger 30 * @param {Number} timeout Timeout (time limit) length, in seconds. Can be undefined, or <= 0, for no time limit 31 */ 32 YAHOO.util.ImageLoader.group = function(trigEl, trigAct, timeout) { 33 /** 34 * Name for the group. Only used to identify the group in logging statements 35 * @property name 36 * @type String 37 */ 38 this.name = 'unnamed'; 39 40 /** 41 * Collection of images registered with this group 42 * @property _imgObjs 43 * @private 44 * @type Object 45 */ 46 this._imgObjs = {}; 47 48 /** 49 * Timeout (time limit) length, in seconds 50 * @property timeoutLen 51 * @type Number 52 */ 53 this.timeoutLen = timeout; 54 55 /** 56 * Timeout object to keep a handle on the time limit 57 * @property _timeout 58 * @private 59 * @type Object 60 */ 61 this._timeout = null; 62 63 /** 64 * Collection of triggers for this group. 65 * Keeps track of each trigger's element, event, and event-listener-callback "fetch" function 66 * @property _triggers 67 * @private 68 * @type Array 69 */ 70 this._triggers = []; 71 72 /** 73 * Collection of custom-event triggers for this group. 74 * Keeps track of each trigger's event object and event-listener-callback "fetch" function 75 * @property _customTriggers 76 * @private 77 * @type Array 78 */ 79 this._customTriggers = []; 80 81 /** 82 * Flag to check if images are above the fold. If foldConditional is true, the group will check each of its image locations at page load. If any part of the image is within the client viewport, the image is displayed immediately 83 * @property foldConditional 84 * @type Boolean 85 */ 86 this.foldConditional = false; 87 88 /** 89 * Class name that will identify images belonging to the group. This class name will be removed from each element in order to fetch images. 90 * This class should have, in its CSS style definition, "background:none !important;" 91 * @property className 92 * @type String 93 */ 94 this.className = null; 95 96 /** 97 * HTML elements having the class name that is associated with this group 98 * Elements are stored during the _foldCheck function and reused later during the fetch function. Gives a slight performance improvement when className and foldConditional are both used 99 * @property _classImageEls 100 * @private 101 * @type Array 102 */ 103 this._classImageEls = null; 104 105 // add a listener to set the time limit on DOM ready 106 // if DOM is already ready, do so immediately 107 if (YAHOO.util.Event.DOMReady) { 108 this._onloadTasks(); 109 } 110 else { 111 YAHOO.util.Event.onDOMReady(this._onloadTasks, this, true); 112 } 113 114 // add the trigger 115 this.addTrigger(trigEl, trigAct); 116 117 }; 118 119 /** 120 * Adds a trigger to the group. Call this with the same style as YAHOO.util.Event.addListener 121 * @method addTrigger 122 * @param {String|HTMLElement} trigEl The HTML element id or reference to assign the trigger event to 123 * @param {String} trigAct The type of event to assign to trigEl 124 */ 125 YAHOO.util.ImageLoader.group.prototype.addTrigger = function(trigEl, trigAct) { 126 if (! trigEl || ! trigAct) { 127 return; 128 } 129 /* Need to wrap the fetch function. Event Util can't distinguish prototyped functions of different instantiations 130 * Leads to this scenario: groupA and groupZ both have window-scroll triggers. groupZ also has a 2-sec timeout (groupA has no timeout). 131 * groupZ's timeout fires; we remove the triggers. The removeListener call finds the first window-scroll event with Y.u.IL.p.fetch, which is groupA's. 132 * groupA's trigger is removed and never fires, leaving images unfetched 133 */ 134 var wrappedFetch = function() { 135 this.fetch(); 136 }; 137 this._triggers.push([trigEl, trigAct, wrappedFetch]); 138 YAHOO.util.Event.addListener(trigEl, trigAct, wrappedFetch, this, true); 139 }; 140 141 /** 142 * Adds a custom event trigger to the group. 143 * @method addCustomTrigger 144 * @param {Object} event A YAHOO.util.CustomEvent object 145 */ 146 YAHOO.util.ImageLoader.group.prototype.addCustomTrigger = function(event) { 147 // make sure we're dealing with a CustomEvent object 148 if (! event || ! event instanceof YAHOO.util.CustomEvent) { 149 return; 150 } 151 152 // see comment in addTrigger() 153 var wrappedFetch = function() { 154 this.fetch(); 155 }; 156 this._customTriggers.push([event, wrappedFetch]); 157 event.subscribe(wrappedFetch, this, true); 158 }; 159 160 /** 161 * Setup to do in the window's onload 162 * Initiates time limit for group; executes the fold check for the images 163 * @method _onloadTasks 164 * @private 165 */ 166 YAHOO.util.ImageLoader.group.prototype._onloadTasks = function() { 167 if (this.timeoutLen && typeof(this.timeoutLen) == 'number' && this.timeoutLen > 0) { 168 this._timeout = setTimeout(this._getFetchTimeout(), this.timeoutLen * 1000); 169 } 170 171 if (this.foldConditional) { 172 this._foldCheck(); 173 } 174 }; 175 176 /** 177 * Returns the group's fetch method, with the proper closure, for use with setTimeout 178 * @method _getFetchTimeout 179 * @return {Function} group's fetch method 180 * @private 181 */ 182 YAHOO.util.ImageLoader.group.prototype._getFetchTimeout = function() { 183 var self = this; 184 return function() { self.fetch(); }; 185 }; 186 187 /** 188 * Registers a background image with the group 189 * @method registerBgImage 190 * @param {String} domId HTML DOM id of the image element 191 * @param {String} url URL for the image 192 * @return {Object} bgImgObj that was registered, for modifying any attributes in the object 193 */ 194 YAHOO.util.ImageLoader.group.prototype.registerBgImage = function(domId, url) { 195 this._imgObjs[domId] = new YAHOO.util.ImageLoader.bgImgObj(domId, url); 196 return this._imgObjs[domId]; 197 }; 198 /** 199 * Registers a src image with the group 200 * @method registerSrcImage 201 * @param {String} domId HTML DOM id of the image element 202 * @param {String} url URL for the image 203 * @param {Int} width pixel width of the image - defaults to image's natural size 204 * @param {Int} height pixel height of the image - defaults to image's natural size 205 * @return {Object} srcImgObj that was registered, for modifying any attributes in the object 206 */ 207 YAHOO.util.ImageLoader.group.prototype.registerSrcImage = function(domId, url, width, height) { 208 this._imgObjs[domId] = new YAHOO.util.ImageLoader.srcImgObj(domId, url, width, height); 209 return this._imgObjs[domId]; 210 }; 211 /** 212 * Registers an alpha-channel-type png background image with the group 213 * @method registerPngBgImage 214 * @param {String} domId HTML DOM id of the image element 215 * @param {String} url URL for the image 216 * @param {Object} ailProps The AlphaImageLoader properties to be set for the image 217 * Valid properties are 'sizingMethod' and 'enabled' 218 * @return {Object} pngBgImgObj that was registered, for modifying any attributes in the object 219 */ 220 YAHOO.util.ImageLoader.group.prototype.registerPngBgImage = function(domId, url, ailProps) { 221 this._imgObjs[domId] = new YAHOO.util.ImageLoader.pngBgImgObj(domId, url, ailProps); 222 return this._imgObjs[domId]; 223 }; 224 225 /** 226 * Displays the images in the group 227 * @method fetch 228 */ 229 YAHOO.util.ImageLoader.group.prototype.fetch = function() { 230 231 var i, len, id; 232 233 clearTimeout(this._timeout); 234 // remove all listeners 235 for (i=0, len = this._triggers.length; i < len; i++) { 236 YAHOO.util.Event.removeListener(this._triggers[i][0], this._triggers[i][1], this._triggers[i][2]); 237 } 238 // remove custom event subscriptions 239 for (i=0, len = this._customTriggers.length; i < len; i++) { 240 this._customTriggers[i][0].unsubscribe(this._customTriggers[i][1], this); 241 } 242 243 // fetch whatever we need to by className 244 this._fetchByClass(); 245 246 // fetch registered images 247 for (id in this._imgObjs) { 248 if (YAHOO.lang.hasOwnProperty(this._imgObjs, id)) { 249 this._imgObjs[id].fetch(); 250 } 251 } 252 }; 253 254 /** 255 * Checks the position of each image in the group. If any part of the image is within the client viewport, shows the image immediately. 256 * @method _foldCheck 257 * @private 258 */ 259 YAHOO.util.ImageLoader.group.prototype._foldCheck = function() { 260 var scrollTop = (document.compatMode != 'CSS1Compat') ? document.body.scrollTop : document.documentElement.scrollTop, 261 viewHeight = YAHOO.util.Dom.getViewportHeight(), 262 hLimit = scrollTop + viewHeight, 263 scrollLeft = (document.compatMode != 'CSS1Compat') ? document.body.scrollLeft : document.documentElement.scrollLeft, 264 viewWidth = YAHOO.util.Dom.getViewportWidth(), 265 wLimit = scrollLeft + viewWidth, 266 id, elPos, i, len; 267 for (id in this._imgObjs) { 268 if (YAHOO.lang.hasOwnProperty(this._imgObjs, id)) { 269 elPos = YAHOO.util.Dom.getXY(this._imgObjs[id].domId); 270 if (elPos[1] < hLimit && elPos[0] < wLimit) { 271 this._imgObjs[id].fetch(); 272 } 273 } 274 } 275 // and by class 276 if (this.className) { 277 this._classImageEls = YAHOO.util.Dom.getElementsByClassName(this.className); 278 for (i=0, len = this._classImageEls.length; i < len; i++) { 279 elPos = YAHOO.util.Dom.getXY(this._classImageEls[i]); 280 if (elPos[1] < hLimit && elPos[0] < wLimit) { 281 YAHOO.util.Dom.removeClass(this._classImageEls[i], this.className); 282 } 283 } 284 } 285 }; 286 287 /** 288 * Finds all elements in the Dom with the class name specified in the group. Removes the class from the element in order to let the style definitions trigger the image fetching 289 * @method _fetchByClass 290 * @private 291 */ 292 YAHOO.util.ImageLoader.group.prototype._fetchByClass = function() { 293 if (! this.className) { 294 return; 295 } 296 297 // this._classImageEls may have been set during _foldCheck 298 if (this._classImageEls === null) { 299 this._classImageEls = YAHOO.util.Dom.getElementsByClassName(this.className); 300 } 301 YAHOO.util.Dom.removeClass(this._classImageEls, this.className); 302 }; 303 304 305 /** 306 * Base class for image objects to be registered with the groups 307 * @class YAHOO.util.ImageLoader.imgObj 308 * @constructor 309 * @param {String} domId HTML DOM id of the image element 310 * @param {String} url URL for the image 311 */ 312 YAHOO.util.ImageLoader.imgObj = function(domId, url) { 313 /** 314 * HTML DOM id of the image element 315 * @property domId 316 * @type String 317 */ 318 this.domId = domId; 319 320 /** 321 * URL for the image 322 * @property url 323 * @type String 324 */ 325 this.url = url; 326 327 /** 328 * Pixel width of the image. Will be set as a "width" attribute after the image is fetched. 329 * Detaults to the natural width of the image. 330 * Only appropriate with src images 331 * @property width 332 * @type Int 333 */ 334 this.width = null; 335 336 /** 337 * Pixel height of the image. Will be set as a "height" attribute after the image is fetched. 338 * Detaults to the natural height of the image. 339 * Only appropriate with src images 340 * @property height 341 * @type Int 342 */ 343 this.height = null; 344 345 /** 346 * Whether the style.visibility should be set to "visible" after the image is fetched. 347 * Used when setting src images as visibility:hidden prior to image fetching 348 * @property setVisible 349 * @type Boolean 350 */ 351 this.setVisible = false; 352 353 /** 354 * Whether the image has already been fetched. In the case of a foldCondional group, keeps track for when the trigger is fired so images aren't fetched twice 355 * @property _fetched 356 * @type Boolean 357 * @private 358 */ 359 this._fetched = false; 360 }; 361 362 /** 363 * Displays the image; puts the URL into the DOM 364 * @method fetch 365 */ 366 YAHOO.util.ImageLoader.imgObj.prototype.fetch = function() { 367 if (this._fetched) { 368 return; 369 } 370 var el = document.getElementById(this.domId); 371 if (! el) { 372 return; 373 } 374 this._applyUrl(el); 375 376 if (this.setVisible) { 377 el.style.visibility = 'visible'; 378 } 379 if (this.width) { 380 el.width = this.width; 381 } 382 if (this.height) { 383 el.height = this.height; 384 } 385 this._fetched = true; 386 }; 387 388 /** 389 * Inserts the image URL into the DOM so that the image is displayed. 390 * Must be overridden by child class 391 * @method _applyUrl 392 * @param {Object} el HTML DOM element 393 * @private 394 */ 395 YAHOO.util.ImageLoader.imgObj.prototype._applyUrl = function(el) { 396 }; 397 398 /** 399 * Background image object. A background image is one whose URL is specified by "background-image" in the element's style 400 * @class YAHOO.util.ImageLoader.bgImgObj 401 * @constructor 402 * @extends YAHOO.util.ImageLoader.imgObj 403 * @param {String} domId HTML DOM id of the image element 404 * @param {String} url URL for the image 405 */ 406 YAHOO.util.ImageLoader.bgImgObj = function(domId, url) { 407 YAHOO.util.ImageLoader.bgImgObj.superclass.constructor.call(this, domId, url); 408 }; 409 410 YAHOO.lang.extend(YAHOO.util.ImageLoader.bgImgObj, YAHOO.util.ImageLoader.imgObj); 411 412 /** 413 * Inserts the image URL into the DOM so that the image is displayed. 414 * Sets style.backgroundImage 415 * @method _applyUrl 416 * @param {Object} el HTML DOM element 417 * @private 418 */ 419 YAHOO.util.ImageLoader.bgImgObj.prototype._applyUrl = function(el) { 420 el.style.backgroundImage = "url('" + this.url + "')"; 421 }; 422 423 /** 424 * Source image object. A source image is one whose URL is specified by a src attribute in the DOM element 425 * @class YAHOO.util.ImageLoader.srcImgObj 426 * @constructor 427 * @extends YAHOO.util.ImageLoader.imgObj 428 * @param {String} domId HTML DOM id of the image element 429 * @param {String} url URL for the image 430 * @param {Int} width pixel width of the image - defaults to image's natural size 431 * @param {Int} height pixel height of the image - defaults to image's natural size 432 */ 433 YAHOO.util.ImageLoader.srcImgObj = function(domId, url, width, height) { 434 YAHOO.util.ImageLoader.srcImgObj.superclass.constructor.call(this, domId, url); 435 this.width = width; 436 this.height = height; 437 }; 438 439 YAHOO.lang.extend(YAHOO.util.ImageLoader.srcImgObj, YAHOO.util.ImageLoader.imgObj); 440 441 /** 442 * Inserts the image URL into the DOM so that the image is displayed. 443 * Sets src 444 * @method _applyUrl 445 * @param {Object} el HTML DOM element 446 * @private 447 */ 448 YAHOO.util.ImageLoader.srcImgObj.prototype._applyUrl = function(el) { 449 el.src = this.url; 450 }; 451 452 /** 453 * PNG background image object. A PNG background image is one whose URL is specified through AlphaImageLoader or by "background-image" in the element's style 454 * @class YAHOO.util.ImageLoader.pngBgImgObj 455 * @constructor 456 * @extends YAHOO.util.ImageLoader.imgObj 457 * @param {String} domId HTML DOM id of the image element 458 * @param {String} url URL for the image 459 * @param {Object} ailProps The AlphaImageLoader properties to be set for the image 460 * Valid properties are 'sizingMethod' and 'enabled' 461 */ 462 YAHOO.util.ImageLoader.pngBgImgObj = function(domId, url, ailProps) { 463 YAHOO.util.ImageLoader.pngBgImgObj.superclass.constructor.call(this, domId, url); 464 465 /** 466 * AlphaImageLoader properties to be set for the image. 467 * Valid properties are "sizingMethod" and "enabled". 468 * @property props 469 * @type Object 470 */ 471 this.props = ailProps || {}; 472 }; 473 474 YAHOO.lang.extend(YAHOO.util.ImageLoader.pngBgImgObj, YAHOO.util.ImageLoader.imgObj); 475 476 /** 477 * Inserts the image URL into the DOM so that the image is displayed. 478 * If the browser is determined to be IE6 (or older), sets the AlphaImageLoader src; otherwise sets style.backgroundImage 479 * @method _applyUrl 480 * @param {Object} el HTML DOM element 481 * @private 482 */ 483 YAHOO.util.ImageLoader.pngBgImgObj.prototype._applyUrl = function(el) { 484 if (YAHOO.env.ua.ie && YAHOO.env.ua.ie <= 6) { 485 var sizingMethod = (YAHOO.lang.isUndefined(this.props.sizingMethod)) ? 'scale' : this.props.sizingMethod, 486 enabled = (YAHOO.lang.isUndefined(this.props.enabled)) ? 'true' : this.props.enabled; 487 el.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + this.url + '", sizingMethod="' + sizingMethod + '", enabled="' + enabled + '")'; 488 } 489 else { 490 el.style.backgroundImage = "url('" + this.url + "')"; 491 } 492 }; 493 YAHOO.register("imageloader", YAHOO.util.ImageLoader, {version: "2.9.0", build: "2800"}); 494 495 }, '2.9.0' ,{"requires": ["yui2-yahoo", "yui2-dom", "yui2-event"]});
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |