image-viewer.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. define(function(require, exports, module) {
  2. var kity = require('../core/kity');
  3. var keymap = require('../core/keymap');
  4. var Module = require('../core/module');
  5. var Command = require('../core/command');
  6. Module.register('ImageViewer', function() {
  7. function createEl(name, classNames, children) {
  8. var el = document.createElement(name);
  9. addClass(el, classNames);
  10. children && children.length && children.forEach(function (child) {
  11. el.appendChild(child);
  12. });
  13. return el;
  14. }
  15. function on(el, event, handler) {
  16. el.addEventListener(event, handler);
  17. }
  18. function addClass(el, classNames) {
  19. classNames && classNames.split(' ').forEach(function (className) {
  20. el.classList.add(className);
  21. });
  22. }
  23. function removeClass(el, classNames) {
  24. classNames && classNames.split(' ').forEach(function (className) {
  25. el.classList.remove(className);
  26. });
  27. }
  28. var ImageViewer = kity.createClass('ImageViewer', {
  29. constructor: function () {
  30. var btnClose = createEl('button', 'km-image-viewer-btn km-image-viewer-close');
  31. var btnSource = createEl('button', 'km-image-viewer-btn km-image-viewer-source');
  32. var image = this.image = createEl('img');
  33. var toolbar = this.toolbar = createEl('div', 'km-image-viewer-toolbar', [btnSource, btnClose]);
  34. var container = createEl('div', 'km-image-viewer-container', [image]);
  35. var viewer = this.viewer = createEl('div', 'km-image-viewer', [toolbar, container]);
  36. this.hotkeyHandler = this.hotkeyHandler.bind(this)
  37. on(btnClose, 'click', this.close.bind(this));
  38. on(btnSource, 'click', this.viewSource.bind(this));
  39. on(image, 'click', this.zoomImage.bind(this));
  40. on(viewer, 'contextmenu', this.toggleToolbar.bind(this));
  41. on(document, 'keydown', this.hotkeyHandler);
  42. },
  43. dispose: function () {
  44. this.close();
  45. document.removeEventListener('remove', this.hotkeyHandler);
  46. },
  47. hotkeyHandler: function (e) {
  48. if (!this.actived) {
  49. return;
  50. }
  51. if (e.keyCode === keymap['esc']) {
  52. this.close();
  53. }
  54. },
  55. toggleToolbar: function (e) {
  56. e && e.preventDefault();
  57. this.toolbar.classList.toggle('hidden');
  58. },
  59. zoomImage: function (restore) {
  60. var image = this.image;
  61. if (typeof restore === 'boolean') {
  62. restore && addClass(image, 'limited');
  63. }
  64. else {
  65. image.classList.toggle('limited');
  66. }
  67. },
  68. viewSource: function (src) {
  69. window.open(this.image.src);
  70. },
  71. open: function (src) {
  72. var input = document.querySelector('input');
  73. if (input) {
  74. input.focus();
  75. input.blur();
  76. }
  77. this.image.src = src;
  78. this.zoomImage(true);
  79. document.body.appendChild(this.viewer);
  80. this.actived = true;
  81. },
  82. close: function () {
  83. this.image.src = '';
  84. document.body.removeChild(this.viewer);
  85. this.actived = false;
  86. }
  87. });
  88. return {
  89. init: function() {
  90. this.viewer = new ImageViewer();
  91. },
  92. events: {
  93. 'normal.dblclick': function(e) {
  94. var shape = e.kityEvent.targetShape
  95. if (shape.__KityClassName === 'Image' && shape.url) {
  96. this.viewer.open(shape.url);
  97. }
  98. }
  99. }
  100. };
  101. });
  102. });