diff --git a/src/blog/blog.js b/src/blog/blog.js
index a0721e706a0035690b7f0e7aae2b6d664fe08fe6..8a061530e5f9fe7ac495d845f45e074441433bc2 100644
--- a/src/blog/blog.js
+++ b/src/blog/blog.js
@@ -44,8 +44,8 @@ export class Blog {
// var socket = new SockJS('http://localhost:8080/ws');
let socket = new SockJS('/ws');
window.stompClient = Stomp.over(socket);
- // window.stompClient.debug = () => {};
- stompClient.debug = (msg) => { console.log(msg) };
+ window.stompClient.debug = () => {};
+ // stompClient.debug = (msg) => { console.log(msg) };
window.stompClient.connect({}, (frame) => {
// 注册发送消息
stompClient.subscribe('/blog/update', (msg) => {
diff --git a/src/chat/chat.js b/src/chat/chat.js
index a86993965d78ba97123fb4318c4b38bcb687f3b8..43d9e8b3fb9513dbc770553e896743312eeb873d 100644
--- a/src/chat/chat.js
+++ b/src/chat/chat.js
@@ -60,8 +60,8 @@ export class Chat {
// var socket = new SockJS('http://localhost:8080/ws');
let socket = new SockJS('/ws');
window.stompClient = Stomp.over(socket);
- // window.stompClient.debug = () => {};
- stompClient.debug = (msg) => { console.log(msg) };
+ window.stompClient.debug = () => {};
+ // stompClient.debug = (msg) => { console.log(msg) };
window.stompClient.connect({}, (frame) => {
// 同步在线用户
this.getOnlineUsers();
@@ -1084,7 +1084,7 @@ export class Chat {
scrollToAfterImgLoaded(to) {
_.defer(() => {
- new ImagesLoaded(this.commentsRef).always(() => {
+ this.commentsRef && new ImagesLoaded(this.commentsRef).always(() => {
this._scrollTo(to);
});
diff --git a/src/common/common-imgs-loaded.js b/src/common/common-imgs-loaded.js
index 47a67fcfecd85dd2258260e5ca64b221038011cc..536131bf4e1e202cb9d3f3e2c03a61198f2638ec 100644
--- a/src/common/common-imgs-loaded.js
+++ b/src/common/common-imgs-loaded.js
@@ -132,9 +132,9 @@
function listener(element, eventName, handler, remove) {
var events = eventName.split(' ');
for (var i = 0, l = events.length; i < l; i++) {
- if (element.addEventListener) {
+ if (element && element.addEventListener) {
element[remove ? 'removeEventListener' : 'addEventListener'](events[i], handler, false);
- } else if (element.attachEvent) {
+ } else if (element && element.attachEvent) {
element[remove ? 'detachEvent' : 'attachEvent']('on' + events[i], handler);
}
}
diff --git a/src/main.js b/src/main.js
index 68083779bad86c11adc759fca8618e6eb14906a6..dc46de4b3aab25b2e67b7decf0afd4a78d1f7cc2 100644
--- a/src/main.js
+++ b/src/main.js
@@ -8,6 +8,8 @@ Promise.config({
}
});
+// window.__debug = true;
+
export function configure(aurelia) {
aurelia.use
.standardConfiguration()
diff --git a/src/resources/attributes/attr-attr.js b/src/resources/attributes/attr-attr.js
index 537cbe6a6fc2edf9d50e469dc7cfe3dcc81cf919..7db9ef25f7a63f9378c0500e27002810af5df64a 100644
--- a/src/resources/attributes/attr-attr.js
+++ b/src/resources/attributes/attr-attr.js
@@ -30,5 +30,7 @@ export class AttrAttr {
this.valueChanged(this.value);
}
- unbind() {}
+ unbind() {
+ this.element = null;
+ }
}
diff --git a/src/resources/attributes/attr-autosize.js b/src/resources/attributes/attr-autosize.js
index 45afcf22590f37c78742ae192e9e459425458fad..c7e5a101883faa75d3b761b0128788c191b03232 100644
--- a/src/resources/attributes/attr-autosize.js
+++ b/src/resources/attributes/attr-autosize.js
@@ -21,6 +21,8 @@ export class AttrAutosize {
* 当数据绑定引擎从视图解除绑定时被调用
*/
unbind() {
- autosize.destroy(this.elements)
+ window.__debug && console.log('AttrAutosize--unbind');
+ autosize.destroy(this.element);
+ this.element = null;
}
}
diff --git a/src/resources/attributes/attr-c2c.js b/src/resources/attributes/attr-c2c.js
index c829f4728e8cf7d372c9cca39b4505babed2b3b2..92debfb37372c8dd6229ac5f025bd88e792fd9dc 100644
--- a/src/resources/attributes/attr-c2c.js
+++ b/src/resources/attributes/attr-c2c.js
@@ -37,6 +37,9 @@ export class AttrC2cCustomAttribute {
}
unbind() {
+ window.__debug && console.log('AttrC2cCustomAttribute--unbind');
this.clipboard && this.clipboard.destroy();
+ this.clipboard = null;
+ this.element = null;
}
}
diff --git a/src/resources/attributes/attr-dimmer.js b/src/resources/attributes/attr-dimmer.js
index 0e1076ff30323542ae76b83882cdcc1292bc2a9d..565b754ff1393cf652bfabddd5029134617faafa 100644
--- a/src/resources/attributes/attr-dimmer.js
+++ b/src/resources/attributes/attr-dimmer.js
@@ -23,4 +23,11 @@ export class AttrDimmer {
this.valueChanged(this.value);
}
+ unbind() {
+ window.__debug && console.log('AttrDimmer--unbind');
+ this.$dimmer && this.$dimmer.remove();
+ this.$dimmer = null;
+ this.element = null;
+ }
+
}
diff --git a/src/resources/attributes/attr-dropzone.js b/src/resources/attributes/attr-dropzone.js
index a9242d1240d202d60bf99a91257c56e0be5dee97..f79cb2ac8aa2bd874a1711f46349a7e414c37678 100644
--- a/src/resources/attributes/attr-dropzone.js
+++ b/src/resources/attributes/attr-dropzone.js
@@ -105,6 +105,7 @@ export class AttrDropzone {
* 当数据绑定引擎从视图解除绑定时被调用
*/
unbind() {
+ window.__debug && console.log('AttrDropzone--unbind');
try {
$.each(this.dropzones, (i, dropzone) => {
dropzone.destroy();
@@ -112,5 +113,10 @@ export class AttrDropzone {
} catch (e) {
console.log(e);
}
+ this.target = null;
+ this.dropzones = [];
+ this.eventAggregator = null;
+ this.subscribe.dispose();
+ // Dropzone = null;
}
}
diff --git a/src/resources/attributes/attr-fancybox.js b/src/resources/attributes/attr-fancybox.js
index 040e6f682b6a98afe73e8198f993f967ba66e6c9..9f01a6deddcaad1a6a3aa8cb5714b2e09eef000b 100644
--- a/src/resources/attributes/attr-fancybox.js
+++ b/src/resources/attributes/attr-fancybox.js
@@ -11,7 +11,8 @@ export class AttrFancyboxCustomAttribute {
}
valueChanged(newValue, oldValue) {
- $(this.element).on('click', 'img', (event) => {
+
+ this.imgHandler = (event) => {
event.preventDefault();
let $img = $(event.target);
var imgs = [];
@@ -23,6 +24,7 @@ export class AttrFancyboxCustomAttribute {
}
});
+ // https://fancyapps.com/fancybox/3/docs/#api
$.fancybox.open(imgs, {
i18n: {
'zh': {
@@ -56,10 +58,21 @@ export class AttrFancyboxCustomAttribute {
],
}, initialIndexOnArray);
- });
+ };
+
+ $(this.element).on('click', 'img', this.imgHandler);
}
bind(bindingContext) {
this.valueChanged(this.value);
}
+
+ unbind() {
+ window.__debug && console.log('AttrFancyboxCustomAttribute--unbind');
+ $(this.element).off('click', 'img', this.imgHandler);
+ this.imgHandler = null;
+ this.element = null;
+
+ $.fancybox.destroy();
+ }
}
diff --git a/src/resources/attributes/attr-modaal.js b/src/resources/attributes/attr-modaal.js
index 417772afc74be52e528762d60828a7bd94951031..cfc92ab21a04dff9836aadf303d74fb6885c831e 100644
--- a/src/resources/attributes/attr-modaal.js
+++ b/src/resources/attributes/attr-modaal.js
@@ -44,4 +44,10 @@ export class AttrModaalCustomAttribute {
});
}
+
+ unbind() {
+ window.__debug && console.log('AttrModaalCustomAttribute--unbind');
+ $(this.element).modaal('close');
+ this.element = null;
+ }
}
diff --git a/src/resources/attributes/attr-pastable.js b/src/resources/attributes/attr-pastable.js
index f3e91a30246b0abd505c9b1820f9fba8a27b80db..5bd91914767f731d170a18c0c7a4cc0494c7630b 100644
--- a/src/resources/attributes/attr-pastable.js
+++ b/src/resources/attributes/attr-pastable.js
@@ -12,8 +12,8 @@ export class AttrPastable {
}
valueChanged(newValue, oldValue) {
- // clipboard paste image
- $(this.element).pastableTextarea().on('pasteImage', (ev, data) => {
+
+ this.pasteHandler = (ev, data) => {
$.post('/admin/file/base64', {
dataURL: data.dataURL,
@@ -29,12 +29,27 @@ export class AttrPastable {
.replace(/\{uuidName\}/g, data.data.uuidName));
}
});
- }).on('pasteImageError', (ev, data) => {
+ };
+
+ this.errHandler = (ev, data) => {
toastr.error(data.message, '剪贴板粘贴图片错误!');
- });
+ };
+
+ // https://github.com/layerssss/paste.js
+ // clipboard paste image
+ $(this.element).pastableTextarea().on('pasteImage', this.pasteHandler).on('pasteImageError', this.errHandler);
}
bind(bindingContext) {
this.valueChanged(this.value);
}
+
+ unbind() {
+ window.__debug && console.log('AttrPastable--unbind');
+ $(this.element).pastableTextarea().off('pasteImage', this.pasteHandler).off('pasteImageError', this.errHandler);
+ this.element = null;
+ this.pasteHandler = null;
+ this.errHandler = null;
+
+ }
}
diff --git a/src/resources/attributes/attr-scrollbar.js b/src/resources/attributes/attr-scrollbar.js
index 700a1326a28069e51fc207c4b09dfd11320fc1a1..4fd20a6dd14f37ac99b5628a2aae80b2e1a078cd 100644
--- a/src/resources/attributes/attr-scrollbar.js
+++ b/src/resources/attributes/attr-scrollbar.js
@@ -29,8 +29,12 @@ export class AttrScrollbarCustomAttribute {
* 当数据绑定引擎从视图解除绑定时被调用
*/
unbind() {
+
+ window.__debug && console.log('AttrScrollbarCustomAttribute--unbind');
try {
jQuery(this.element).removeClass(this.cls).scrollbar('destroy');
} catch (err) {}
+
+ this.element = null;
}
}
diff --git a/src/resources/attributes/attr-tablesort.js b/src/resources/attributes/attr-tablesort.js
index d7fb29076a1b79f1a09a51ac4a7f4fda4f274c0a..1b78015536dc34b774ff7d1389ae9ec40638d3e5 100644
--- a/src/resources/attributes/attr-tablesort.js
+++ b/src/resources/attributes/attr-tablesort.js
@@ -14,13 +14,26 @@ export class AttrTablesortCustomAttribute {
_init() {
if ($(this.element).is('table')) {
+ // https://github.com/kylefox/jquery-tablesort
$(this.element).addClass('sortable').tablesort();
+ this.tablesort = $(this.element).data('tablesort');
} else {
- console.warn('tablesort element is not table tag!');
+ console.warn('tablesort element is not table tag!');
}
}
bind() {
- this._init();
+ this._init();
+ }
+
+ unbind() {
+
+ window.__debug && console.log('AttrTablesortCustomAttribute--unbind');
+
+ this.tablesort && this.tablesort.destroy();
+
+ this.element = null;
+ this.tablesort = null;
+
}
}
diff --git a/src/resources/attributes/attr-task.js b/src/resources/attributes/attr-task.js
index 7ab7464abec1baf85af7c18406bbf69ec057b34c..c1100aa2fe23005f0253f9cfd929ec49e124e95d 100644
--- a/src/resources/attributes/attr-task.js
+++ b/src/resources/attributes/attr-task.js
@@ -32,6 +32,7 @@ export class AttrTask {
}
unbind() {
+ window.__debug && console.log('AttrTask--unbind');
this.element = null;
this.task = null;
this.bindingCtx = null;
diff --git a/src/resources/attributes/attr-textcomplete.js b/src/resources/attributes/attr-textcomplete.js
index 5cf58b92f2c19793759d0620e5bc8d033ca5d171..fefba2423ef9323a663a74b6492639126337a8bc 100644
--- a/src/resources/attributes/attr-textcomplete.js
+++ b/src/resources/attributes/attr-textcomplete.js
@@ -26,9 +26,12 @@ export class AttrTextcompleteCustomAttribute {
}
valueChanged() {
+
if (this.value) {
this.members = this.value.users;
this.channel = this.value.channel;
+
+ // https://github.com/yuku/jquery-textcomplete
$(this.element).textcomplete([{ // chat msg help
match: /(|\b)(\/.*)$/,
search: (term, callback) => {
@@ -120,8 +123,12 @@ export class AttrTextcompleteCustomAttribute {
initHotkeys() {
+ this.keydowns = [];
+
_.each(_.filter(_.values(tips), 'key'), (value) => {
- $(this.element).bind('keydown', value.key, (evt) => {
+
+ let key = value.key;
+ let handler = (evt) => {
evt.preventDefault();
$(this.element).insertAtCaret(value.value);
let cr = utils.getCursortPosition(this.element);
@@ -130,14 +137,34 @@ export class AttrTextcompleteCustomAttribute {
_.defer(() => {
autosize.update(this.element);
});
+ };
+
+ this.keydowns.push({
+ key: key,
+ handler: handler
});
+
+ $(this.element).bind('keydown', key, handler);
});
}
unbind() {
+
+ window.__debug && console.log('AttrTextcompleteCustomAttribute--unbind');
+
try {
$(this.element).textcomplete('destroy');
} catch (err) {}
+
+
+ _.each(this.keydowns, (item) => {
+ $(this.element).unbind('keydown', item.handler);
+ });
+
+ this.members = null;
+ this.channel = null;
+ this.element = null;
+ this.keydowns = [];
}
}
diff --git a/src/resources/attributes/attr-ui-checkbox.js b/src/resources/attributes/attr-ui-checkbox.js
index f9ad7eda07bf6ca1adc80a131ba00f21d5404a0b..ca03d5af62157088b842244914f2fc28242d4b0f 100644
--- a/src/resources/attributes/attr-ui-checkbox.js
+++ b/src/resources/attributes/attr-ui-checkbox.js
@@ -12,4 +12,8 @@ export class AttrUiCheckboxCustomAttribute {
valueChanged(newValue, oldValue) {
$(this.element).checkbox();
}
+
+ unbind() {
+ this.element = null;
+ }
}
diff --git a/src/resources/attributes/attr-ui-dropdown-action.js b/src/resources/attributes/attr-ui-dropdown-action.js
index c8c9aca3856ea1180689edab535774ad54cbecc9..7e4aabeec795a66aad74c8b5ca171dcfb7cc58c9 100644
--- a/src/resources/attributes/attr-ui-dropdown-action.js
+++ b/src/resources/attributes/attr-ui-dropdown-action.js
@@ -24,4 +24,8 @@ export class AttrUiDropdownActionCustomAttribute {
bind() {
this._init(this.value ? this.value : window);
}
+
+ unbind() {
+ this.element = null;
+ }
}
diff --git a/src/resources/attributes/attr-ui-dropdown-hover-action.js b/src/resources/attributes/attr-ui-dropdown-hover-action.js
index fee6b5f02591c37c16516e96e7b8ecb4c9259f2c..5c757a249de312490d78f8f84af34e81ff978dd2 100644
--- a/src/resources/attributes/attr-ui-dropdown-hover-action.js
+++ b/src/resources/attributes/attr-ui-dropdown-hover-action.js
@@ -25,4 +25,8 @@ export class AttrUiDropdownHoverActionCustomAttribute {
bind() {
this._init(this.value ? this.value : window);
}
+
+ unbind() {
+ this.element = null;
+ }
}
diff --git a/src/resources/attributes/attr-ui-dropdown-hover.js b/src/resources/attributes/attr-ui-dropdown-hover.js
index 4ffdf22ea6f2e04c9557692b64d217f27d5ad3db..ea2f0b32e67fec576123379542e912b6a9b5950c 100644
--- a/src/resources/attributes/attr-ui-dropdown-hover.js
+++ b/src/resources/attributes/attr-ui-dropdown-hover.js
@@ -24,4 +24,8 @@ export class AttrUiDropdownHoverCustomAttribute {
bind() {
this._init(this.value ? this.value : 'hide');
}
+
+ unbind() {
+ this.element = null;
+ }
}
diff --git a/src/resources/attributes/attr-ui-dropdown.js b/src/resources/attributes/attr-ui-dropdown.js
index 1592b20eece7acab46fc3363362f942275e977cb..193abb4fd64bc2518e0fa37c5b3b5dfd5938ba2e 100644
--- a/src/resources/attributes/attr-ui-dropdown.js
+++ b/src/resources/attributes/attr-ui-dropdown.js
@@ -23,4 +23,8 @@ export class AttrUiDropdownCustomAttribute {
bind() {
this._init(this.value ? this.value : 'hide');
}
+
+ unbind() {
+ this.element = null;
+ }
}
diff --git a/src/resources/attributes/attr-ui-popup.js b/src/resources/attributes/attr-ui-popup.js
index 6f1513c10dadfe831b5b0f47b6cd64a97b82a13c..f788a429644620bb60ecaeb77c69ef43f2efd519 100644
--- a/src/resources/attributes/attr-ui-popup.js
+++ b/src/resources/attributes/attr-ui-popup.js
@@ -32,4 +32,9 @@ export class AttrUiPopupCustomAttribute {
});
}
+
+ unbind() {
+ $(this.element).popup('destroy');
+ this.element = null;
+ }
}
diff --git a/src/resources/attributes/attr-ui-pp.js b/src/resources/attributes/attr-ui-pp.js
index fbc5a64edaed6be76192952ddc9a235566715dc9..e7cff890f44a05038b580fccb455657f32690cd1 100644
--- a/src/resources/attributes/attr-ui-pp.js
+++ b/src/resources/attributes/attr-ui-pp.js
@@ -17,4 +17,9 @@ export class AttrUiPpCustomAttribute {
});
}
-}
\ No newline at end of file
+
+ unbind() {
+ $(this.element).popup('destroy');
+ this.element = null;
+ }
+}
diff --git a/src/resources/attributes/attr-ui-tab.js b/src/resources/attributes/attr-ui-tab.js
index a30a132585e58e851cd3a0186b3726b2d380aad8..fbb6c9343ea979c9eaa94ae8cc5fcd8c1d38933b 100644
--- a/src/resources/attributes/attr-ui-tab.js
+++ b/src/resources/attributes/attr-ui-tab.js
@@ -21,4 +21,8 @@ export class AttrUiTabCustomAttribute {
bind() {
this._init();
}
+
+ unbind() {
+ this.element = null;
+ }
}
diff --git a/src/resources/elements/em-blog-comment.js b/src/resources/elements/em-blog-comment.js
index a98050047cc2ea8a2a08470210028d0196e386f3..127927d41e96fbd984f7499e7125cb9d0735211c 100644
--- a/src/resources/elements/em-blog-comment.js
+++ b/src/resources/elements/em-blog-comment.js
@@ -18,7 +18,7 @@ export class EmBlogComment {
offset = 0;
isSuper = nsCtx.isSuper;
loginUser = nsCtx.loginUser;
- users = nsCtx.users;
+ users;
@bindable blog;
@@ -26,6 +26,77 @@ export class EmBlogComment {
this._refresh();
}
+ bind() {
+ this.users = nsCtx.users;
+ }
+
+ detached() {
+ window.__debug && console.log('EmBlogComment--detached');
+
+ this.comments = null;
+ this.users = null;
+ this.blog = null;
+ this.focusedComment = null;
+
+ // 消息popup
+ $('.em-blog-comment .comments').off('mouseenter', '.markdown-body a[href*="#/blog/"]:not(.pp-not)', this.blogCommentMeHandler);
+ $('.em-blog-comment .comments').off('mouseleave', '.markdown-body a[href*="#/blog/"]:not(.pp-not)', this.blogCommentMlHandler);
+ this.blogCommentMeHandler = null;
+ this.blogCommentMlHandler = null;
+
+ $('.em-blog-comment .comments').off('dblclick', '.comment', this.commentsDblHandler);
+ $('.em-blog-comment .comments').off('click', '.comment', this.commentsClHandler);
+ this.commentsDblHandler = null;
+ this.commentsClHandler = null;
+
+ $(document).unbind('keydown', this.kdRHandler).unbind('keydown', this.kdAltUpHandler).unbind('keydown', this.kdAltDownHandler);
+ this.kdRHandler = null;
+ this.kdAltUpHandler = null;
+ this.kdAltDownHandler = null;
+
+ if (this.$paste) {
+ this.$paste.off('pasteImage', this.pasteHandler).off('pasteImageError', this.errHandler);
+ this.pasteHandler = null;
+ this.errHandler = null;
+
+ this.$paste = null;
+ }
+
+ $('.CodeMirror-wrap', this.markdownRef).each((index, elem) => {
+ let dd = Dropzone.forElement(elem);
+ dd && dd.destroy();
+ });
+
+ $('.editor-toolbar .fa.fa-upload', this.markdownRef).each((index, elem) => {
+ let dd = Dropzone.forElement(elem);
+ dd && dd.destroy();
+ });
+
+ $('.editor-toolbar .fa.fa-file-excel-o', this.markdownRef).each((index, elem) => {
+ let dd = Dropzone.forElement(elem);
+ dd && dd.destroy();
+ });
+ this.markdownRef = null;
+
+ try {
+
+ if (this.simplemde) {
+ this.simplemde.codemirror.off('keyup', this.editKeyHandler);
+ this.editKeyHandler = null;
+
+ // https://github.com/sparksuite/simplemde-markdown-editor
+ this.simplemde.toTextArea();
+ this.simplemde = null;
+ }
+
+ $(this.$chatMsgInputRef).textcomplete('destroy');
+ this.$chatMsgInputRef = null;
+ } catch (err) {
+ console.error(err);
+ }
+
+ }
+
/**
* 构造函数
*/
@@ -174,8 +245,7 @@ export class EmBlogComment {
attached() {
this._init();
- // 消息popup
- $('.em-blog-comment .comments').on('mouseenter', '.markdown-body a[href*="#/blog/"]:not(.pp-not)', (event) => {
+ this.blogCommentMeHandler = (event) => {
event.preventDefault();
let target = event.currentTarget;
@@ -199,10 +269,9 @@ export class EmBlogComment {
this.hoverTimeoutRef = null;
}, 500);
- });
+ };
- // 消息popup
- $('.em-blog-comment .comments').on('mouseleave', '.markdown-body a[href*="#/blog/"]:not(.pp-not)', (event) => {
+ this.blogCommentMlHandler = (event) => {
event.preventDefault();
if (this.hoverTimeoutRef) {
if (this.hoverUserTarget === event.currentTarget) {
@@ -210,9 +279,13 @@ export class EmBlogComment {
this.hoverTimeoutRef = null;
}
}
- });
+ };
- $('.em-blog-comment .comments').on('dblclick', '.comment', (event) => {
+ // 消息popup
+ $('.em-blog-comment .comments').on('mouseenter', '.markdown-body a[href*="#/blog/"]:not(.pp-not)', this.blogCommentMeHandler);
+ $('.em-blog-comment .comments').on('mouseleave', '.markdown-body a[href*="#/blog/"]:not(.pp-not)', this.blogCommentMlHandler);
+
+ this.commentsDblHandler = (event) => {
if (event.ctrlKey && event.shiftKey) {
let cid = $(event.currentTarget).attr('data-id');
let $t = $(event.currentTarget).find('.content > textarea');
@@ -221,33 +294,43 @@ export class EmBlogComment {
this.editHandler(item, $t);
}
}
- });
+ };
- $('.em-blog-comment .comments').on('click', '.comment', (event) => {
+ this.commentsClHandler = (event) => {
this.focusedComment = $(event.currentTarget);
- });
+ };
+
+ $('.em-blog-comment .comments').on('dblclick', '.comment', this.commentsDblHandler);
+ $('.em-blog-comment .comments').on('click', '.comment', this.commentsClHandler);
this.initHotkeys();
}
initHotkeys() {
- $(document).bind('keydown', 'r', (evt) => { // reply
+
+ this.kdRHandler = (evt) => { // reply
evt.preventDefault();
$('.em-blog-content').scrollTo(`max`, 120, {
offset: 0
});
this.simplemde.codemirror.focus();
- }).bind('keydown', 'alt+up', (evt) => { // comment pre
+ };
+
+ this.kdAltUpHandler = (evt) => { // comment pre
evt.preventDefault();
$('.em-blog-content').scrollTo(this.getScrollTargetComment(true), 120, {
offset: 0
});
- }).bind('keydown', 'alt+down', (evt) => { // comment next
+ };
+
+ this.kdAltDownHandler = (evt) => { // comment next
evt.preventDefault();
$('.em-blog-content').scrollTo(this.getScrollTargetComment(), 120, {
offset: 0
});
- });
+ };
+
+ $(document).bind('keydown', 'r', this.kdRHandler).bind('keydown', 'alt+up', this.kdAltUpHandler).bind('keydown', 'alt+down', this.kdAltDownHandler);
}
@@ -412,13 +495,15 @@ export class EmBlogComment {
},
});
- this.simplemde.codemirror.on('keyup', (cm, e) => {
+ this.editKeyHandler = (cm, e) => {
if (e.ctrlKey && e.keyCode == 13) { // Ctrl+Enter
this.addHandler();
} else if (e.keyCode == 27) { // Esc
this.simplemde.value('');
}
- });
+ };
+
+ this.simplemde.codemirror.on('keyup', this.editKeyHandler);
this.$chatMsgInputRef = $(this.markdownRef).find('.CodeMirror textarea');
if (this.$chatMsgInputRef.size() === 0) {
@@ -607,9 +692,12 @@ export class EmBlogComment {
_reset() {
this.blog = null;
- this.simplemde.value('');
- this.simplemde.toTextArea();
- this.simplemde = null;
+
+ if (this.simplemde) {
+ this.simplemde.value('');
+ this.simplemde.toTextArea();
+ this.simplemde = null;
+ }
}
/**
@@ -698,31 +786,38 @@ export class EmBlogComment {
initPaste() {
- let $paste;
if (this.$chatMsgInputRef.is('textarea')) {
- $paste = $(this.$chatMsgInputRef).pastableTextarea();
+ this.$paste = $(this.$chatMsgInputRef).pastableTextarea();
} else {
- $paste = $(this.$chatMsgInputRef).pastableContenteditable();
+ this.$paste = $(this.$chatMsgInputRef).pastableContenteditable();
}
- $paste && ($paste.on('pasteImage', (ev, data) => {
-
- $.post('/admin/file/base64', {
- dataURL: data.dataURL,
- type: data.blob.type,
- toType: 'Blog'
- }, (data, textStatus, xhr) => {
- if (data.success) {
- this.insertContent(''
- .replace(/\{name\}/g, data.data.name)
- .replace(/\{baseURL\}/g, utils.getBaseUrl() + '/')
- .replace(/\{path\}/g, data.data.path)
- .replace(/\{uuidName\}/g, data.data.uuidName));
- }
- });
- }).on('pasteImageError', (ev, data) => {
- toastr.error(data.message, '剪贴板粘贴图片错误!');
- }));
+ if (this.$paste) {
+
+ this.pasteHandler = (ev, data) => {
+
+ $.post('/admin/file/base64', {
+ dataURL: data.dataURL,
+ type: data.blob.type,
+ toType: 'Blog'
+ }, (data, textStatus, xhr) => {
+ if (data.success) {
+ this.insertContent(''
+ .replace(/\{name\}/g, data.data.name)
+ .replace(/\{baseURL\}/g, utils.getBaseUrl() + '/')
+ .replace(/\{path\}/g, data.data.path)
+ .replace(/\{uuidName\}/g, data.data.uuidName));
+ }
+ });
+ };
+
+ this.errHandler = (ev, data) => {
+ toastr.error(data.message, '剪贴板粘贴图片错误!');
+ };
+
+ this.$paste.on('pasteImage', this.pasteHandler).on('pasteImageError', this.errHandler);
+
+ }
}
initUploadDropzone(domRef, getInputTargetCb, clickable) {
@@ -785,7 +880,7 @@ export class EmBlogComment {
scrollToAfterImgLoaded(to) {
_.defer(() => {
- new ImagesLoaded($('.em-blog-content')[0]).always(() => {
+ ($('.em-blog-content').length > 0) && new ImagesLoaded($('.em-blog-content')[0]).always(() => {
this._scrollTo(to);
});
diff --git a/src/resources/elements/em-blog-content.js b/src/resources/elements/em-blog-content.js
index a600df4913528be9c674972ce0984d31ad74afb9..71c415349b1f4cc5b617fe3d15a399af3aa5593b 100644
--- a/src/resources/elements/em-blog-content.js
+++ b/src/resources/elements/em-blog-content.js
@@ -13,9 +13,15 @@ export class EmBlogContent {
blog;
- loginUser = nsCtx.loginUser;
- isSuper = nsCtx.isSuper;
- isAdmin = nsCtx.isAdmin;
+ loginUser;
+ isSuper;
+ isAdmin;
+
+ bind() {
+ this.loginUser = nsCtx.loginUser;
+ this.isSuper = nsCtx.isSuper;
+ this.isAdmin = nsCtx.isAdmin;
+ }
/**
* 构造函数
@@ -289,6 +295,59 @@ export class EmBlogContent {
this.subscribe7.dispose();
}
+ detached() {
+ window.__debug && console.log('EmBlogContent--detached');
+
+ this.blog = null;
+ this.loginUser = null;
+ this.isSuper = null;
+ this.isAdmin = null;
+
+ $('.em-blog-content').off('click', 'code[data-code]', this.codeClHandler);
+ $('.em-blog-content').off('click', '.pre-code-wrapper', this.preCodeClHandler);
+ $('.em-blog-right-sidebar').off('click', '.panel-blog-dir .wiki-dir-item', this.wikiDirClHandler);
+ $(this.mkbodyRef).off('dblclick', this.mkDblHandler);
+ $('.em-blog-content').off('scroll', this.blogContentScrollHandler);
+ $(this.feedRef).off('mouseenter', '.event a[href*="#/blog/"]:not(.pp-not)', this.feedMeHandler);
+ $(this.feedRef).off('mouseleave', '.event a[href*="#/blog/"]:not(.pp-not)', this.feedMlHandler);
+ $('.tms-blog').off('mouseenter', 'span[data-value].at-user:not(.pp-not),span[data-value].at-group:not(.pp-not),a[data-value].author:not(.pp-not)', this.userInfoMeHandler);
+ $('.tms-blog').off('mouseleave', 'span[data-value].at-user:not(.pp-not),span[data-value].at-group:not(.pp-not),a[data-value].author:not(.pp-not)', this.userInfoMlHandler);
+
+ window.removeEventListener && window.removeEventListener('message', this.messageHandler, false);
+
+ this.codeClHandler = null;
+ this.preCodeClHandler = null;
+ this.wikiDirClHandler = null;
+ this.mkDblHandler = null;
+ this.blogContentScrollHandler = null;
+ this.feedMeHandler = null;
+ this.feedMlHandler = null;
+ this.userInfoMeHandler = null;
+ this.userInfoMlHandler = null;
+ this.messageHandler = null;
+
+ try {
+ $(document).unbind('keyup', this.docKuEHandler)
+ .unbind('keyup', this.docKuWHandler)
+ .unbind('keydown', this.docKuDHandler)
+ .unbind('keydown', this.docKuSHandler)
+ .unbind('keydown', this.docKuFHandler)
+ .unbind('keydown', this.docKuTHandler)
+ .unbind('keydown', this.docKuBHandler)
+ .unbind('keydown', this.docKuAltRHandler)
+ .unbind('keydown', this.docKuAltHHandler)
+ .unbind('keydown', this.docKuAltLHandler)
+ .unbind('keydown', this.docKuAltSHandler)
+ .unbind('keydown', this.docKuAltCHandler)
+ .unbind('keydown', this.docKuAltMHandler)
+ .unbind('keydown', this.docKuAltOHandler)
+ .unbind('keydown', this.docKuAltTHandler)
+ .unbind('keydown', this.docKuAltEHandler)
+ .unbind('keydown', this.docKuAltCtrlDHandler);
+ } catch (err) { console.log(err); }
+
+ }
+
/**
* 当视图被附加到DOM中时被调用
*/
@@ -302,7 +361,7 @@ export class EmBlogContent {
toastr.error('复制到剪贴板失败!');
});
- $('.em-blog-content').on('click', 'code[data-code]', function(event) {
+ this.codeClHandler = function(event) {
if (event.ctrlKey || event.metaKey) {
event.stopImmediatePropagation();
event.preventDefault();
@@ -311,9 +370,9 @@ export class EmBlogContent {
(err) => { toastr.error('复制到剪贴板失败!'); }
);
}
- });
+ };
- $('.em-blog-content').on('click', '.pre-code-wrapper', function(event) {
+ this.preCodeClHandler = function(event) {
if (event.ctrlKey || event.metaKey) {
event.stopImmediatePropagation();
event.preventDefault();
@@ -322,9 +381,12 @@ export class EmBlogContent {
(err) => { toastr.error('复制到剪贴板失败!'); }
);
}
- });
+ };
- $('.em-blog-right-sidebar').on('click', '.panel-blog-dir .wiki-dir-item', (event) => {
+ $('.em-blog-content').on('click', 'code[data-code]', this.codeClHandler);
+ $('.em-blog-content').on('click', '.pre-code-wrapper', this.preCodeClHandler);
+
+ this.wikiDirClHandler = (event) => {
event.preventDefault();
if ($(window).width() <= 768) {
ea.publish(nsCons.EVENT_BLOG_RIGHT_SIDEBAR_TOGGLE, { isHide: true });
@@ -332,17 +394,21 @@ export class EmBlogContent {
$('.em-blog-content').scrollTo(`#${$(event.currentTarget).attr('data-id')}`, 200, {
offset: 0
});
- });
+ };
- $(this.mkbodyRef).on('dblclick', (event) => {
+ $('.em-blog-right-sidebar').on('click', '.panel-blog-dir .wiki-dir-item', this.wikiDirClHandler);
+
+ this.mkDblHandler = (event) => {
if (event.ctrlKey && event.shiftKey) {
if (this.blog.openEdit || this.isSuper || this.blog.creator.username == this.loginUser.username) {
this.editHandler();
}
}
- });
+ };
- $('.em-blog-content').scroll(_.throttle((event) => {
+ $(this.mkbodyRef).on('dblclick', this.mkDblHandler);
+
+ this.blogContentScrollHandler = _.throttle((event) => {
try {
let sHeight = $('.em-blog-content')[0].scrollHeight;
let sTop = $('.em-blog-content')[0].scrollTop;
@@ -354,10 +420,11 @@ export class EmBlogContent {
} catch (err) { this.progressWidth = 0; }
- }, 10));
+ }, 10);
- // 消息popup
- $(this.feedRef).on('mouseenter', '.event a[href*="#/blog/"]:not(.pp-not)', (event) => {
+ $('.em-blog-content').scroll(this.blogContentScrollHandler);
+
+ this.feedMeHandler = (event) => {
event.preventDefault();
let target = event.currentTarget;
let cid = utils.urlQuery('cid', $(target).attr('href'));
@@ -379,10 +446,9 @@ export class EmBlogContent {
});
this.hoverTimeoutRef = null;
}, 500);
- });
+ };
- // 消息popup
- $(this.feedRef).on('mouseleave', '.event a[href*="#/blog/"]:not(.pp-not)', (event) => {
+ this.feedMlHandler = (event) => {
event.preventDefault();
if (this.hoverTimeoutRef) {
if (this.hoverUserTarget === event.currentTarget) {
@@ -390,10 +456,13 @@ export class EmBlogContent {
this.hoverTimeoutRef = null;
}
}
- });
+ };
- // 用户信息popup
- $('.tms-blog').on('mouseenter', 'span[data-value].at-user:not(.pp-not),span[data-value].at-group:not(.pp-not),a[data-value].author:not(.pp-not)', (event) => {
+ // 消息popup
+ $(this.feedRef).on('mouseenter', '.event a[href*="#/blog/"]:not(.pp-not)', this.feedMeHandler);
+ $(this.feedRef).on('mouseleave', '.event a[href*="#/blog/"]:not(.pp-not)', this.feedMlHandler);
+
+ this.userInfoMeHandler = (event) => {
event.preventDefault();
let target = event.currentTarget;
@@ -416,10 +485,9 @@ export class EmBlogContent {
});
this.hoverTimeoutRef = null;
}, 500);
- });
+ };
- // 用户信息popup
- $('.tms-blog').on('mouseleave', 'span[data-value].at-user:not(.pp-not),span[data-value].at-group:not(.pp-not),a[data-value].author:not(.pp-not)', (event) => {
+ this.userInfoMlHandler = (event) => {
event.preventDefault();
if (this.hoverTimeoutRef) {
if (this.hoverUserTarget === event.currentTarget) {
@@ -427,11 +495,14 @@ export class EmBlogContent {
this.hoverTimeoutRef = null;
}
}
- });
+ };
+ // 用户信息popup
+ $('.tms-blog').on('mouseenter', 'span[data-value].at-user:not(.pp-not),span[data-value].at-group:not(.pp-not),a[data-value].author:not(.pp-not)', this.userInfoMeHandler);
+ $('.tms-blog').on('mouseleave', 'span[data-value].at-user:not(.pp-not),span[data-value].at-group:not(.pp-not),a[data-value].author:not(.pp-not)', this.userInfoMlHandler);
this.initHotkeys();
- window.addEventListener && window.addEventListener('message', function(ev) {
+ this.messageHandler = function(ev) {
// console.info('message from parent:', ev.data);
if (ev.origin != window.location.origin) return;
@@ -444,7 +515,9 @@ export class EmBlogContent {
ev.data.from = 'html';
ea.publish(nsCons.EVENT_BLOG_CHANGED, ev.data);
- }, false);
+ };
+
+ window.addEventListener && window.addEventListener('message', this.messageHandler, false);
}
fixDirItem() {
@@ -478,67 +551,103 @@ export class EmBlogContent {
}
initHotkeys() {
- try {
- $(document).bind('keyup', 'e', (evt) => { // edit
- evt.preventDefault();
- if (this.blog.openEdit || this.isSuper || this.blog.creator.username == this.loginUser.username) {
- this.throttleEditHandler();
- }
- }).bind('keyup', 'w', (evt) => { // create
- evt.preventDefault();
- this.throttleCreateHandler();
- }).bind('keydown', 'd', (evt) => { // dir
- evt.preventDefault();
- if (this.dir) {
- this.catalogHandler();
- }
- }).bind('keydown', 's', (evt) => { // share
- evt.preventDefault();
- this.blogShareVm.show();
- }).bind('keydown', 'f', (evt) => { // follow
- evt.preventDefault();
- this.followerHandler();
- }).bind('keydown', 't', (event) => { // scroll top
- event.preventDefault();
- $('.em-blog-content').scrollTo(0, 200, {
- offset: 0
- });
- }).bind('keydown', 'b', (event) => { // scroll bottom
- event.preventDefault();
- $('.em-blog-content').scrollTo(`max`, 200, {
- offset: 0
- });
- }).bind('keydown', 'alt+r', (event) => { // refresh
- event.preventDefault();
- this.refreshHandler();
- }).bind('keydown', 'alt+h', (event) => { // history
- event.preventDefault();
- this.historyHandler();
- }).bind('keydown', 'alt+l', (event) => { // history
- event.preventDefault();
- this.authHandler();
- }).bind('keydown', 'alt+s', (event) => { // stow
- event.preventDefault();
- this.stowHandler();
- }).bind('keydown', 'alt+c', (event) => { // copy
- event.preventDefault();
- this.throttleCopyHandler();
- }).bind('keydown', 'alt+m', (event) => { // move space
- event.preventDefault();
- this.updateSpaceHandler();
- }).bind('keydown', 'alt+o', (event) => { // open edit
- event.preventDefault();
- this.openEditHandler();
- }).bind('keydown', 'alt+t', (event) => { // tpl edit
- event.preventDefault();
- this.tplEditHandler();
- }).bind('keydown', 'alt+e', (event) => { // change editor
- event.preventDefault();
- this.changeEditorHandler();
- }).bind('keydown', 'alt+ctrl+d', (event) => { // delete
- event.preventDefault();
- this.deleteHandler();
+
+
+ this.docKuEHandler = (evt) => { // edit
+ evt.preventDefault();
+ if (this.blog.openEdit || this.isSuper || this.blog.creator.username == this.loginUser.username) {
+ this.throttleEditHandler();
+ }
+ };
+ this.docKuWHandler = (evt) => { // create
+ evt.preventDefault();
+ this.throttleCreateHandler();
+ };
+ this.docKuDHandler = (evt) => { // dir
+ evt.preventDefault();
+ if (this.dir) {
+ this.catalogHandler();
+ }
+ };
+ this.docKuSHandler = (evt) => { // share
+ evt.preventDefault();
+ this.blogShareVm.show();
+ };
+ this.docKuFHandler = (evt) => { // follow
+ evt.preventDefault();
+ this.followerHandler();
+ };
+ this.docKuTHandler = (event) => { // scroll top
+ event.preventDefault();
+ $('.em-blog-content').scrollTo(0, 200, {
+ offset: 0
+ });
+ };
+ this.docKuBHandler = (event) => { // scroll bottom
+ event.preventDefault();
+ $('.em-blog-content').scrollTo(`max`, 200, {
+ offset: 0
});
+ };
+ this.docKuAltRHandler = (event) => { // refresh
+ event.preventDefault();
+ this.refreshHandler();
+ };
+ this.docKuAltHHandler = (event) => { // history
+ event.preventDefault();
+ this.historyHandler();
+ };
+ this.docKuAltLHandler = (event) => { // auth
+ event.preventDefault();
+ this.authHandler();
+ };
+ this.docKuAltSHandler = (event) => { // stow
+ event.preventDefault();
+ this.stowHandler();
+ };
+ this.docKuAltCHandler = (event) => { // copy
+ event.preventDefault();
+ this.throttleCopyHandler();
+ };
+ this.docKuAltMHandler = (event) => { // move space
+ event.preventDefault();
+ this.updateSpaceHandler();
+ };
+ this.docKuAltOHandler = (event) => { // open edit
+ event.preventDefault();
+ this.openEditHandler();
+ };
+ this.docKuAltTHandler = (event) => { // tpl edit
+ event.preventDefault();
+ this.tplEditHandler();
+ };
+ this.docKuAltEHandler = (event) => { // change editor
+ event.preventDefault();
+ this.changeEditorHandler();
+ };
+ this.docKuAltCtrlDHandler = (event) => { // delete
+ event.preventDefault();
+ this.deleteHandler();
+ };
+
+ try {
+ $(document).bind('keyup', 'e', this.docKuEHandler)
+ .bind('keyup', 'w', this.docKuWHandler)
+ .bind('keydown', 'd', this.docKuDHandler)
+ .bind('keydown', 's', this.docKuSHandler)
+ .bind('keydown', 'f', this.docKuFHandler)
+ .bind('keydown', 't', this.docKuTHandler)
+ .bind('keydown', 'b', this.docKuBHandler)
+ .bind('keydown', 'alt+r', this.docKuAltRHandler)
+ .bind('keydown', 'alt+h', this.docKuAltHHandler)
+ .bind('keydown', 'alt+l', this.docKuAltLHandler)
+ .bind('keydown', 'alt+s', this.docKuAltSHandler)
+ .bind('keydown', 'alt+c', this.docKuAltCHandler)
+ .bind('keydown', 'alt+m', this.docKuAltMHandler)
+ .bind('keydown', 'alt+o', this.docKuAltOHandler)
+ .bind('keydown', 'alt+t', this.docKuAltTHandler)
+ .bind('keydown', 'alt+e', this.docKuAltEHandler)
+ .bind('keydown', 'alt+ctrl+d', this.docKuAltCtrlDHandler);
} catch (err) { console.log(err); }
}
diff --git a/src/resources/elements/em-blog-write.js b/src/resources/elements/em-blog-write.js
index 87780a040fe3ea19d6619f04a73cea2ec14708fa..13c7ba29a75e9fe435842f5209d08d389f2ab8b3 100644
--- a/src/resources/elements/em-blog-write.js
+++ b/src/resources/elements/em-blog-write.js
@@ -16,6 +16,64 @@ export class EmBlogWrite {
baseRes = utils.getResourceBase();
+ detached() {
+
+ window.__debug && console.log('EmBlogWrite--detached');
+
+ this.members = null;
+ this.blog = null;
+
+ if (this.$paste) {
+ this.$paste.off('pasteImage', this.pasteHandler).off('pasteImageError', this.errHandler);
+ this.pasteHandler = null;
+ this.errHandler = null;
+
+ this.$paste = null;
+ }
+
+ $('#blog-save-btn').off('click', this.blogSaveHandler);
+ $('#switch-html').off('click', this.switchHandler);
+
+ this.blogSaveHandler = null;
+ this.switchHandler = null;
+
+ $('#blog-title-input').off('keyup', this.blogTitleInputKuHandler);
+
+ $('.CodeMirror-wrap', '#txt-blog-write-wrapper').each((index, elem) => {
+ let dd = Dropzone.forElement(elem);
+ dd && dd.destroy();
+ });
+
+ $('.editor-toolbar .fa.fa-upload', '#txt-blog-write-wrapper').each((index, elem) => {
+ let dd = Dropzone.forElement(elem);
+ dd && dd.destroy();
+ });
+
+ $('.editor-toolbar .fa.fa-file-excel-o', '#txt-blog-write-wrapper').each((index, elem) => {
+ let dd = Dropzone.forElement(elem);
+ dd && dd.destroy();
+ });
+
+ try {
+
+ $(this.$chatMsgInputRef).textcomplete('destroy');
+ this.$chatMsgInputRef = null;
+
+ if (this.simplemde) {
+
+ this.simplemde.codemirror.off('keyup', this.editKuHandler);
+ this.editKuHandler = null;
+
+ this.simplemde.value('');
+ this.simplemde.toTextArea();
+ this.simplemde = null;
+ }
+
+ } catch (err) {
+ console.error(err);
+ }
+ }
+
/**
* 构造函数
*/
@@ -53,23 +111,25 @@ export class EmBlogWrite {
});
- this.blogTitleInputKeyupInit = _.once(() => {
- $('#blog-title-input').keyup((e) => {
- let $t = $(e.currentTarget);
+ this.blogTitleInputKuHandler = (e) => {
+ let $t = $(e.currentTarget);
- if (!e.shiftKey && e.keyCode == 13) { // Enter
- if (this.simplemde.value()) {
- this.save(e, true);
- } else {
- this.simplemde.codemirror.focus();
- }
-
- } else if (e.shiftKey && e.keyCode == 13) { // Esc
+ if (!e.shiftKey && e.keyCode == 13) { // Enter
+ if (this.simplemde.value()) {
+ this.save(e, true);
+ } else {
this.simplemde.codemirror.focus();
- } else if (e.keyCode == 27) { // Esc
- $t.val('');
}
- });
+
+ } else if (e.shiftKey && e.keyCode == 13) { // Esc
+ this.simplemde.codemirror.focus();
+ } else if (e.keyCode == 27) { // Esc
+ $t.val('');
+ }
+ };
+
+ this.blogTitleInputKeyupInit = _.once(() => {
+ $('#blog-title-input').keyup(this.blogTitleInputKuHandler);
});
}
@@ -89,9 +149,12 @@ export class EmBlogWrite {
$('#blog-save-btn span').text('保存');
$('#blog-save-btn').attr('title', 'ctrl+click快速保存');
$('#blog-title-input').val('');
- this.simplemde.value('');
- this.simplemde.toTextArea();
- this.simplemde = null;
+ if (this.simplemde) {
+ this.simplemde.value('');
+ this.simplemde.toTextArea();
+ this.simplemde = null;
+ }
+
}
_editInit() {
@@ -276,7 +339,7 @@ export class EmBlogWrite {
},
});
- this.simplemde.codemirror.on('keyup', (cm, e) => {
+ this.editKuHandler = (cm, e) => {
if (e.ctrlKey && e.keyCode == 13) { // Ctrl+Enter
this.save(e, true);
} else if (e.keyCode == 27) { // Esc
@@ -290,7 +353,9 @@ export class EmBlogWrite {
}
}
}
- });
+ };
+
+ this.simplemde.codemirror.on('keyup', this.editKuHandler);
this.$chatMsgInputRef = $('#txt-blog-write-wrapper').find('.CodeMirror textarea');
if (this.$chatMsgInputRef.size() === 0) {
@@ -488,31 +553,37 @@ export class EmBlogWrite {
initPaste() {
- let $paste;
if (this.$chatMsgInputRef.is('textarea')) {
- $paste = $(this.$chatMsgInputRef).pastableTextarea();
+ this.$paste = $(this.$chatMsgInputRef).pastableTextarea();
} else {
- $paste = $(this.$chatMsgInputRef).pastableContenteditable();
+ this.$paste = $(this.$chatMsgInputRef).pastableContenteditable();
}
- $paste && ($paste.on('pasteImage', (ev, data) => {
+ if (this.$paste) {
- $.post('/admin/file/base64', {
- dataURL: data.dataURL,
- type: data.blob.type,
- toType: 'Blog'
- }, (data, textStatus, xhr) => {
- if (data.success) {
- this.insertContent(''
- .replace(/\{name\}/g, data.data.name)
- .replace(/\{baseURL\}/g, utils.getBaseUrl() + '/')
- .replace(/\{path\}/g, data.data.path)
- .replace(/\{uuidName\}/g, data.data.uuidName));
- }
- });
- }).on('pasteImageError', (ev, data) => {
- toastr.error(data.message, '剪贴板粘贴图片错误!');
- }));
+ this.pasteHandler = (ev, data) => {
+
+ $.post('/admin/file/base64', {
+ dataURL: data.dataURL,
+ type: data.blob.type,
+ toType: 'Blog'
+ }, (data, textStatus, xhr) => {
+ if (data.success) {
+ this.insertContent(''
+ .replace(/\{name\}/g, data.data.name)
+ .replace(/\{baseURL\}/g, utils.getBaseUrl() + '/')
+ .replace(/\{path\}/g, data.data.path)
+ .replace(/\{uuidName\}/g, data.data.uuidName));
+ }
+ });
+ };
+
+ this.errHandler = (ev, data) => {
+ toastr.error(data.message, '剪贴板粘贴图片错误!');
+ };
+
+ this.$paste.on('pasteImage', this.pasteHandler).on('pasteImageError', this.errHandler);
+ }
}
initUploadDropzone(domRef, getInputTargetCb, clickable) {
@@ -599,13 +670,17 @@ export class EmBlogWrite {
* 当视图被附加到DOM中时被调用
*/
attached() {
- $('#blog-save-btn').click((event) => {
+
+ this.blogSaveHandler = (event) => {
this.save(event);
- });
+ };
- $('#switch-html').click((event) => {
+ this.switchHandler = (event) => {
this.switchEditorHandler();
- });
+ };
+
+ $('#blog-save-btn').click(this.blogSaveHandler);
+ $('#switch-html').click(this.switchHandler);
}
save(event, isKey) {
diff --git a/src/resources/elements/em-channel-chat-task-talk-modal.html b/src/resources/elements/em-channel-chat-task-talk-modal.html
index 15c8aaa27373f50a94e7c431433f1b494ebccc8b..0f7f6b78bda1055c98f23ecc02737e6a1c6ce3a2 100644
--- a/src/resources/elements/em-channel-chat-task-talk-modal.html
+++ b/src/resources/elements/em-channel-chat-task-talk-modal.html
@@ -3,7 +3,7 @@