dom.js 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { toArray } from '@antv/util';
  2. import { SHAPE_TO_TAGS } from '../constant';
  3. /**
  4. * 创建并返回图形的 svg 元素
  5. * @param type svg类型
  6. */
  7. export function createSVGElement(type) {
  8. return document.createElementNS('http://www.w3.org/2000/svg', type);
  9. }
  10. /**
  11. * 创建并返回图形的 dom 元素
  12. * @param {IShape} shape 图形
  13. * @return {SVGElement}
  14. */
  15. export function createDom(shape) {
  16. var type = SHAPE_TO_TAGS[shape.type];
  17. var parent = shape.getParent();
  18. if (!type) {
  19. throw new Error("the type " + shape.type + " is not supported by svg");
  20. }
  21. var element = createSVGElement(type);
  22. if (shape.get('id')) {
  23. element.id = shape.get('id');
  24. }
  25. shape.set('el', element);
  26. shape.set('attrs', {});
  27. // 对于 defs 下的 dom 节点,parent 为空,通过 context 统一挂载到 defs 节点下
  28. if (parent) {
  29. var parentNode = parent.get('el');
  30. if (parentNode) {
  31. parentNode.appendChild(element);
  32. }
  33. else {
  34. // parentNode maybe null for group
  35. parentNode = parent.createDom();
  36. parent.set('el', parentNode);
  37. parentNode.appendChild(element);
  38. }
  39. }
  40. return element;
  41. }
  42. /**
  43. * 对 dom 元素进行排序
  44. * @param {IElement} element 元素
  45. * @param {sorter} function 排序函数
  46. */
  47. export function sortDom(element, sorter) {
  48. var el = element.get('el');
  49. var childList = toArray(el.children).sort(sorter);
  50. // create empty fragment
  51. var fragment = document.createDocumentFragment();
  52. childList.forEach(function (child) {
  53. fragment.appendChild(child);
  54. });
  55. el.appendChild(fragment);
  56. }
  57. /**
  58. * 将 dom 元素移动到父元素下的指定位置
  59. * @param {SVGElement} element dom 元素
  60. * @param {number} targetIndex 目标位置(从 0 开始)
  61. */
  62. export function moveTo(element, targetIndex) {
  63. var parentNode = element.parentNode;
  64. var siblings = Array.from(parentNode.childNodes).filter(
  65. // 要求为元素节点,且不能为 defs 节点
  66. function (node) { return node.nodeType === 1 && node.nodeName.toLowerCase() !== 'defs'; });
  67. // 获取目标节点
  68. var target = siblings[targetIndex];
  69. var currentIndex = siblings.indexOf(element);
  70. // 如果目标节点存在
  71. if (target) {
  72. // 当前索引 > 目标索引,直接插入到目标节点之前即可
  73. if (currentIndex > targetIndex) {
  74. parentNode.insertBefore(element, target);
  75. }
  76. else if (currentIndex < targetIndex) {
  77. // 当前索引 < 目标索引
  78. // 获取目标节点的下一个节点
  79. var targetNext = siblings[targetIndex + 1];
  80. // 如果目标节点的下一个节点存在,插入到该节点之前
  81. if (targetNext) {
  82. parentNode.insertBefore(element, targetNext);
  83. }
  84. else {
  85. // 如果该节点不存在,则追加到末尾
  86. parentNode.appendChild(element);
  87. }
  88. }
  89. }
  90. else {
  91. parentNode.appendChild(element);
  92. }
  93. }
  94. //# sourceMappingURL=dom.js.map