📄 editor2.js
字号:
{ execute: function(){ if(!this.dialog){ if(!this.dialogParas.contentFile || !this.dialogParas.contentClass){ alert("contentFile and contentClass should be set for dojo.widget.Editor2DialogCommand.dialogParas!"); return; } this.dialog = dojo.widget.createWidget("Editor2Dialog", this.dialogParas); dojo.body().appendChild(this.dialog.domNode); dojo.event.connect(this, "destroy", this.dialog, "destroy"); } this.dialog.show(); }});// summary:// dojo.widget.Editor2 is the WYSIWYG editor in dojo with toolbar. It supports a plugin// framework which can be used to extend the functionalities of the editor, such as// adding a context menu, table operation etc.// description:// Plugins are available using dojo's require syntax. Please find available built-in plugins// under src/widget/Editor2Plugin.dojo.widget.defineWidget( "dojo.widget.Editor2", dojo.widget.RichText, {// // String: url to which save action should send content to// saveUrl: "",// // String: HTTP method for save (post or get)// saveMethod: "post",// saveArgName: "editorContent",// closeOnSave: false, // Boolean: Whether to share toolbar with other instances of Editor2 shareToolbar: false, // Boolean: Whether the toolbar should scroll to keep it in the view toolbarAlwaysVisible: false,// htmlEditing: false, toolbarWidget: null, scrollInterval: null, // Object: dojo.uri.Uri object to specify the template file for the toolbar toolbarTemplatePath: dojo.uri.dojoUri("src/widget/templates/EditorToolbarOneline.html"), // Object: dojo.uri.Uri object to specify the css file for the toolbar toolbarTemplateCssPath: null,// toolbarTemplatePath: dojo.uri.dojoUri("src/widget/templates/Editor2/EditorToolbarFCKStyle.html"),// toolbarTemplateCssPath: dojo.uri.dojoUri("src/widget/templates/Editor2/FCKDefault/EditorToolbarFCKStyle.css"), _inSourceMode: false, _htmlEditNode: null, editorOnLoad: function(){ // summary: // Create toolbar and other initialization routines. This is called after // the finish of the loading of document in the editing element// dojo.profile.start("dojo.widget.Editor2::editorOnLoad"); dojo.event.topic.publish("dojo.widget.Editor2::preLoadingToolbar", this); if(this.toolbarAlwaysVisible){ dojo.require("dojo.widget.Editor2Plugin.AlwaysShowToolbar"); } var toolbars = dojo.widget.byType("Editor2Toolbar"); if((!toolbars.length)||(!this.shareToolbar)){ if(this.toolbarWidget){ this.toolbarWidget.show(); //re-add the toolbar to the new domNode (caused by open() on another element) dojo.html.insertBefore(this.toolbarWidget.domNode, this.domNode.firstChild); }else{ var tbOpts = {}; tbOpts.templatePath = this.toolbarTemplatePath; if(this.toolbarTemplateCssPath){ tbOpts.templateCssPath = this.toolbarTemplateCssPath; } this.toolbarWidget = dojo.widget.createWidget("Editor2Toolbar", tbOpts, this.domNode.firstChild, "before"); dojo.event.connect(this, "close", this.toolbarWidget, "hide"); this.toolbarLoaded(); } }else{ // FIXME: selecting in one shared toolbar doesn't clobber // selection in the others. This is problematic. this.toolbarWidget = toolbars[0]; } dojo.event.topic.registerPublisher("Editor2.clobberFocus", this, "clobberFocus"); dojo.event.topic.subscribe("Editor2.clobberFocus", this, "setBlur"); dojo.event.topic.publish("dojo.widget.Editor2::onLoad", this);// dojo.profile.end("dojo.widget.Editor2::editorOnLoad"); }, //event for plugins to use toolbarLoaded: function(){ // summary: // Fired when the toolbar for this editor is created. // This event is for plugins to use }, //TODO: provide a query mechanism about loaded plugins? registerLoadedPlugin: function(/*Object*/obj){ // summary: Register a plugin which is loaded for this instance if(!this.loadedPlugins){ this.loadedPlugins = []; } this.loadedPlugins.push(obj); }, unregisterLoadedPlugin: function(/*Object*/obj){ // summery: Delete a loaded plugin for this instance for(var i in this.loadedPlugins){ if(this.loadedPlugins[i] === obj){ delete this.loadedPlugins[i]; return; } } dojo.debug("dojo.widget.Editor2.unregisterLoadedPlugin: unknow plugin object: "+obj); }, //overload the original ones to provide extra commands execCommand: function(/*String*/command, argument){ switch(command.toLowerCase()){ case 'htmltoggle': this.toggleHtmlEditing(); break; default: dojo.widget.Editor2.superclass.execCommand.apply(this, arguments); } }, queryCommandEnabled: function(/*String*/command, argument){ switch(command.toLowerCase()){ case 'htmltoggle': return true; default: if(this._inSourceMode){ return false;} return dojo.widget.Editor2.superclass.queryCommandEnabled.apply(this, arguments); } }, queryCommandState: function(/*String*/command, argument){ switch(command.toLowerCase()){ case 'htmltoggle': return this._inSourceMode; default: return dojo.widget.Editor2.superclass.queryCommandState.apply(this, arguments); } }, onClick: function(/*Event*/e){ dojo.widget.Editor2.superclass.onClick.call(this, e); //if Popup is used, call dojo.widget.PopupManager.onClick //manually when click in the editing area to close all //open popups (dropdowns) if(dojo.widget.PopupManager){ if(!e){ //IE e = this.window.event; } dojo.widget.PopupManager.onClick(e); } }, clobberFocus: function(){ // summary: stub to signal other instances to clobber focus }, toggleHtmlEditing: function(){ // summary: toggle between WYSIWYG mode and HTML source mode if(this===dojo.widget.Editor2Manager.getCurrentInstance()){ if(!this._inSourceMode){ this._inSourceMode = true; if(!this._htmlEditNode){ this._htmlEditNode = dojo.doc().createElement("textarea"); dojo.html.insertAfter(this._htmlEditNode, this.editorObject); } this._htmlEditNode.style.display = ""; this._htmlEditNode.style.width = "100%"; this._htmlEditNode.style.height = dojo.html.getBorderBox(this.editNode).height+"px"; this._htmlEditNode.value = this.editNode.innerHTML; //activeX object (IE) doesn't like to be hidden, so move it outside of screen instead with(this.editorObject.style){ position = "absolute"; left = "-2000px"; top = "-2000px"; } }else{ this._inSourceMode = false; //In IE activeX mode, if _htmlEditNode is focused, //when toggling, an error would occur, so unfocus it this._htmlEditNode.blur(); with(this.editorObject.style){ position = ""; left = ""; top = ""; } dojo.lang.setTimeout(this, "replaceEditorContent", 1, this._htmlEditNode.value); this._htmlEditNode.style.display = "none"; this.focus(); } this.updateToolbar(true); } }, setFocus: function(){ // summary: focus is set on this instance// dojo.debug("setFocus: start "+this.widgetId); if(dojo.widget.Editor2Manager.getCurrentInstance() === this){ return; } this.clobberFocus();// dojo.debug("setFocus:", this); dojo.widget.Editor2Manager.setCurrentInstance(this); }, setBlur: function(){ // summary: focus on this instance is lost// dojo.debug("setBlur:", this); //dojo.event.disconnect(this.toolbarWidget, "exec", this, "execCommand"); }, saveSelection: function(){ // summary: save the current selection for restoring it this._bookmark = null; this._bookmark = dojo.withGlobal(this.window, dojo.html.selection.getBookmark); }, restoreSelection: function(){ // summary: restore the last saved selection if(this._bookmark){ this.focus(); //require for none-activeX IE dojo.withGlobal(this.window, "moveToBookmark", dojo.html.selection, [this._bookmark]); this._bookmark = null; }else{ dojo.debug("restoreSelection: no saved selection is found!"); } }, _updateToolbarLastRan: null, _updateToolbarTimer: null, _updateToolbarFrequency: 500, updateToolbar: function(/*Boolean*/force){ // summary: update the associated toolbar of this Editor2 if((!this.isLoaded)||(!this.toolbarWidget)){ return; } // keeps the toolbar from updating too frequently // TODO: generalize this functionality? var diff = new Date() - this._updateToolbarLastRan; if( (!force)&&(this._updateToolbarLastRan)&& ((diff < this._updateToolbarFrequency)) ){ clearTimeout(this._updateToolbarTimer); var _this = this; this._updateToolbarTimer = setTimeout(function() { _this.updateToolbar(); }, this._updateToolbarFrequency/2); return; }else{ this._updateToolbarLastRan = new Date(); } // end frequency checker //IE has the habit of generating events even when this editor is blurred, prevent this if(dojo.widget.Editor2Manager.getCurrentInstance() !== this){ return; } this.toolbarWidget.update(); }, destroy: function(/*Boolean*/finalize){ this._htmlEditNode = null; dojo.event.disconnect(this, "close", this.toolbarWidget, "hide"); if(!finalize){ this.toolbarWidget.destroy(); } dojo.widget.Editor2.superclass.destroy.call(this); }, onDisplayChanged: function(/*Object*/e){ dojo.widget.Editor2.superclass.onDisplayChanged.call(this,e); this.updateToolbar(); }, onLoad: function(){ try{ dojo.widget.Editor2.superclass.onLoad.call(this); }catch(e){ // FIXME: debug why this is throwing errors in IE! dojo.debug(e); } this.editorOnLoad(); }, onFocus: function(){ dojo.widget.Editor2.superclass.onFocus.call(this); this.setFocus(); }, //overload to support source editing mode getEditorContent: function(){ if(this._inSourceMode){ this.replaceEditorContent(this._htmlEditNode.value); } return dojo.widget.Editor2.superclass.getEditorContent.call(this); } /*, // FIXME: probably not needed any more with new design, but need to verify _save: function(e){ // FIXME: how should this behave when there's a larger form in play? if(!this.isClosed){ dojo.debug("save attempt"); if(this.saveUrl.length){ var content = {}; content[this.saveArgName] = this.getEditorContent(); dojo.io.bind({ method: this.saveMethod, url: this.saveUrl, content: content }); }else{ dojo.debug("please set a saveUrl for the editor"); } if(this.closeOnSave){ this.close(e.getName().toLowerCase() == "save"); } } }*/ }, "html");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -