内部函数在 firefox 中不起作用,但在 chrome 中可以
Inner function does't work in firefox, but its okay in chrome
我编写此代码是为了初始化一个编辑器,但我的代码在 Firefox 浏览器中的行为有所不同。
这是我的代码的一部分:
window.hexbit.widget = {
.
.
.
initEditorOn: function (editorId, mediaButtons = false) {
// check id is real
if (!document.getElementById(editorId) ||
editorId.endsWith('__i__')) {
return;
}
// The user has disabled TinyMCE.
if (typeof window.tinyMCE === 'undefined') {
wp.editor.initialize(editorId, {
quicktags: true
});
return;
}
if (window.tinyMCE.get(editorId) !== null) {
console.log('window.tinyMCE.get(editorId) !== null', window.tinyMCE.get(editorId))
// reinitialize editor
window.tinyMCE.get(editorId).on('remove', function () {
console.log('removed');
window.setTimeout(function () {
window.hexbit.widget.initEditorOn(editorId, mediaButtons);
}, 50);
});
wp.editor.remove(editorId);
return
}
//init tinyMCE
window.wp.editor.initialize(editorId, {
mediaButtons: mediaButtons,
tinymce: {
forced_root_block: false,
remove_linebreaks: false,
remove_trailing_brs: false,
verify_html: false,
mode: 'html',
textarea_rows: 4,
entity_encoding: "raw",
init_instance_callback: function (editor) {
editor.getBody().style.backgroundColor = "#F4FFFF";
// rebuild editor if iframe destroyed
jQuery(editor.getWin()).on('unload', function () {
console.log('#########HERE############ ')
window.hexbit.widget.initEditorOn(editorId, mediaButtons);
});
},
setup: function (editor) {
// important to save in live edit
editor.on('keyup execcommand paste', window.tinyMCE.util.Delay.debounce(function (e) {
window.tinyMCE.triggerSave();
}, 1000));
editor.on('keyup execcommand paste', window.tinyMCE.util.Delay.debounce(function (e) {
$('body #' + editorId).trigger('change');
}, 3000));
},
});
},
.
.
.
}
问题是:虽然此代码在 Chrome 中运行良好,但在 Firefox 中调用此 jQuery(editor.getWin()).on('unload', function () {}
回调时,我的调试日志 console.log('#########HERE############ ')
按预期打印出来,但是这一行window.hexbit.widget.initEditorOn(editorId, mediaButtons);
不叫!
我找不到这个错误的原因,请解释一下是否有人知道。
谢谢...
我通过使用延迟为 0 的 setTimeOut
来解决这个问题,另外 underscore js 有一个函数 _.defer(function, *arguments) 延迟调用函数直到当前调用堆栈已清除,类似于使用延迟为 0 的 setTimeout。
它对于执行昂贵的作业或 HTML 分块渲染很有用,而不会阻止 UI 线程更新。
我编写此代码是为了初始化一个编辑器,但我的代码在 Firefox 浏览器中的行为有所不同。
这是我的代码的一部分:
window.hexbit.widget = {
.
.
.
initEditorOn: function (editorId, mediaButtons = false) {
// check id is real
if (!document.getElementById(editorId) ||
editorId.endsWith('__i__')) {
return;
}
// The user has disabled TinyMCE.
if (typeof window.tinyMCE === 'undefined') {
wp.editor.initialize(editorId, {
quicktags: true
});
return;
}
if (window.tinyMCE.get(editorId) !== null) {
console.log('window.tinyMCE.get(editorId) !== null', window.tinyMCE.get(editorId))
// reinitialize editor
window.tinyMCE.get(editorId).on('remove', function () {
console.log('removed');
window.setTimeout(function () {
window.hexbit.widget.initEditorOn(editorId, mediaButtons);
}, 50);
});
wp.editor.remove(editorId);
return
}
//init tinyMCE
window.wp.editor.initialize(editorId, {
mediaButtons: mediaButtons,
tinymce: {
forced_root_block: false,
remove_linebreaks: false,
remove_trailing_brs: false,
verify_html: false,
mode: 'html',
textarea_rows: 4,
entity_encoding: "raw",
init_instance_callback: function (editor) {
editor.getBody().style.backgroundColor = "#F4FFFF";
// rebuild editor if iframe destroyed
jQuery(editor.getWin()).on('unload', function () {
console.log('#########HERE############ ')
window.hexbit.widget.initEditorOn(editorId, mediaButtons);
});
},
setup: function (editor) {
// important to save in live edit
editor.on('keyup execcommand paste', window.tinyMCE.util.Delay.debounce(function (e) {
window.tinyMCE.triggerSave();
}, 1000));
editor.on('keyup execcommand paste', window.tinyMCE.util.Delay.debounce(function (e) {
$('body #' + editorId).trigger('change');
}, 3000));
},
});
},
.
.
.
}
问题是:虽然此代码在 Chrome 中运行良好,但在 Firefox 中调用此 jQuery(editor.getWin()).on('unload', function () {}
回调时,我的调试日志 console.log('#########HERE############ ')
按预期打印出来,但是这一行window.hexbit.widget.initEditorOn(editorId, mediaButtons);
不叫!
我找不到这个错误的原因,请解释一下是否有人知道。
谢谢...
我通过使用延迟为 0 的 setTimeOut
来解决这个问题,另外 underscore js 有一个函数 _.defer(function, *arguments) 延迟调用函数直到当前调用堆栈已清除,类似于使用延迟为 0 的 setTimeout。
它对于执行昂贵的作业或 HTML 分块渲染很有用,而不会阻止 UI 线程更新。