
简介KindEditorASP版是一款面向老旧ASP应用的开源富文本编辑器升级方案重点解决传统编辑器在Chrome、Firefox、Edge等现代浏览器下的兼容问题。它提供从文字排版、图片批量上传到多媒体插入、HTML源码编辑的完整功能适合维护旧系统或需快速集成内容编辑能力的ASP开发者。包体共206个文件约607KB32个JS文件负责核心逻辑与初始化配置151个GIF提供工具栏图标和界面素材5个ASP文件实现上传、文件管理与JSON交互等后端能力另有示例页面、CSS样式和说明文档部署时直接解压并引用即可。整体结构精简、服务端脚本齐全。当前已有438人学习下载。压缩包内包含可直接引用的JS、样式与服务端脚本且自带示例页面和配置说明。开发者可快速完成编辑器初始化、参数调整及提交数据回显无需从零搭建让老旧项目以低成本获得现代浏览器的完整体验。 手头捏着这份KindEditorASP版编辑器兼容最新浏览器.rar我第一反应是这年头还专门打包一个 ASP 版富文本编辑器的人多半是还在维护老项目而且被 Chrome 更新折腾得够呛。KindEditor 本身是国内开发者用过很多年的开源富文本编辑器ASP 版本则是配合传统 ASPVBScript / JScript后端使用的那一套。这个压缩包解决的问题很直接让老掉牙的 KindEditor 能在当前主流的 Chrome、Edge、Firefox 里正常出按钮、能上传、不报脚本错。如果你接手的是一个 2008 到 2015 年之间上线的网站后台里面十有八九躺着这个编辑器。当年它靠“一个 CSS 一行 JS 就能初始化”的轻量优势碾压过 FCKEditor后来官方停止维护浏览器一路更新老版本在 Chrome 里就频繁掉链子。这个压缩包想做的就是给这类遗留系统续命。1. 这个压缩包要解决什么问题1.1 老编辑器的典型翻车现场先说症状你自己对照一下大概率能对号入座。工具栏整排按钮点下去没反应控制台报Object doesnt support property or method attachEvent或是swfobject is undefined图片上传按钮弹不出文件选择框或者上传后一直转圈最后给你个“上传失败”的红色提示编辑器内容区和工具栏错位弹窗里表格显示成一堆乱码。这些还不是最恶心的最恶心的是同样是 Chrome公司电脑正常客户电脑崩了。因为客户浏览器更新到 90 以上后老版本的 swfobject.js 会触发一个极其隐蔽的错误代码里用了document.all判断浏览器类型Chrome 新版本对这类老对象的兼容策略变了脚本直接中断。这个压缩包里的“兼容最新浏览器”核心就是把这类历史遗留问题处理一遍替换老掉牙的浏览器判断逻辑、修复上传控件的新浏览器适配、调整弹窗和 iframe 的交互方式。它不是一个重新开发的编辑器而是给官方不再维护的 KindEditor 打上一套兼容补丁。1.2 为什么KindEditor在ASP环境还值得用很多人会问都什么年代了还折腾 ASP直接把编辑器换成 TinyMCE 或 wangEditor 不就完了吗换编辑器确实能解一时之痛但代价极高。老系统的内容都是 HTML 格式存到数据库里的KindEditor 生成的 HTML 结构相对简单是p,span,img这套语义化标签而 TinyMCE 默认会写入大量内联样式和注释标记WangEditor 的 HTML 规范也不同。如果整个系统几十万个内容页面都已经用 KindEditor 排版好了换编辑器不仅要做数据清洗还要让运营重新学习操作习惯这成本远超修一个编辑器本身。再说 ASP 这边很多老后台的权限校验、登录状态、上传目录权限都绑在 ASP 的 Session 和 Application 里。KindEditor 的 ASP 版上传接口是upload_json.asp可以直接复用这套 Session 校验改动面最小。这也是这个压缩包存在的意义不推翻系统只把编辑器这层修到能用。2. KindEditor兼容性问题的底层原理2.1 编辑器核心的渲染与交互机制KindEditor 的实现思路在富文本编辑器里属于“iframe 派”。初始化时它会在页面里创建两个东西一个是隐藏的textarea用来保存最终 HTML 内容另一个是可视化的iframe编辑器的工具栏绑定在上面的document上。用户输入的内容其实在 iframe 里KindEditor 监听 iframe 的oninput和onkeyup事件把内容实时同步到 textarea。提交表单时服务端读到的就是 textarea 的值。这个机制本身并不过时TinyMCE 6 也是类似架构。问题出在 KindEditor 内部对“iframe 内容操作”的写法上。比如它获取 iframe 内容时用的是iframe.contentWindow.document这在现代浏览器里依然正常但它判断 iframe 是否加载完成时用了iframe.contentWindow.attachEvent这类老接口Chrome 进入 60 版本后彻底移除了attachEvent脚本就卡在了初始化这一步。工具栏按钮不响应、上传弹窗出不来根因基本都在这。这也是为什么 KindEditor 初次加载偶尔能用、刷新后白屏第一次加载时浏览器有缓存某些脚本被延迟执行躲过了报错刷新后脚本按正常顺序执行直接就崩了。2.2 新版浏览器删了哪些老接口具体来说KindEditor 装包时引用了一个叫 swfobject 的库用它来编译上传控件历史上用过 Flash 上传。swfobject 2.2 及更早版本里有这一段逻辑if (navigator.userAgent.indexOf(MSIE) 0 !window.opera) { isIE true; } else if (typeof document.all ! undefined) { isIE true; }document.all这个对象是 IE 的遗留物Chrome 早期为了兼容还保留它后来官方明确要移除。浏览器一旦移除typeof document.all ! undefined会返回false但又在别处依赖这段判断的结果连锁反应就出来了。压缩包里的修复方案基本都会把 swfobject 升级到 2.3 或直接移除不再依赖document.all改用document.addEventListener来判断浏览器行为。另外 KindEditor 还喜欢用window.showModalDialog打开弹窗这在 IE 时代是标准 APIChrome 43 后直接删了。如果你看到点击图片按钮时弹出来的不是对话框而是一个新标签页或直接没反应就是这个原因。修复方式是把弹窗改成普通window.open。3. 压缩包的核心结构与关键代码3.1 前端安装包的正确打开方式解压这个 rar你会看到典型的 KindEditor 目录大概长这样kindeditor/ ├── kindeditor.js ├── kindeditor-min.js ├── kindeditor-all.js ├── kindeditor-all-min.js ├── lang/ │ ├── zh-CN.js │ └── en.js ├── plugins/ │ ├── image/ │ ├── flash/ │ ├── table/ │ ├── filemanager/ │ └── ... ├── upload_json.asp ├── file_manager_json.asp └── themes/ ├── default/ └── simple/注意editor.js的加载顺序和文件选择有讲究。调试用kindeditor-all.js所有插件都打包在内方便定位问题线上部署用kindeditor-all-min.js压缩过体积小。lang必须引否则界面全是英文。如果只引了kindeditor.js而不引插件工具栏上的图片、代码、视频按钮都会是无效的——你点它没有任何反应控制台还会报“plugin undefined”之类的错误。之前有好几个人拿着“兼容包”问我为什么按钮还是点了没反应结果一检查plugins 目录压根没拷进服务器。提示给遗留系统换新编辑器包之前先把整站备份一份特别是kindeditor/目录。老项目的代码改起来容易退回去麻烦。3.2 ASP后端上传对接的必改参数upload_json.asp是 KindEditor 在后端处理上传请求的文件。它接收dir参数可选 image、flash、media、file然后根据目录类型决定保存路径。核心代码逻辑类似% Dim dir, savePath, saveUrl, fileExt, fileName dir Request(dir) If dir image Then savePath /attached/image/ saveUrl /attached/image/ fileExt gif|jpg|jpeg|png|bmp ElseIf dir flash Then savePath /attached/flash/ saveUrl /attached/flash/ fileExt swf|flv ElseIf dir media Then savePath /attached/media/ saveUrl /attached/media/ fileExt swf|flv|mp3|wav|wma|wmv|mid|avi|mpg|asf|rm|rmvb|mp4 Else savePath /attached/file/ saveUrl /attached/file/ fileExt doc|docx|xls|xlsx|ppt|htm|html|txt|zip|rar|gz|bz2|pdf End If %这里最容易忽略的是两个权限问题。第一IIS 的 Web 站点必须给attached/目录开写入权限否则上传提示成功但磁盘上没文件。第二保存目录如果位于站点根目录之外saveUrl还要处理成虚拟路径否则前端图片直接不显示。你可以直接在浏览器里访问upload_json.asp?dirimage如果返回的不是错误页面说明 ASP 运行环境没问题。另外上传请求里会带一个order参数KindEditor 官方版通过它来做“覆盖或重命名”的表头控制但国内很多二次开发版本把它改成了自定义逻辑。你部署时如果能找到调用上传接口的地方比如image.js里的urlType: absolute这种配置那说明这套代码是用相较新的版本二次开发的对兼容性的要求会更高。4. 实操落地完整部署步骤4.1 前端页面集成不管你是要新接入还是替换旧包前端集成套路是固定的。在页面head里放link relstylesheet href/kindeditor/themes/default/default.css / script charsetutf-8 src/kindeditor/kindeditor-all.js/script script charsetutf-8 src/kindeditor/lang/zh-CN.js/script一定记得加charsetutf-8。KindEditor 的 JS 文件如果被误判为 GBK 或浏览器默认编码中文工具栏直接就乱了。在页面底部初始化编辑器script var editor; KindEditor.ready(function (K) { editor K.create(#content, { width: 700px, height: 400px, filterMode: true, // 过滤掉不安全的HTML标签 allowFileManager: true, // 开启文件管理 uploadJson: /kindeditor/upload_json.asp, fileManagerJson: /kindeditor/file_manager_json.asp }); }); /script如果要提交官方推荐的方式不是editor.sync()后逐个取而是在 form 的 submit 事件里统一调用K.ready(function() { K.create(#content); }); // 表单提交前同步 beforeSubmit function() { editor.sync(); };这里有个坑老官方文档喜欢让大家写editor.sync()在onsubmit里但如果页面里同时有多个 KindEditor 实例建议给每个实例单独命名否则会漏同步。常见写法是editor1 K.create(#a, {...}); editor2 K.create(#b, {...});然后在提交里逐个editor1.sync(); editor2.sync();。4.2 后端upload_json.asp配置如果你用的是压缩包自带的upload_json.asp需要改三个地方。第一是文件保存路径默认是/attached/我建议改成更隐蔽一点的目录比如/uploads/year/month/避免直接把附件路径暴露在 URL 里。如果网站在应用层统一做了静态资源映射这里改完还要确认映射规则同步。第二是文件类型白名单上传的扩展名校验不能只依赖后端KindEditor 前端虽然也会校验但可以绕过。后端要自己维护一份白名单validFileExt gif|jpg|jpeg|png|bmp|swf|flv|mp3|wav|mp4同时对上传文件大小做限制ASP 里可以用If Request.TotalBytes 5 * 1024 * 1024 Then Response.Write {error:1,message:上传文件大小超过5MB} Response.End End If第三是防盗链和跨域。如果编辑器页面用https://a.com但上传目录在https://img.a.com或https://cdn.a.com图片会因跨域或 Mixed Content 直接加载不出来。最简单的做法是让上传接口和编辑器页面同域或者在后端返回的 URL 里显式拼接完整的 CDN 域名。4.3 样式与安全细节KindEditor 的弹出层、编辑区有着一套自己的基础样式默认主题为黑色。如果你要在深色后台里用建议只保留一个主题不要同时引入多套 CSS以免 class 冲突。弹窗的宽高也可以在初始化时指定比如K.create(#content, { allowFileManager: true, uploadJson: /kindeditor/upload_json.asp, fileManagerJson: /kindeditor/file_manager_json.asp, items: [source, undo, redo, preview, |, bold, italic, underline, forecolor, hilitecolor, |, justifyleft, justifycenter, justifyright, insertorderedlist, insertunorderedlist, |, link, unlink, image, flash, media, table, hr, fullscreen] });安全方面富文本编辑器本身就是 XSS 的高发区。KindEditor 默认filterMode : true会过滤script、onclick等危险属性但如果你的老系统在提交后并没有再对内容做一遍 HTML 消毒那还是要谨慎。建议在后端收到编辑器内容后至少把iframe、script、on*事件属性过一遍再存库。别嫌啰嗦这个编辑器年久失修它的过滤器本来就是“尽力而为”。5. 常见问题与排查技巧速查表5.1 问题表格下面是我根据这些年处理类似老系统的经验整理的一张速查表现象可能原因处理方法工具栏全部灰色点击无反应KindEditor 初始化 JS 报错多半是加载顺序不对或插件缺失打开控制台看具体报错确认kindeditor-all.js、lang、plugins都在站内路径下图片上传时弹窗空白弹窗用了showModalDialog新版浏览器不支持替换为window.open或升级兼容包里的弹窗组件上传提示成功但图片显示为裂图上传目录 URL 与访问路径不一致检查upload_json.asp里的saveUrl和站点实际目录结构上传文件一直“上传中”上传接口 HTTP 400/500用 Postman 模拟请求看返回的 JSON 格式是否正确中文字体名称乱码页面或 JS 编码不一致统一charsetutf-8后端也输出Response.Charsetutf-8Firefox 下保存后内容丢失一部分过滤模式误伤某些合法标签设置filterMode: false或在filterMode回调中放行指定标签点击“预览”“代码”按钮无反应插件没加载或弹窗 JS 报错逐个检查对应插件文件是否存在引用路径大小写是否正确5.2 两个实战排错案例第一个案例是把压缩包部署到一台 Windows Server 2019 IIS 10 上。页面打开正常工具栏也出来了但点“上传图片”按钮弹出的文件选择框里选了 JPG 之后直接报“上传失败”。看 IE 控制台发现是upload_json.asp返回了 500。原因是 IIS 7.5 以后默认不启用 ASP 父路径而upload_json.asp里的某个读文件函数用了Server.MapPath(../)这类相对上级路径。解决方法是给该 ASP 应用开启“启用父路径”或者把代码里的..路径修正为绝对路径。第二个案例是在一个老后台里工具栏能显示、文字能输入但只要一插入居中图片并保存数据库里的 HTML 就丢了aligncenter属性和图片样式。调查发现是老版 KindEditor 的 XSS 过滤在向上兼容时把style和align也当成危险属性过滤了。处理方式是给filter回调加白名单K.create(#content, { afterCreate: function() { this.filterMode false; } });但要注意关闭过滤模式等于放行了所有标签后端必须以别的姿势再兜底比如筛选出允许的标签集合。如果你所在系统不允许关过滤就采用更精确的做法在htmlFilter里把img的align属性临时转义白名单。这里再插一条我个人的体会解决旧编辑器兼容问题最难的不是代码本身而是要分清“能显示”和“能可靠工作”之间的边界。很多时候你换上兼容包页面能打开、按钮能点了就以为完事了。真正的考验是线上用户开始传图、传附件、从 Word 粘贴内容的那一刻。所以部署后一定要做一份完整的回归测试粘贴 Excel 表格、插入远程图片、批量上传、修改字号、视频嵌入每个功能都要点一遍别偷懒只测一个“加粗按钮”。最后再多聊一个技术之外的细节这类压缩包的作者通常是个人或小团队你要留意解压后的授权说明和文件改动记录。如果里面出现了非官方的自定义插件比如某种云存储的对接代码建议先原样保留等确认上传、保存链路都通了再考虑是否清除。因为有些老代码隐藏得极深清理前你根本不知道它在哪个功能里被引用了。跑得通的系统就不要为了“干净”去赌一把。本文还有配套的精品资源点击获取