博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百度编辑器(ueditor)魔改:4、滚动条管理(scrollTop,scrollTo)
阅读量:4162 次
发布时间:2019-05-26

本文共 2962 字,大约阅读时间需要 9 分钟。

-----------------------------------------------------------

在做完广告词高亮提醒后,进行了一下测试,总体来说,结果不错,符合预期了,但是,当我将内容弄了好几屏之后,意外发生了,选中的词在屏幕之外,但滚动条没动!这是什么鬼!于是,看看百度编辑器自己的搜索吧,结果,加载了searchreplace按钮后,进行搜索,一样是屏幕没有滚动!这是什么鬼!Are you kidding me?文盲当时是一脸懵逼啊,百度编辑器开发人员,你们脑袋里有坑么?无力吐槽了。。。。

算了,自己去解决这个问题吧

仔细观察了一下,百度编辑器的滚动条其实是分情况的,一种是autoHeightEnabled=true的时候,这个时候编辑器时自动缩放高度,以适应内容的,所以滚动条应该使用编辑器所在页面的滚动条,另一种就是autoHeightEnabled=false,这个时候,不进行自动缩放了,就需要使用编辑器自身的滚动条了

第一步:对编辑器追加一个scrollTo方法,用来进行滚动条管理

打开src\core\editor.js,这个文件里定义了编辑器可调用的各种内置方法

我们找到Editor.prototype这个定义,追加我们的代码

Editor.prototype = {        scrollTo: function (x, y) {            var me = this;            var win = me.autoHeightEnabled ? me.window.parent : me.window;        },....}

嗯。。。文盲的思路比较偏颇了,对于滚动位置,使用坐标来描述,原因是编辑器内的所有元素都可以获得对于编辑器内文档的坐标

第二步:获得编辑器当前滚动坐标

在这里,老顾仔细观察了一下,如果是自适应高的话,就不说了,需要获得编辑器所在位置,参与到滚动条计算里

如果是非自适应高的话,那么,百度编辑器的滚动条其实是编辑器对应的iframe所属的window

嗯,也就是上边 win 的定义

然后获取具体数据

var loc = me.autoHeightEnabled ? $(me.container).position() : { top: 0, left: 0 };            var vh = win.innerHeight; // iframe 内置文档显示高            var vw = win.innerWidth; // iframe 内置文档显示宽            var dh = win.document.body.scrollHeight; // iframe 内置文档总高            var dw = win.document.body.scrollWidth; // iframe 内置文档总宽            var t_top = win.scrollY;            var t_left = win.scrollX;

其中loc就是针对编辑器自适应高时,编辑器所在的位置,当然,如果你的编辑器的祖辈们出现了position定义,比如absolute、relative、fixed的话,那你还得从新计算他的位置,很麻烦

第三步:换算出滚动条移动位置

最就是判定,我们要移动的位置是否显示在当前屏幕了,如果没有在当前屏幕内,换算出需要将滚动条移动到哪里

if (t_left - loc.left > x) {                t_left = x - vw / 2 + loc.left;            }            if (t_top - loc.top > y) {                t_top = y - vh / 2 + loc.top;            }            if (t_left + vw - loc.left < x) {                t_left = x - vw / 2 + loc.left;            }            if (t_top + vh - loc.top < y) {                t_top = y - vh / 2 + loc.top;            }            win.scrollTo(t_left, t_top);

这样我们就可以在搜索时加上 editor.scrollTo(0,100)这样的指令进行滚动条管理了

完整scrollTo

scrollTo: function (x, y) {            var me = this;            var win = me.autoHeightEnabled ? me.window.parent : me.window;            var loc = me.autoHeightEnabled ? $(me.container).position() : { top: 0, left: 0 };            var vh = win.innerHeight; // iframe 内置文档显示高            var vw = win.innerWidth; // iframe 内置文档显示宽            var dh = win.document.body.scrollHeight; // iframe 内置文档总高            var dw = win.document.body.scrollWidth; // iframe 内置文档总宽            var t_top = win.scrollY;            var t_left = win.scrollX;            if (t_left - loc.left > x) {                t_left = x - vw / 2 + loc.left;            }            if (t_top - loc.top > y) {                t_top = y - vh / 2 + loc.top;            }            if (t_left + vw - loc.left < x) {                t_left = x - vw / 2 + loc.left;            }            if (t_top + vh - loc.top < y) {                t_top = y - vh / 2 + loc.top;            }            win.scrollTo(t_left, t_top);        },

 

转载地址:http://jxvxi.baihongyu.com/

你可能感兴趣的文章
VC++调用webservice (不使用.NET的托管技术)
查看>>
VS2008非托管c++访问webservice服务
查看>>
C++extern用法
查看>>
vc++生成程序不需要.net运行环境的可以执行exe程序的方法
查看>>
fstream默认不支持中文路径和输出整数带逗号的解决办法
查看>>
各种程序打包软件的安装命令
查看>>
Wise Installation使用中注意的问题
查看>>
WinCE开发环境的搭建
查看>>
让fstream支持中文路径
查看>>
Wise Installation使用中注意问题 总结
查看>>
wince 禁止程序标题栏上的退出按钮X
查看>>
WINCE 禁止MFC程序窗口上的OK按钮
查看>>
线程池原理及创建(C++实现)
查看>>
什么代码才是线程安全的
查看>>
基于WinCE 5.0环境项目开发心得总结
查看>>
WCDMA,CDMA2000,TD-SCDMA 网络那个更好?
查看>>
ActiveX开发详解
查看>>
带技术团队之大忌
查看>>
C++开源库【总结】
查看>>
串口通信编程--多线程异步方式
查看>>