dropdown.js 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. function p5UI__dropdown(e, n, position, render) {// @position = ('right top', 'left top', 'left bottom', 'right bottom')
  2. // e.stopPropagation()
  3. // e.preventDefault()
  4. var btnNode = n
  5. var node = n.nextSibling
  6. node.classList.toggle('p5UI__dropdown-show')
  7. // console.log('>>> p5UI__dropdown...', {btnNode: btnNode, node: node, 'has show class': node.classList.contains('p5UI__dropdown-show')})
  8. var position = position
  9. if (node.classList.contains('p5UI__dropdown-show')) {
  10. switch (position) {
  11. case 'right top': node.style.bottom = '50px'; node.style.right = '100px'; break; // TODO ...
  12. case 'left top': node.style.top = 0; node.style.left = '100px'; break; // TODO ...
  13. case 'right bottom': node.style.left = '' + btnNode.offsetWidth + 'px'; node.style.top = 0; break; // TODO ...
  14. case 'left bottom': node.style.right = '' + btnNode.offsetWidth + 'px'; node.style.top = 0; break;
  15. }
  16. node.p5UI__onClickOutsideCallback = p5UI__dropdown__onClickOutsideCallback(node, btnNode)
  17. node.p5UI__unbindClickOutsideCallback = p5UI__dropdown__unbindClickOutsideCallback(node)
  18. if (!document.addEventListener && document.attachEvent) {
  19. document.attachEvent('onclick', node.p5UI__onClickOutsideCallback);
  20. // document.attachEvent('keydown', this._closeModalKorespInfoIfHitEscape);
  21. } else {
  22. document.addEventListener('click', node.p5UI__onClickOutsideCallback);
  23. // document.addEventListener('keydown', this._closeModalKorespInfoIfHitEscape);
  24. }
  25. if ('function' === typeof render) render(n, node)
  26. // node.firstChild.focus() // TODO: find input
  27. } else {
  28. if ('function' === typeof node.p5UI__unbindClickOutsideCallback) {
  29. node.p5UI__unbindClickOutsideCallback()
  30. delete node.p5UI__onClickOutsideCallback
  31. delete node.p5UI__unbindClickOutsideCallback
  32. }
  33. }
  34. }
  35. function p5UI__dropdown__unbindClickOutsideCallback(n) {
  36. var node = n
  37. return function __p5UI__dropdown__unbindClickOutsideCallback(e) {
  38. // console.log('p5UI__dropdown__unbindClickOutsideCallback', {
  39. // 'opened': node.classList.contains('p5UI__dropdown-show'),
  40. // 'node': node,
  41. // 'typeof node.p5UI__onClickOutsideCallback': typeof node.p5UI__onClickOutsideCallback
  42. // })
  43. // console.trace()
  44. if (!document.removeEventListener && document.detachEvent) {
  45. document.detachEvent('onclick', node.p5UI__onClickOutsideCallback)
  46. // document.detachEvent('keydown', this._closeModalKorespInfoIfHitEscape)
  47. } else {
  48. document.removeEventListener('click', node.p5UI__onClickOutsideCallback)
  49. // document.removeEventListener('keydown', this._closeModalKorespInfoIfHitEscape)
  50. }
  51. }
  52. }
  53. function p5UI__dropdown__onClickOutsideCallback(n, btn) {
  54. var node = n
  55. var btnNode = btn
  56. // console.log('define p5UI__dropdown__onClickOutsideCallback...')
  57. return function __p5UI__dropdown__onClickOutsideCallback(e) {
  58. // console.log('p5UI__dropdown__onClickOutsideCallback', {
  59. // 'opened': node.classList.contains('p5UI__dropdown-show'),
  60. // 'clickedOutside(node)': p5UI__clickedOutsideElement(node, e),
  61. // 'clickedOutside(btnNode)': p5UI__clickedOutsideElement(btnNode, e),
  62. // 'typeof node.p5UI__onClickOutsideCallback': typeof node.p5UI__onClickOutsideCallback,
  63. // 'typeof node.p5UI__unbindClickOutsideCallback': typeof node.p5UI__unbindClickOutsideCallback,
  64. // })
  65. if (!node.classList.contains('p5UI__dropdown-show')) return
  66. if (node.p5UI__unbindClickOutsideCallback && 'function' == typeof node.p5UI__unbindClickOutsideCallback) {
  67. if (p5UI__clickedOutsideElement(node, e) && p5UI__clickedOutsideElement(btnNode, e)) {
  68. node.classList.remove('p5UI__dropdown-show')
  69. node.p5UI__unbindClickOutsideCallback()
  70. }
  71. }
  72. }
  73. }
  74. global.p5UI__dropdown = p5UI__dropdown
  75. global.p5UI__dropdown__unbindClickOutsideCallback = p5UI__dropdown__unbindClickOutsideCallback
  76. global.p5UI__dropdown__onClickOutsideCallback = p5UI__dropdown__onClickOutsideCallback