
Product
Introducing Repository Access Permissions and Custom Roles
Socket now supports Custom Roles and Repository Access Permissions so organizations can control who can access specific repositories and actions.
s94-editor
Advanced tools
富文本编辑器的基础模块,提供富文本编辑器的基础功能,界面高度自由化
$ npm install s94-editor
var Editor = require('s94-editor');
var editor = new Editor(document.querySelector('.editor-outer'));
new Editor(textarea[, config]) 构造函数,构建编辑器
range 编辑器当前的选区返回
container 编辑器的容器
textarea 编辑器的textarea,里面承载了编辑器对应的html代码
config 配置参数
menu 菜单实例对象
belongNode(dom[, test]) 向上遍历获取符合条件的节点
setRange([range]) 设定的选择范围
updateRange([range]) 更新选择范围
updateValue() 更新textarea的值
updateHtml() 更新编辑器的html内容
execCommand(name[, data]) 执行编辑命令
alignType() 文本布局类型
isbold() 是否加粗
isstrike() 是否删除线
isitalic() 是否斜体
isunderline() 是否下划线
rangePath() 路径节点列表
lastRow() 设定最后一行空白节点
encode_tag(html) 编码html中的特殊标签(form,script)
decode_tag(html) 解码encode_tag方法编译过的html
html() 当前编辑器的html代码
new Editor.Menu(editor[, config]) 内置的菜单构造函数
Menu.menuList 所有注册的菜单
Editor.Menu.add(name, title, innerHTML, onclick) 注册菜单
container 菜单的容器
editor 菜单对应的编辑器
list 生成的菜单节点对象的键值对象
add(name, title, innerHTML, onclick) 添加菜单
showSelect(list[, options]) 显示自带的列表类型子菜单
showForm(list[, options]) 显示自带的表单类型子菜单
Node 构建编辑器容器的样本,必须为textarea元素Object 配置数据,查看详细介绍Editor 编辑器对象以textarea为样本,复制textarea的所有attr来窗初编辑器的容器,同时也是用来承载编辑器对应的html代码的容器
var Editor = require('s94-editor');
var editor = new Editor(document.querySelector('.editor-outer'));
Range 选择范围,查看详细介绍获取编辑器当前的选区返回
Node 编辑器的容器获取编辑器当前所在的容器
Node textarea获取编辑器构建的样本textarea元素,编辑器对应的html代码会不间断的赋值到该元素的value属性上。
但是不能完全保证该元素的value等同于
editor.html()(例如当使用js改变了编辑器容器内的html后,没有调用updateValue方法的时候)。所有获取编辑器内容的html依然建议调用editor.html()方法
Object 配置参数获取编辑器当前配置参数,该对象的值是构造函数传入的
config和默认的配置参数合并后的结果
Editor.Menu|config.Menu 菜单实例对象编辑器的菜单实例对象
Node 开始节点Function 判断方法,方法的this为当前判断的节点对象,方法返回true表示当前节点符合条件,默认this.nodeType===1为判断条件Node|False 符合条件的节点,如果直到容器节点也没用符合的,返回false向上遍历获取符合条件的节点
console.log(editor.belongNode(editor.range.startContainer)); //打印当前编辑的节点
Range 选择范围对象,查看详细介绍。默认为当前Editor的rangeEditor 编辑器对象设定浏览器的选择范围,有获取锚地的效果。
editor.setRange();
Range 选择范围对象,查看详细介绍。默认为浏览器的选择范围Editor 编辑器对象更新当前
Editor的range,该方法组件会在必要的时候自动调用
该方法调用后,会在
editor.container上广播update:range事件,事件对象的range属性可以获取当前Editor的range
editor.updateRange();
Editor 编辑器对象更新textarea的value属性,该方法组件会在必要的时候自动调用,一般用于用户自定义菜单功能时,如果该功能对内容有变化的时候调用该方法,同步textarea中的值
该方法调用后,会在
editor.container上广播update:value事件,事件对象的value属性可以获取编辑器对应的html
editor.updateValue();
Editor 编辑器对象更新编辑器的html内容,该方法根据textarea的value重新渲染编辑器容器的html内容。
editor.updateHtml();
String 执行命令名称。等同于document.execCommand的第1个参数mixed 执行附带参数,默认为null。等同于document.execCommand的第3个参数,部分优化的不同Editor 编辑器对象在当前编辑位置,执行编辑命令。查看详细介绍,对
document.execCommand做了部分优化见代码示例
//createLink
editor.execCommand("createLink", "http://s94.top"); //插入 <a href="http://s94.top">http://s94.top</a>
editor.execCommand("createLink", {
text: "牧人与鱼",
href: "http://s94.top"
}); //插入 <a href="http://s94.top">牧人与鱼</a>
//foreColor、hiliteColor、bold、strikeThrough、italic、underline
editor.execCommand("bold", true); //data为true表示当选区为一个点时,在当前位置插入不占位的空白字符,方便判断当前节点是否为加粗
String 文本布局类型,left|center|full|right返回当前选区的文本布局类型,是对节点的
text-align样式结果的统一化
console.log(editor.alignType()); //left
Boolean 是否加粗返回当前选区的节点文本样式是否为 加粗
console.log(editor.isbold()); //false
Boolean 是否加粗返回当前选区的节点文本样式是否为 删除线
console.log(editor.isstrike()); //false
Boolean 是否加粗返回当前选区的节点文本样式是否为 斜体
console.log(editor.isitalic()); //false
Boolean 是否加粗返回当前选区的节点文本样式是否为 下划线
console.log(editor.isunderline()); //false
Array 路径节点列表,返回当前选区的节点路径节点列表,
var nodeNamePath=[];
editor.rangePath().forEach(function(row){
nodeTypePath.push(row.nodeName);
})
console.log(nodeNamePath.join(">")); //div>p>span
Node 最后一行的节点对象检测最后一行是否为空的P标签,如果不是,添加一个空的没用样式的P标签。并返回。该方法主要用于在执行编辑内容的样式修改后,很多情况下换行后会把之前的样式带上,所以需要调用该方法获取一行没有被污染的P标签
editor.lastRow();
String 编码后的html代码编码html中的特殊标签(form,script)。
编码script的目的:防止编辑的html代码里面的js代码污染
编码form的目的:当编辑器放在form表单里面的时候,如果编辑器里面存在form标签的内容,浏览器会移除form标签,造成内容丢失
console.log(editor.encode_tag('<form action=""></form><script></script>')); //<form-editor-change-tagname action=""></form-editor-change-tagname><script-editor-change-tagname></script-editor-change-tagname>
String 解码后的html代码解码
encode_tag方法编码后的html字符串
var coed = editor.encode_tag('<form action=""></form><script></script>');
var html = editor.decode_tag(code);
console.log(html); //<form action=""></form><script></script>
String 编辑器的html代码返回当前编辑器的html代码。在
this.container.innerHTML的基础上执行了decode_tag和剔除了lastRow方法加入的空白P标签
console.log(editor.html()); //.......
Array 使用内置菜单时,设定菜单的字体颜色和背景颜色集合Array 使用内置菜单时,设定菜单的字体大小集合,长度最大为7Function 使用内置菜单-图片时,此参数表示点击此菜单后的处理,确认好图片地址后,可以通过直接返回,或者执行函数接受一个参数next然后传入图片地址,具体参考s94-js的new s94.Ready(f)Array 使用内置菜单时,设定显示的菜单列表,同时具备排序效果。Function 粘贴内容处理,接收s94.fn对象(类似jQuery对象),要求返回节点集Function 自定义菜单构造函数,如果传入将替换组件自带的菜单,传入当前Editor编辑器对象除了这些字段,开发者也可以根据自己扩展的功能,自定义配置参数字段,然后可以在
editor.config和editor.menu.config里面去获取。
var Editor = require('s94-editor');
var editor = new Editor(document.querySelector('.editor-outer'), {
colors: ['#333','rgb(194, 250, 94)'], //自定义组件菜单的字体颜色和背景颜色列表
fontsizes: ['12px','0.2rem'], //自定义字体大小列表,最多7个
menus: ['bold','color'],
onpaste: function(list){
list.forEach(function(row){
list.find('img').css("width", "100%"); //设定粘贴的图片样式
return list;
})
},
Menu: function(editor){
var dom = document.createElement('button');
dom.innerHTML = '菜单示例';
$(editor.container).after(dom);
dom.addEventListener('click', function(){
var html = `<h1>这是插入的标题</h1>`;
editor.execCommand('insertHTML', html);
editor.range = document.createRange();
var lastNode = editor.lastRow();
editor.range.setStart(lastNode, 0);
editor.range.setEnd(lastNode, 0);
editor.setRange();
})
}
});
Editor 编辑器对象Object 配置数据,类似Editor构造函数的config参数Editor.Menu 菜单实例对象内置的菜单,一般不用不需要调用,当没有在
Editor构造函数的config参数设定Menu的情况下,会自动调用,返回结果赋值到editor.menu
var menu = new Editor.Menu(editor);
Object 全局的菜单列表里面包含所有注册的菜单,主要用于查看已有的菜单或者修改某个菜单。如果需要自定义菜单建议调用
Editor.Menu.add(name, title, innerHTML, onclick)方法
var Editor = require('s94-editor');
Editor.Menu.menuList['bold']['onclick'] = function(menu){
alert("这是修改后的加粗菜单功能")
}
//全局菜单的操作需要在Editor实例化之前调用
var editor = new Editor(document.querySelector('.editor-outer'));
String 组件名称,作为Menu.menuList和menu.list里面存储的keyString 鼠标放上去显示的提示信息String 组件菜单htmlFunction 组件菜单onclick事件回调函数,函数接收的第一个参数不是event,而是menu;this不变,为当前菜单节点对象Editor.Menu.menuList 所有注册的菜单键值对象该方法用于注册菜单,一般用于全局自定义菜单,示例如下:
var Editor = require('s94-editor');
Editor.Menu.add("test", "测试菜单", '<p style="font-size: 0.6em;">测试</p>', function(menu){
var editor = menu.editor;
var html = `<h1>这是插入的标题</h1>`;
editor.execCommand('insertHTML', html);
editor.range = document.createRange();
var lastNode = editor.lastRow();
editor.range.setStart(lastNode, 0);
editor.range.setEnd(lastNode, 0);
editor.setRange();
})
//全局菜单的操作需要在Editor实例化之前调用
var editor = new Editor(document.querySelector('.editor-outer'));
Node 菜单的容器获取菜单的容器,一把用于自定义菜单位置。菜单的默认位置在编辑器容器的前方,可以使用
appendChild方法自定义菜单位置
var Editor = require('s94-editor');
var editor = new Editor(document.querySelector('.editor-outer'));
document.querySelector('#editor-menu').appendChild(editor.menu.container); //把菜单放到#editor-menu里面去
Editor 当前菜单对应的编辑器的实例获取当前的编辑器示例,一般用于自定义菜单里面方便调用
editor的方法,查看详细介绍
Object 生成的菜单节点对象键值对象,key为菜单的name,{name: Node}菜单在实例化后,会根据
config.menus和全局注册的菜单来生成菜单,并把生成的菜单节点对象存储在menu.list方便调用
String 组件名称,作为menu.list里面存储的keyString 鼠标放上去显示的提示信息String 组件菜单htmlFunction 组件菜单onclick事件回调函数,函数接收的第一个参数不是event,而是menu;this不变,为当前菜单节点对象Object 所有生成的菜单键值对象menu.list添加菜单,
Menu在实例化的时候,会遍历全局菜单列表执行此方法挨个添加菜单。同时,在实例化后,依然可以调用此方法,用于局部添加菜单,不过这样添加的菜单,不能排序,只能添加到末尾。如果需要排序,同时也不希望每个编辑器都有该菜单,请全局注册后,用config.menus实现
var Editor = require('s94-editor');
var editor = new Editor(document.querySelector('.editor-outer'));
editor.menu.add('test2','测试2','测试',function(menu){
alert("测试2")
})
Array 菜单配置列表,[{innerHTML:String, onclick:Function}],参数说明,类似menu.add方法Object 菜单配置,{type:String, className:String, close:Function}
String 列表布局类型,droplist下拉菜单样式,pointlist点阵样式。默认为droplistString 自定义容器className,方便自定义样式Function 菜单关闭时的回调方法,方法this为子菜单节点对象underfind显示自带的列表类型子菜单,组件自带的heading、size、align、color、bgcolor都使用了该子菜单,开发者可以在自定义菜单时使用
var Editor = require('s94-editor');
var editor = new Editor(document.querySelector('.editor-outer'));
editor.menu.add('test2','测试2','测试',function(menu){
menu.showSelect([
{innerHTML: 'H1', onclick: function(menu){menu.editor.execCommand('formatBlock','h1')}},
{innerHTML: 'H2', onclick: function(menu){menu.editor.execCommand('formatBlock','h2')}},
])
})
list Array 菜单配置列表,[{type:String, name:String, label:String, value:String, list:Array, }],参数说明:
String 表单组件类型,可选值:textarea | select | text ,默认为textString 表单组件的name,必须,在提交后,作为获取数据的键值String 表单组件的提示信息String 表单组件默认初始值Array 此字段为select组件特有,表示下拉的option列表,格式{html:String, value:String}options Object 菜单配置,{title:String, className:String, ok:Function, close:Function}
String 表单的标题String 自定义容器className,方便自定义样式Function 菜单点击确定后提交的方法,接收一个键值对对象,里面包含表单的数据,方法this为子菜单节点对象Function 菜单关闭时的回调方法,方法this为子菜单节点对象返回 underfind
显示自带的表单类型子菜单,组件自带的style、code都使用了该子菜单,开发者可以在自定义菜单时使用
var Editor = require('s94-editor');
var editor = new Editor(document.querySelector('.editor-outer'));
editor.menu.add('test2','测试2','测试',function(menu){
menu.showForm([
{name: "type", label: "操作", type: "select", value: 0, list: [
{html:"下载图片", value: 1},
{html:"直接插入图片", value: 0}
]},
{name: "src", label: "图片地址"},
], {
title: '添加图片',
ok: function(data){
if(!data.src) return;
if(data.type==0){
menu.editor.execCommand('insertImage', data.src);
}else{
//记录当前编辑位置
var range = menu.editor.range;
// TODO 此处请求服务器,下载图片,然后返回自己服务器保存地址,再插入图片。由于请求服务器一般异步操作,此处用setTimeout代替效果
setTimeout(function(){
menu.editor.setRange(range);
menu.editor.execCommand('insertImage', data.src);
},5000)
}
}
});
})
FAQs
The npm package s94-editor receives a total of 21 weekly downloads. As such, s94-editor popularity was classified as not popular.
We found that s94-editor demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket now supports Custom Roles and Repository Access Permissions so organizations can control who can access specific repositories and actions.

Product
Socket MCP now lets AI assistants review org alerts, investigate threats using the Socket threat feed, and inspect package files in addition to dependency scoring.

Product
Socket Firewall blocks malicious VS Code and Open VSX extensions before install, protecting developers from compromised editor marketplaces.