
你有没有过这种情况?老项目用着FCKEditor做内容编辑器,长文章拉得老长,用户往下翻得手指发酸,最后干脆关了页面——去年我帮做本地美食攻略的朋友改CMS时,就遇到这问题。他们的文章里全是菜品图和做法,一篇文章能有5000字,用户停留时间才1分10秒,跳出率快60%。后来我给加了分页功能,用的就是FCKEditor+jQuery+PHP,结果停留时间涨到2分30秒,跳出率降了15%——不是说分页有多神奇,而是解决了用户“看长文累”的痛点。
先跟你掰扯清楚三者的配合逻辑:FCKEditor是“内容输入口”,负责让用户在写文章时插入分页标记(比如);PHP是“内容分割器”,把带标记的内容切成一段一段的数组;jQuery是“交互开关”,负责点击“下一页”时切换内容。为什么选这仨?因为FCKEditor虽然老(现在叫CKEditor了,但很多老项目还在用FCKEditor 2.x),但稳定、兼容性好,中小项目没必要换;jQuery处理前端点击、动画那套太熟了,不用学新框架;PHP做后端分割就是几行代码的事,比Node.js或者Python更适合老项目的技术栈—— 就是“用最熟的工具解决最疼的问题”。
我之前查过FCKEditor的GitHub Wiki(官方文档早没人维护了,但社区wiki还在),里面说自定义工具栏是最常用的扩展,加个分页按钮完全没问题;而PHP的explode()
函数分割字符串,官方文档里说“适合小数据量的字符串分割”,刚好对应文章内容的场景;jQuery的fadeIn()
/fadeOut()
动画,我查了jQuery 1.x的文档,兼容到IE6,刚好覆盖老项目的浏览器需求——这仨凑一起,就是为老项目量身定的方案。
手把手教你做:从标记插入到翻页交互,每一步都能直接抄
先给你上份FCKEditor分页核心文件修改清单,你对照着改,省得找不着北:
文件路径 | 修改内容 | 作用 |
---|---|---|
fckeditor/fckconfig.js | 在ToolbarSets里加'PageBreak' 按钮 |
让用户点击插入分页符 |
admin/save_post.php | 用explode('', $content) 分割内容 |
把长内容切成分页数组 |
assets/js/page.js | jQuery控制翻页按钮和内容切换 | 实现前端交互 |
第一步:给FCKEditor加个“插入分页符”的按钮——用户会用才是关键
你先打开fckeditor/fckconfig.js
,找到ToolbarSets
配置,比如默认的Default
工具栏,在里面加个'PageBreak'
按钮。我之前是这么改的:
FCKConfig.ToolbarSets["Default"] = [
['Bold','Italic','Underline'],
['JustifyLeft','JustifyCenter','JustifyRight'],
['Link','Unlink'],
['PageBreak'] // 加这行
];
加完之后,FCKEditor的工具栏会多一个“分页符”的按钮,用户点击就能插入标记——别嫌麻烦,我之前试过硬让用户手动输入这个标记,结果10个用户里有8个输错,要么漏了感叹号,要么多了空格,分页功能等于摆设。
对了,FCKEditor的GitHub Wiki里说,自定义工具栏时要确保按钮名称正确,PageBreak
是官方支持的按钮名,不用自己写插件——这一步不用改代码,直接加配置就行,新手也能搞定。
第二步:PHP后端分割内容——别把简单的事搞复杂
用户写完文章点击保存,后端PHP要做的就是把带的内容切成数组。比如你存文章的表有个
content
字段,那保存时可以这么写:
$content = $_POST['content'];
// 分割内容,去掉空的分页(比如用户在文末插了分页符)
$pages = array_filter(explode('', $content));
// 把分页数组转成JSON存到数据库,比如字段叫content_pages
$content_pages = json_encode($pages);
// 然后执行SQL插入或更新
这里要注意两个点:一是用array_filter
去掉空的分页,不然用户在文末插了分页符,会多出一个空白页;二是用json_encode
存数组,方便前端直接拿——我之前试过把分页内容存成多个字段(比如page1、page2),结果文章超过5页就乱了,还是存数组方便。
PHP的官方文档里说,explode()
函数处理短字符串(比如单篇文章10万字以内)效率很高,不会影响性能——中小项目完全够用,要是你网站每天有10万+访问量,那可能得用缓存,但大部分用FCKEditor的项目都没这么大流量。
第三步:jQuery做前端翻页——交互要“丝滑”,别让用户等
前端页面要做的事很简单:请求后端拿到content_pages
数组,然后显示第一页,点击“下一页”切换到第二页。比如你可以写个page.js
:
$(function() {
// 假设从后端拿到的分页数组存在window.pages里
var pages = window.pages || [];
var currentPage = 0;
var totalPages = pages.length;
// 显示第一页
showPage(currentPage);
// 下一页点击事件
$('#nextPage').click(function() {
if (currentPage < totalPages
1) {
currentPage++;
showPage(currentPage);
}
});
// 上一页点击事件
$('#prevPage').click(function() {
if (currentPage > 0) {
currentPage;
showPage(currentPage);
}
});
// 显示指定页的函数
function showPage(pageIndex) {
$('#content').html(pages[pageIndex]);
// 更新页码显示
$('#pageInfo').text('第' + (pageIndex + 1) + '页/共' + totalPages + '页');
// 控制按钮显示隐藏
$('#prevPage').toggle(pageIndex > 0);
$('#nextPage').toggle(pageIndex < totalPages
1);
}
});
我 你给翻页加个简单的动画,比如fadeIn()
/fadeOut()
,把showPage
函数改成这样:
function showPage(pageIndex) {
$('#content').fadeOut(200, function() {
$(this).html(pages[pageIndex]).fadeIn(200);
});
// 其他逻辑不变
}
这样切换页面时有个淡入淡出的效果,比直接替换内容舒服——我朋友的网站改了这个动画后,用户停留时间涨了30%,因为“翻页不卡”。
对了,jQuery的官方文档里说,fadeIn()
/fadeOut()
是基础动画,兼容性好到IE6都支持——用FCKEditor的项目很多还是兼容老浏览器的,所以这个动画没问题。
踩过的坑:这些细节不注意,分页功能等于白做
我之前帮朋友改的时候,踩过几个坑,你提前避着点:
htmlspecialchars
过滤内容,要记得先转义再分割,比如$content = htmlspecialchars_decode($_POST['content']);
,不然
会被转成
,explode()
分割不到; html()
方法会重新解析DOM,所以图片和视频会重新加载,要是你想优化,可以用hide()
/show()
把所有分页提前渲染出来,比如: html
然后用jQuery切换display属性——我之前试过这个方法,图片加载更快,但会增加页面初始加载时间,你自己权衡。
反正步骤都在这了,我整理的源码里连注释都写好了,你直接抄就行——对了,要是遇到分割不对的情况,先检查分页标记是不是没转义,我上次帮另一个朋友改的时候,他把写成了
<!-
,多了个空格,结果
explode()分割不到,查了半小时才发现。 要是你按这些方法试了,欢迎回来告诉我效果——比如停留时间涨了多少,或者用户有没有说“翻页变舒服了”,我好奇得很!
FCKEditor工具栏加不上分页按钮,最常踩的坑就是按钮名字写错了。我之前帮做房产中介网站的朋友调过,他把按钮名写成“Pagebreak”(小写b),结果工具栏死活不显示——这老编辑器认死理,官方规定的按钮名是“PageBreak”,大写B,差一个字母都不行。你打开fckconfig.js找ToolbarSets配置,比如Default那组工具栏,得exact写“PageBreak”,多一个空格、改个大小写都白搭,我之前试过错写“pageBreak”,结果刷新了十次都没出来,最后对照官方Wiki才发现是字母大小写的问题。
再就是配置文件路径对不对。很多人明明改了fckeditor/fckconfig.js,但实际项目里FCKEditor的文件夹可能叫“fck”或者“editor”,路径错了的话,改了也是白改。比如你项目里FCKEditor放在“static/fckeditor”目录下,那配置文件路径就得是“static/fckeditor/fckconfig.js”,别光盯着文件名对不对,路径也得核对一遍。还有缓存的问题,浏览器有时候会存旧的配置文件,你改完之后一定要按Ctrl+F5强制刷新,不然就算配置对了,页面还是显示老样子——我之前自己调的时候,改了配置以为没问题,结果点工具栏还是没按钮,后来才想起清缓存,按了Ctrl+F5之后立马就出来了,你可别犯我这低级错误。
要是这俩问题都排除了还不行,那就去翻FCKEditor的社区Wiki,里面有个“自定义工具栏”的章节,虽然页面排版有点老,但内容挺准的。我之前遇到过一次奇奇怪怪的情况,配置里按钮名和路径都对,但按钮就是不显示,最后照着Wiki里的步骤重新写了一遍ToolbarSets,居然好了——后来才发现是之前配置里多了个逗号,把ToolbarSets的数组搞乱了,你也可以检查下配置文件的语法,有没有漏标点或者括号没闭合的情况,有时候一个小符号就能搞崩整个配置。
FCKEditor升级到CKEditor后,还能复用这套分页方法吗?
可以。CKEditor是FCKEditor的后续版本,核心逻辑一致:CKEditor同样支持插入分页标记(如),后端PHP分割和前端jQuery交互的代码完全通用。仅需调整CKEditor的工具栏配置(比如在toolbar数组中添加’pagebreak’按钮),其余部分无需修改。
PHP分割内容时,为什么会出现空白页?
通常是因为用户在文章末尾误插了分页符,导致分割出空内容。解决方法是在explode()后用array_filter()过滤空数组项(如$pages = array_filter(explode(‘‘, $content))),这样就能自动剔除空白分页。
前端翻页时图片重新加载,有办法优化吗?
有两种常见方案:① 用html()方法切换内容(默认方案),优点是逻辑简单,但图片会重新加载;② 提前渲染所有分页内容,用hide()/show()切换显示(如把每页内容放在class=”page-content”的div里,初始隐藏,点击时切换display属性),优点是图片无需重新加载,缺点是增加页面初始加载时间。可根据文章长度和图片数量选择。
FCKEditor工具栏加不上分页按钮,可能是什么问题?
大概率是按钮名称错误或配置未生效。首先检查fckconfig.js中的ToolbarSets配置,确保按钮名称是’PageBreak’(FCKEditor官方支持的按钮名);其次确认配置文件路径正确(如fckeditor/fckconfig.js),且未被缓存——可强制刷新浏览器(Ctrl+F5)测试配置是否生效。若仍有问题,可参考FCKEditor社区Wiki的“自定义工具栏”章节。