message.js 3.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. Object.defineProperty(Object.prototype, "Error", {
  2. value: null,
  3. enumerable: false,
  4. });
  5. const NotifyBuild = (function () {
  6. // локальная область видимости (приватные поля и методы)
  7. /**
  8. * Задержка в миллисекундах перед удалением элемента (сообщения) при клике (должен совпадать с классом removing, в котором происходит анимация исчезновения (transition opacity))
  9. */
  10. const HARDREMOVE_TIME = 100;
  11. /**
  12. * Задержка в миллисекундах перед удалением элемента (сообщения) при автоматическом исчезновении (должен совпадать с классом removing-long, в котором происходит анимация исчезновения (transition opacity))
  13. */
  14. const AUTOREMOVE_TIME = 2000;
  15. const REMOVING_SHORT = "short";
  16. const REMOVING_LONG = "long";
  17. /**
  18. * Счётчик ID для создаваемых сообщений
  19. */
  20. let MESSAGE_COUNTER = -1;
  21. /**
  22. * Удаляет сообщение (или другой элемент, к которому было привязано данное событие)
  23. * @param {Number} time время, через которое сообщение будет удалено из DOM (в миллисекундах)
  24. */
  25. const removeMessage = function (time = HARDREMOVE_TIME, transition = REMOVING_SHORT) {
  26. this.classList.add("removing", transition);
  27. setTimeout(
  28. function ($elem) {
  29. $elem.remove();
  30. },
  31. time,
  32. this
  33. );
  34. };
  35. /**
  36. * Для автоматического удаления сообщений, вызывается в setTimeout во время создания текущего сообщения
  37. */
  38. const autoRemoveMessage = function () {
  39. if (this instanceof HTMLElement) {
  40. removeMessage.call(this, AUTOREMOVE_TIME, REMOVING_LONG);
  41. }
  42. };
  43. /**
  44. * Класс создания всплывающих сообщений. Конструктор создаёт элемент-контейнер для помещения элементов-сообщений и добавляет его в конец BODY. Класс имеет один метод - Show - показать сообщение (создать элемент-сообщение и поместить в элемент-контейнер на указанное время жизни (аргумент time))
  45. */
  46. return class Messenger {
  47. /**
  48. * Конструктор сообщений
  49. */
  50. constructor() {
  51. this.$message = document.createElement("div");
  52. this.$message.classList.add("messenger");
  53. this.$message.id = "idMessenger";
  54. document.body.appendChild(this.$message);
  55. }
  56. /**
  57. * Вывести сообщение одного из трёх типов. Выводит в прямоугольной области в нижнем правом углу экрана. А также дублируется в лог консоли.
  58. * @param {String} msg текст сообщения, допускается HTML формат
  59. * @param {MESSAGE_TYPE} type тип отображения сообщения (ошибка, предупреждение, информация)
  60. * @param {Number} time время отображения сообщения в миллисекундах
  61. */
  62. Show(msg, type = "info", time = 10000) {
  63. let message = document.createElement("div");
  64. message.id = `idMsg${++MESSAGE_COUNTER}`;
  65. message.innerHTML = msg;
  66. message.classList.add(type);
  67. let close = document.createElement("div");
  68. close.classList.add("close");
  69. close.onclick = removeMessage.bind(message);
  70. message.append(close);
  71. this.$message.appendChild(message);
  72. setTimeout(autoRemoveMessage.bind(message), time);
  73. }
  74. }
  75. })();
  76. var Notify = new NotifyBuild();