support-detail.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. document.body.classList.add('support-nav-light');
  2. (function () {
  3. var bindTabs = function (containerSelector, tabSelector, panelSelector, activeClass) {
  4. var containers = Array.prototype.slice.call(document.querySelectorAll(containerSelector));
  5. containers.forEach(function (container) {
  6. var tabs = Array.prototype.slice.call(container.querySelectorAll(tabSelector));
  7. if (!tabs.length) return;
  8. var panelScope = container.parentElement || document;
  9. var panels = Array.prototype.slice.call(panelScope.querySelectorAll(panelSelector));
  10. tabs.forEach(function (tab) {
  11. tab.addEventListener('click', function () {
  12. var targetId = tab.getAttribute('data-target');
  13. tabs.forEach(function (item) {
  14. item.classList.remove(activeClass);
  15. if (item.hasAttribute('aria-selected')) {
  16. item.setAttribute('aria-selected', 'false');
  17. }
  18. });
  19. panels.forEach(function (panel) {
  20. var matched = panel.id === targetId;
  21. panel.classList.toggle(activeClass, matched);
  22. if (matched) {
  23. panel.removeAttribute('hidden');
  24. } else {
  25. panel.setAttribute('hidden', 'hidden');
  26. }
  27. });
  28. tab.classList.add(activeClass);
  29. if (tab.hasAttribute('aria-selected')) {
  30. tab.setAttribute('aria-selected', 'true');
  31. }
  32. });
  33. });
  34. });
  35. };
  36. bindTabs('.support-detail-main', '.support-detail-tab', '.support-detail-panel', 'is-active');
  37. Array.prototype.slice.call(document.querySelectorAll('.support-detail-panel')).forEach(function (panel) {
  38. var subtabWrap = panel.querySelector('.support-detail-subtabs');
  39. if (!subtabWrap) return;
  40. var subtabs = Array.prototype.slice.call(subtabWrap.querySelectorAll('.support-detail-subtab'));
  41. var subpanels = Array.prototype.slice.call(panel.querySelectorAll('.support-detail-subpanel'));
  42. subtabs.forEach(function (subtab) {
  43. subtab.addEventListener('click', function () {
  44. var targetId = subtab.getAttribute('data-target');
  45. subtabs.forEach(function (item) {
  46. item.classList.remove('is-active');
  47. });
  48. subpanels.forEach(function (subpanel) {
  49. var matched = subpanel.id === targetId;
  50. subpanel.classList.toggle('is-active', matched);
  51. if (matched) {
  52. subpanel.removeAttribute('hidden');
  53. } else {
  54. subpanel.setAttribute('hidden', 'hidden');
  55. }
  56. });
  57. subtab.classList.add('is-active');
  58. });
  59. });
  60. });
  61. var setupCollapsible = function (root) {
  62. if (!root) return;
  63. var groups = Array.prototype.slice.call(root.querySelectorAll('[data-collapsible]'));
  64. groups.forEach(function (group) {
  65. var visibleCount = parseInt(group.getAttribute('data-visible-count') || '0', 10);
  66. var items = Array.prototype.slice.call(group.children).filter(function (node) {
  67. return node.nodeType === 1;
  68. });
  69. var wrap = group.nextElementSibling;
  70. var button = wrap && wrap.classList.contains('support-more-wrap') ? wrap.querySelector('.support-more-btn') : null;
  71. items.forEach(function (item, index) {
  72. item.classList.toggle('support-collapsed-item', visibleCount > 0 && index >= visibleCount);
  73. });
  74. if (button && wrap) {
  75. var hasMore = visibleCount > 0 && items.length > visibleCount;
  76. var moreText = button.getAttribute('data-more-text') || '查看更多';
  77. var lessText = button.getAttribute('data-less-text') || '收起更多';
  78. wrap.hidden = !hasMore;
  79. button.textContent = moreText;
  80. button.onclick = function () {
  81. var expanded = group.classList.toggle('is-expanded');
  82. items.forEach(function (item, index) {
  83. if (visibleCount > 0 && index >= visibleCount) {
  84. item.classList.toggle('support-collapsed-item', !expanded);
  85. }
  86. });
  87. button.textContent = expanded ? lessText : moreText;
  88. };
  89. }
  90. });
  91. };
  92. Array.prototype.slice.call(document.querySelectorAll('.support-detail-panel')).forEach(function (panel) {
  93. setupCollapsible(panel);
  94. });
  95. })();