class.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. const rclass = /[\t\r\n\f]/g;
  2. const rnotwhite = /\S+/g;
  3. const fillSpaces = (str) => ` ${str} `;
  4. export function getClass(elem) {
  5. return (elem && elem.getAttribute && elem.getAttribute('class')) || '';
  6. }
  7. export function hasClass(elem, selector) {
  8. if (elem == null || selector == null) {
  9. return false;
  10. }
  11. const classNames = fillSpaces(getClass(elem));
  12. const className = fillSpaces(selector);
  13. return elem.nodeType === 1
  14. ? classNames.replace(rclass, ' ').includes(className)
  15. : false;
  16. }
  17. export function addClass(elem, selector) {
  18. if (elem == null || selector == null) {
  19. return;
  20. }
  21. if (typeof selector === 'function') {
  22. return addClass(elem, selector(getClass(elem)));
  23. }
  24. if (typeof selector === 'string' && elem.nodeType === 1) {
  25. const classes = selector.match(rnotwhite) || [];
  26. const oldValue = fillSpaces(getClass(elem)).replace(rclass, ' ');
  27. let newValue = classes.reduce((memo, cls) => {
  28. if (memo.indexOf(fillSpaces(cls)) < 0) {
  29. return `${memo}${cls} `;
  30. }
  31. return memo;
  32. }, oldValue);
  33. newValue = newValue.trim();
  34. if (oldValue !== newValue) {
  35. elem.setAttribute('class', newValue);
  36. }
  37. }
  38. }
  39. export function removeClass(elem, selector) {
  40. if (elem == null) {
  41. return;
  42. }
  43. if (typeof selector === 'function') {
  44. return removeClass(elem, selector(getClass(elem)));
  45. }
  46. if ((!selector || typeof selector === 'string') && elem.nodeType === 1) {
  47. const classes = (selector || '').match(rnotwhite) || [];
  48. const oldValue = fillSpaces(getClass(elem)).replace(rclass, ' ');
  49. let newValue = classes.reduce((memo, cls) => {
  50. const className = fillSpaces(cls);
  51. if (memo.indexOf(className) > -1) {
  52. return memo.replace(className, ' ');
  53. }
  54. return memo;
  55. }, oldValue);
  56. newValue = selector ? newValue.trim() : '';
  57. if (oldValue !== newValue) {
  58. elem.setAttribute('class', newValue);
  59. }
  60. }
  61. }
  62. export function toggleClass(elem, selector, stateVal) {
  63. if (elem == null || selector == null) {
  64. return;
  65. }
  66. if (stateVal != null && typeof selector === 'string') {
  67. stateVal ? addClass(elem, selector) : removeClass(elem, selector);
  68. return;
  69. }
  70. if (typeof selector === 'function') {
  71. return toggleClass(elem, selector(getClass(elem), stateVal), stateVal);
  72. }
  73. if (typeof selector === 'string') {
  74. const metches = selector.match(rnotwhite) || [];
  75. metches.forEach((cls) => {
  76. hasClass(elem, cls) ? removeClass(elem, cls) : addClass(elem, cls);
  77. });
  78. }
  79. }
  80. //# sourceMappingURL=class.js.map