dom.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. class DomManager {
  2. el = undefined
  3. constructor(el) {
  4. this.el = el
  5. }
  6. traversals = {
  7. 'first': 'firstElementChild',
  8. 'next': 'nextElementSibling',
  9. 'parent': 'parentElement',
  10. }
  11. nodes() {
  12. this.traversals = {
  13. 'first': 'firstChild',
  14. 'next': 'nextSibling',
  15. 'parent': 'parentNode',
  16. }; return this
  17. }
  18. first() {
  19. return this.teleportTo(this.el[this.traversals['first']])
  20. }
  21. next() {
  22. return this.teleportTo(this.teleportBack(this.el[this.traversals['next']]))
  23. }
  24. before(insertee) {
  25. this.el[this.traversals['parent']].insertBefore(insertee, this.el); return insertee
  26. }
  27. replace(replacement) {
  28. this.el[this.traversals['parent']].replaceChild(replacement, this.el); return replacement
  29. }
  30. append(appendee) {
  31. this.el.appendChild(appendee); return appendee
  32. }
  33. teleportTo(el) {
  34. if (! el) return el
  35. if (el._x_teleport) return el._x_teleport
  36. return el
  37. }
  38. teleportBack(el) {
  39. if (! el) return el
  40. if (el._x_teleportBack) return el._x_teleportBack
  41. return el
  42. }
  43. }
  44. export function dom(el) {
  45. return new DomManager(el)
  46. }
  47. export function createElement(html) {
  48. return document.createRange().createContextualFragment(html).firstElementChild
  49. }
  50. export function textOrComment(el) {
  51. return el.nodeType === 3
  52. || el.nodeType === 8
  53. }