/js/src/dom/manipulator.js

https://github.com/garnu/bootstrap · JavaScript · 90 lines · 65 code · 19 blank · 6 comment · 9 complexity · 2bd5e7c1c446d9433273086d67751c3b MD5 · raw file

  1. /**
  2. * --------------------------------------------------------------------------
  3. * Bootstrap (v4.3.1): dom/manipulator.js
  4. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  5. * --------------------------------------------------------------------------
  6. */
  7. function normalizeData(val) {
  8. if (val === 'true') {
  9. return true
  10. }
  11. if (val === 'false') {
  12. return false
  13. }
  14. if (val === Number(val).toString()) {
  15. return Number(val)
  16. }
  17. if (val === '' || val === 'null') {
  18. return null
  19. }
  20. return val
  21. }
  22. function normalizeDataKey(key) {
  23. return key.replace(/[A-Z]/g, chr => chr.toLowerCase())
  24. }
  25. const Manipulator = {
  26. setDataAttribute(element, key, value) {
  27. element.setAttribute(`data-${normalizeDataKey(key)}`, value)
  28. },
  29. removeDataAttribute(element, key) {
  30. element.removeAttribute(`data-${normalizeDataKey(key)}`)
  31. },
  32. getDataAttributes(element) {
  33. if (!element) {
  34. return {}
  35. }
  36. const attributes = {
  37. ...element.dataset
  38. }
  39. Object.keys(attributes).forEach(key => {
  40. attributes[key] = normalizeData(attributes[key])
  41. })
  42. return attributes
  43. },
  44. getDataAttribute(element, key) {
  45. return normalizeData(element.getAttribute(`data-${normalizeDataKey(key)}`))
  46. },
  47. offset(element) {
  48. const rect = element.getBoundingClientRect()
  49. return {
  50. top: rect.top + document.body.scrollTop,
  51. left: rect.left + document.body.scrollLeft
  52. }
  53. },
  54. position(element) {
  55. return {
  56. top: element.offsetTop,
  57. left: element.offsetLeft
  58. }
  59. },
  60. toggleClass(element, className) {
  61. if (!element) {
  62. return
  63. }
  64. if (element.classList.contains(className)) {
  65. element.classList.remove(className)
  66. } else {
  67. element.classList.add(className)
  68. }
  69. }
  70. }
  71. export default Manipulator