You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

83 lines
2.2 KiB

  1. /**
  2. * --------------------------------------------------------------------------
  3. * Bootstrap (v5.1.3): dom/manipulator.js
  4. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
  5. * --------------------------------------------------------------------------
  6. */
  7. define([], function() {
  8. 'use strict';
  9. function normalizeData(val) {
  10. if (val === 'true') {
  11. return true
  12. }
  13. if (val === 'false') {
  14. return false
  15. }
  16. if (val === Number(val).toString()) {
  17. return Number(val)
  18. }
  19. if (val === '' || val === 'null') {
  20. return null
  21. }
  22. return val
  23. }
  24. function normalizeDataKey(key) {
  25. return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)
  26. }
  27. return {
  28. setDataAttribute: function(element, key, value) {
  29. element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)
  30. },
  31. removeDataAttribute: function(element, key) {
  32. element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)
  33. },
  34. getDataAttributes: function(element) {
  35. if (!element) {
  36. return {}
  37. }
  38. const attributes = {}
  39. Object.keys(element.dataset)
  40. .filter(key => key.startsWith('bs'))
  41. .forEach(key => {
  42. let pureKey = key.replace(/^bs/, '')
  43. pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)
  44. attributes[pureKey] = normalizeData(element.dataset[key])
  45. })
  46. return attributes
  47. },
  48. getDataAttribute: function(element, key) {
  49. return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))
  50. },
  51. offset: function(element) {
  52. const rect = element.getBoundingClientRect()
  53. return {
  54. top: rect.top + window.pageYOffset,
  55. left: rect.left + window.pageXOffset
  56. }
  57. },
  58. position: function(element) {
  59. return {
  60. top: element.offsetTop,
  61. left: element.offsetLeft
  62. }
  63. }
  64. }
  65. });