vanilla-lib

Vanilla JS library

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

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

  1. /* vanilla-lib */
  2. var mapFlat = ( array,func ) => array.map( x => func(x) ).reduce( (a,b) => a.concat(b) ),
  3. parenth = ( elem,nth ) => traverse(elem, ifndef(nth, 1), 0), //( ! elem ? null : elem.parentNode ),
  4. ifndef = ( expr,value ) => ( ndef(expr) ? value : expr ),
  5. ifnan = ( expr,value ) => ( isNaN(expr) ? value : expr ),
  6. isobj = expr => ( 'object' === typeof expr ),
  7. isarr = expr => ( isobj(expr) && Array === expr.constructor ),
  8. isfn = expr => ( 'function' === typeof expr ),
  9. ndef = expr => ( 'undefined' === typeof expr ),
  10. test = ( expr,func,other ) => ( !! expr ? func(expr) : isfn(other) ? other(expr) : other ),
  11. log = console.debug,
  12. on = ( elem,event,func ) => elem.addEventListener(event, func),
  13. $$ = ( sel,elem ) => Array.slice((elem || document).querySelectorAll(sel)),
  14. $ = ( sel,elem ) => (elem || document).querySelector(sel);
  15.  
  16. var aggRate = ( amount,rate,periods ) => ( ! periods ? amount : aggRate(amount * rate, rate, periods - 1) ),
  17. toDec = expr => ( Math.round(parseFloat((expr +'').replace(/\$|,/g, '')) * 100) / 100 );
  18.  
  19. //Array.prototype.mapFlat = function( func ) { return mapFlat(this, func); };
  20.  
  21.  
  22. function appendTo( element, parent, reference ) {
  23. if ( !! reference ) {
  24. parent = reference.parentNode;
  25. reference = reference.nextSibling;
  26. }
  27.  
  28. if ( !! reference ) {
  29. return prependTo(element, parent, reference);
  30. } else if ( !! parent ) {
  31. parent.append(element);
  32. } else {
  33. console.warn('*** appendTo() could not add element: Neither a parent nor a reference element was provided');
  34. }
  35.  
  36. return element;
  37. }
  38.  
  39. function attr( elem, name, value ) {
  40. if ( isarr(elem) ) {
  41. return elem.map( el => attr(el, name, value) );
  42. }
  43.  
  44. keysAndValues(name, value, ( n,v ) => ( null === v ? elem.removeAttribute(n) : elem.setAttribute(n, v) ) );
  45. return elem;
  46. }
  47.  
  48. function create( html, containerType ) {
  49. let container = null,
  50. result = null,
  51. attrs, style;
  52.  
  53. if ( isobj(containerType) ) {
  54. attrs = containerType.attrs;
  55. style = containerType.style;
  56. containerType = containerType.container;
  57. }
  58.  
  59. containerType = containerType || 'div';
  60. create[ containerType ] =
  61. container = create[ containerType ] || document.createElement(containerType);
  62. container.innerHTML = html;
  63. result = Array.slice(container.childNodes)
  64. .map( elem => (elem.remove(), elem) );
  65.  
  66. if ( !! attrs ) {
  67. attr(result, attrs);
  68. }
  69. if ( !! style ) {
  70. css(result, style);
  71. }
  72.  
  73. if ( 1 == result.length ) {
  74. result = result[ 0 ];
  75. }
  76. return result;
  77. }
  78.  
  79. function css( element, key, value ) {
  80. if ( isarr(element) ) {
  81. return element.map( el => keysAndValues(key, value, ( k,v ) => el.style[ k ] = v ) );
  82. }
  83.  
  84. keysAndValues(key, value, ( k,v ) => element.style[ k ] = v );
  85. return element;
  86. }
  87.  
  88. function keysAndValues( key, value, action ) {
  89. // Case 1: key is an object (and there is no value)
  90. if ( isobj(key) && ndef(value) ) {
  91. return Object.keys(key)
  92. .map( k => action(k, key[ k ]) );
  93. // Case 2: key is an array
  94. } else if ( isarr(key) ) {
  95. // Case 1.a: value is an array of the same length
  96. if ( isarr(value) && key.length === value.length ) {
  97. return key.map( ( k,i ) => action(k, value[ i ]) );
  98. // Case 1.b: value is considered a simple, plain value
  99. } else {
  100. return key.map( k => action(k, value) );
  101. }
  102. // Default Case: key and value considered as simple, plain values
  103. } else {
  104. return action(key, value);
  105. }
  106. }
  107.  
  108. function prependTo( element, parent, reference ) {
  109. if ( ! reference && !! parent ) {
  110. reference = parent.childNodes[ 0 ];
  111. }
  112.  
  113. if ( !! reference ) {
  114. reference.parentNode.insertBefore(element, reference);
  115. } else if ( !! parent ) {
  116. parent.append(element);
  117. } else {
  118. console.warn('*** prependTo() could not add element: Neither a parent nor a reference element was provided');
  119. }
  120.  
  121. return element;
  122. }
  123.  
  124. function toDec2( amount ) {
  125. amount = toDec(amount);
  126. if ( isNaN(amount) ) {
  127. return null;
  128. }
  129. let segs = (amount +'').split('.');
  130. return segs[ 0 ] +'.'+ ((segs[ 1 ] || 0) +'0').slice(0, 2);
  131. }
  132.  
  133. function toMoney( amount ) {
  134. let dec2 = toDec2(amount);
  135. return ( isNaN(dec2) ? null : dec2 < 0 ? '-$ '+ (-dec2) : '$ '+ dec2 );
  136. }
  137.  
  138. function traverse( elem, up, sideways, elementsOnly, lastIfNull ) {
  139. let last = elem;
  140. while ( !! elem && up -- > 0 ) elem = (last = elem, parenth(elem));
  141.  
  142. let prop = ( elementsOnly ? 'Element' : '' ) +'Sibling';
  143. if ( sideways < 0 ) {
  144. while ( !! elem && sideways ++ < 0 ) elem = (last = elem, elem[ 'previous'+ prop ]);
  145. } else if ( sideways > 0 ) {
  146. while ( !! elem && sideways -- > 0 ) elem = (last = elem, elem[ 'next'+ prop ]);
  147. }
  148.  
  149. return ( ! lastIfNull ? elem : elem || last );
  150. }

QingJ © 2025

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