css-class-list.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. 'use strict';
  2. var CSSClassList = function (node) {
  3. this.parentNode = node;
  4. this.classNames = new Set();
  5. const value = node.attributes.class;
  6. if (value != null) {
  7. this.addClassValueHandler();
  8. this.setClassValue(value);
  9. }
  10. };
  11. // attr.class.value
  12. CSSClassList.prototype.addClassValueHandler = function () {
  13. Object.defineProperty(this.parentNode.attributes, 'class', {
  14. get: this.getClassValue.bind(this),
  15. set: this.setClassValue.bind(this),
  16. enumerable: true,
  17. configurable: true,
  18. });
  19. };
  20. CSSClassList.prototype.getClassValue = function () {
  21. var arrClassNames = Array.from(this.classNames);
  22. return arrClassNames.join(' ');
  23. };
  24. CSSClassList.prototype.setClassValue = function (newValue) {
  25. if (typeof newValue === 'undefined') {
  26. this.classNames.clear();
  27. return;
  28. }
  29. var arrClassNames = newValue.split(' ');
  30. this.classNames = new Set(arrClassNames);
  31. };
  32. CSSClassList.prototype.add = function (/* variadic */) {
  33. this.addClassValueHandler();
  34. Object.values(arguments).forEach(this._addSingle.bind(this));
  35. };
  36. CSSClassList.prototype._addSingle = function (className) {
  37. this.classNames.add(className);
  38. };
  39. CSSClassList.prototype.remove = function (/* variadic */) {
  40. this.addClassValueHandler();
  41. Object.values(arguments).forEach(this._removeSingle.bind(this));
  42. };
  43. CSSClassList.prototype._removeSingle = function (className) {
  44. this.classNames.delete(className);
  45. };
  46. CSSClassList.prototype.item = function (index) {
  47. var arrClassNames = Array.from(this.classNames);
  48. return arrClassNames[index];
  49. };
  50. CSSClassList.prototype.toggle = function (className, force) {
  51. if (this.contains(className) || force === false) {
  52. this.classNames.delete(className);
  53. }
  54. this.classNames.add(className);
  55. };
  56. CSSClassList.prototype.contains = function (className) {
  57. return this.classNames.has(className);
  58. };
  59. module.exports = CSSClassList;