vanilla-lib

Vanilla JS library

当前为 2018-06-15 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.gf.qytechs.cn/scripts/369430/605962/vanilla-lib.js

  1. /* vanilla-lib */
  2. function VanillaLibScope( ) {
  3. this.mapFlat = ( array,func ) => array.map( x => func(x) ).reduce( (a,b) => a.concat(b) );
  4. this.parenth = ( elem,nth ) => traverse(elem, this.ifndef(nth, 1), 0);
  5. this.ifndef = ( expr,value ) => ( this.ndef(expr) ? value : expr );
  6. this.ispojo = expr => this.isobj(expr, Object);
  7. this.export = ( source,target,members ) => ( Object.keys(source).filter( key => ! members || members.includes(key) )
  8. .forEach( key => target[ key ] = source[ key ] ) );
  9. this.ifnan = ( expr,value ) => ( isNaN(expr) ? value : expr );
  10. this.isobj = ( expr,type ) => ( 'object' === typeof expr && ( ! type || this.isfn(expr.constructor)
  11. && type === ( this.isfn(type) ? expr.constructor : expr.constructor.name ) ) );
  12. this.isarr = expr => this.isobj(expr, Array);
  13. this.isstr = expr => ( 'string' === typeof expr );
  14. this.isfn = expr => ( 'function' === typeof expr );
  15. this.ndef = expr => ( 'undefined' === typeof expr );
  16. this.test = ( expr,func,other ) => ( !! expr ? func(expr) : this.isfn(other) ? other(expr) : other );
  17. this.fire = ( elem,event,args ) => elem.dispatchEvent( this.isobj(event) ? even
  18. : new Event( event, this.ifndef(args, { 'bubbles':true, 'cancelable':true }) ) );
  19. this.warn = console.warn;
  20. this.log = console.debug;
  21. this.on = ( elem,event,func ) => elem.addEventListener(event, func);
  22. this.$$ = ( sel,elem ) => Array.slice((elem || document).querySelectorAll(sel));
  23. this.$ = ( sel,elem ) => (elem || document).querySelector(sel);
  24.  
  25. this.aggRate = ( amount,rate,periods ) => ( ! periods ? amount : this.aggRate(amount * rate, rate, periods - 1) ),
  26. this.toDec = expr => ( Math.round(parseFloat((expr +'').replace(/\$|,/g, '')) * 100) / 100 );
  27.  
  28.  
  29. this.appendTo = function( element, parent, reference ) {
  30. if ( !! reference ) {
  31. parent = reference.parentNode;
  32. reference = reference.nextSibling;
  33. }
  34.  
  35. if ( !! reference ) {
  36. return this.prependTo(element, parent, reference);
  37. } else if ( !! parent ) {
  38. parent.append(element);
  39. } else {
  40. this.warn('*** appendTo() could not add element: No parent or reference element provided');
  41. }
  42.  
  43. return element;
  44. };
  45.  
  46. this.attr = function( elem, name, value ) {
  47. if ( this.isarr(elem) ) {
  48. return elem.map( el => this.attr(el, name, value) );
  49. }
  50.  
  51. this.keysAndValues(name, value, ( n,v ) => ( null === v ? elem.removeAttribute(n) : elem.setAttribute(n, v) ) );
  52. return elem;
  53. };
  54.  
  55. this.create = function( html, containerType ) {
  56. let container = null,
  57. result = null,
  58. attrs, style;
  59.  
  60. if ( this.isobj(containerType) ) {
  61. attrs = containerType.attrs;
  62. style = containerType.style;
  63. containerType = containerType.container;
  64. }
  65.  
  66. containerType = containerType || 'div';
  67. create[ containerType ] =
  68. container = create[ containerType ] || document.createElement(containerType);
  69. container.innerHTML = html;
  70. result = Array.slice(container.childNodes)
  71. .map( elem => (elem.remove(), elem) );
  72.  
  73. if ( !! attrs ) {
  74. this.attr(result, attrs);
  75. }
  76. if ( !! style ) {
  77. this.css(result, style);
  78. }
  79.  
  80. if ( 1 == result.length ) {
  81. result = result[ 0 ];
  82. }
  83. return result;
  84. };
  85.  
  86. this.css = function( element, key, value ) {
  87. if ( isarr(element) ) {
  88. return element.map( el => css(el, key, value) );
  89. }
  90.  
  91. keysAndValues(key, value, ( k,v ) => element.style[ k ] = v );
  92. return element;
  93. };
  94.  
  95. this.keysAndValues = function( key, value, action ) {
  96. // Case 1: key is an object (and there is no value)
  97. if ( this.isobj(key) && ! value ) {
  98. return Object.keys(key)
  99. .map( k => action(k, key[ k ]) );
  100. // Case 2: key is an array
  101. } else if ( this.isarr(key) ) {
  102. // Case 1.a: value is an array of the same length
  103. if ( this.isarr(value) && key.length === value.length ) {
  104. return key.map( ( k,i ) => action(k, value[ i ]) );
  105. // Case 1.b: value is considered a simple, plain value
  106. } else {
  107. return key.map( k => action(k, value) );
  108. }
  109. // Default Case: key and value considered as simple, plain values
  110. } else {
  111. return action(key, value);
  112. }
  113. };
  114.  
  115. this.prependTo = function( element, parent, reference ) {
  116. if ( ! reference && !! parent ) {
  117. reference = parent.childNodes[ 0 ];
  118. }
  119.  
  120. if ( !! reference ) {
  121. reference.parentNode.insertBefore(element, reference);
  122. } else if ( !! parent ) {
  123. parent.append(element);
  124. } else {
  125. this.warn('*** prependTo() could not add element: No parent or reference element provided');
  126. }
  127.  
  128. return element;
  129. };
  130.  
  131. this.toDec2 = function( amount ) {
  132. amount = this.toDec(amount);
  133. if ( isNaN(amount) ) {
  134. return null;
  135. }
  136. let segs = (amount +'').split('.');
  137. return segs[ 0 ] +'.'+ ((segs[ 1 ] || 0) +'0').slice(0, 2);
  138. };
  139.  
  140. this.toMoney = function( amount ) {
  141. let dec2 = this.toDec2(amount);
  142. return ( isNaN(dec2) ? null : dec2 < 0 ? '-$ '+ (-dec2) : '$ '+ dec2 );
  143. };
  144.  
  145. this.traverse = function( elem, up, sideways, elementsOnly, lastIfNull ) {
  146. let last = elem;
  147. while ( !! elem && up -- > 0 ) elem = (last = elem, elem.parentNode);
  148.  
  149. let prop = ( elementsOnly ? 'Element' : '' ) +'Sibling';
  150. if ( sideways < 0 ) {
  151. while ( !! elem && sideways ++ < 0 ) elem = (last = elem, elem[ 'previous'+ prop ]);
  152. } else if ( sideways > 0 ) {
  153. while ( !! elem && sideways -- > 0 ) elem = (last = elem, elem[ 'next'+ prop ]);
  154. }
  155.  
  156. return ( ! lastIfNull ? elem : elem || last );
  157. };
  158.  
  159.  
  160. this.copyMembers = function( source, target, members, preserve ) {
  161. //this.log('* Copying from', source, '\n\tto', target, '\n\t'+ members, preserve);
  162. if ( ! this.isobj(source) || ! this.isobj(target) ) {
  163. this.warn('=> Cannot copy from/to non-objects');
  164. return false;
  165. }
  166.  
  167. let names = Object.keys(source);
  168. preserve = ( this.isobj(preserve) ? preserve : false );
  169. //this.log('- Full list of members:', names);
  170.  
  171. if ( this.isstr(members) ) {
  172. members = members.split(',').map( nm => nm.trim() );
  173. }
  174. if ( this.isarr(members) ) {
  175. //this.log('* Member filter:', members);
  176. names = names.filter( nm => members.includes(nm) );
  177. } else if ( this.isfn(members) ) {
  178. names = names.filter(members);
  179. }
  180. //this.log('- Filtered list of members:', names);
  181.  
  182. names.forEach( nm => {
  183. if ( !! target[ nm ] && !! preserve ) {
  184. preserve[ nm ] = target[ nm ];
  185. }
  186. target[ nm ] = source[ nm ];
  187. //this.log('- Target members', nm, target[ nm ]);
  188. } );
  189. //this.log('=>', target);
  190. return (preserve || target);
  191. };
  192.  
  193. this.export = function( scope, members, overwriten ) {
  194. if ( ! scope ) {
  195. return false;
  196. }
  197. return this.copyMembers(this, scope, members, overwriten);
  198. };
  199. }

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址