access.js 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. define( [
  2. "../core"
  3. ], function( jQuery ) {
  4. "use strict";
  5. // Multifunctional method to get and set values of a collection
  6. // The value/s can optionally be executed if it's a function
  7. var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
  8. var i = 0,
  9. len = elems.length,
  10. bulk = key == null;
  11. // Sets many values
  12. if ( jQuery.type( key ) === "object" ) {
  13. chainable = true;
  14. for ( i in key ) {
  15. access( elems, fn, i, key[ i ], true, emptyGet, raw );
  16. }
  17. // Sets one value
  18. } else if ( value !== undefined ) {
  19. chainable = true;
  20. if ( !jQuery.isFunction( value ) ) {
  21. raw = true;
  22. }
  23. if ( bulk ) {
  24. // Bulk operations run against the entire set
  25. if ( raw ) {
  26. fn.call( elems, value );
  27. fn = null;
  28. // ...except when executing function values
  29. } else {
  30. bulk = fn;
  31. fn = function( elem, key, value ) {
  32. return bulk.call( jQuery( elem ), value );
  33. };
  34. }
  35. }
  36. if ( fn ) {
  37. for ( ; i < len; i++ ) {
  38. fn(
  39. elems[ i ], key, raw ?
  40. value :
  41. value.call( elems[ i ], i, fn( elems[ i ], key ) )
  42. );
  43. }
  44. }
  45. }
  46. return chainable ?
  47. elems :
  48. // Gets
  49. bulk ?
  50. fn.call( elems ) :
  51. len ? fn( elems[ 0 ], key ) : emptyGet;
  52. };
  53. return access;
  54. } );