关于iChartjs在移动端提示框tip显示不正常的解决方法

简介:

最近项目需要使用手机图表,但是找了很久都没找到专门为移动端开发的图表,只能找一些能兼容移动端的图表控件,今天就讲讲关于iChartjs这个图形库的一点问题。

问题

iChartjs的提示框tip的显示没有为移动端做调整,在移动端显示效果很差

原因

直接通过iChartjs的源码看原因,查看$.Tip这个提示框组件中的doAction:

复制代码
doAction:function(_){
    _.T.on('mouseover',function(c,e,m){
        _.show(e,m);  //显示提示框  
    }).on('mouseout',function(c,e,m){
        _.hidden(e);  //隐藏提示框
    });
    
    if(_.get('showType')=='follow'){
        _.T.on('mousemove',function(c,e,m){
            if(_.T.variable.event.mouseover){
                setTimeout(function(){
                    if(_.T.variable.event.mouseover)
                        _.follow(e,m,_);
                },_.get('delay'));
            }
        });
    }
},
复制代码

可以看到,只使用了mouseovermouseout事件,没有为移动端做调整。

这也当然在移动端点击时候是显示不了提示框,只能在图表上拖动后才能显示提示框(太蛋疼了)。

寻找解决方法

其实图表也是这样的吗?

重新换了一个图表库——highcharts(很美观),测试在移动端的显示效果(结果令人振奋的),它有为移动端做兼容。

我又找到了highcharts关于提示框显示的代码段:

复制代码
if (!series._hasTracking) {
    each(series.trackerGroups, function (key) {
        if (series[key]) { // we don't always have dataLabelsGroup
            series[key]
                .addClass(PREFIX + 'tracker')
                .on('mouseover', onMouseOver)
                .on('mouseout', function (e) {  pointer.onTrackerMouseOut(e); })
                .css(css);
            if (hasTouch) {
                series[key].on('touchstart', onMouseOver);
                alert(1);
            }
        }
    });
    series._hasTracking = true;
}
复制代码

可以看到highcharts和iChartjs在提示框事件方面的代码非常相似,但是highcharts在最后添加上了一个touchstart事件,这样移动端点击图表就能显示提示框。

提起highcharts并不是为了大家不用iChartjs,只是为了更加明确问题的原因,以便解决问题,这两个图形库各有好处的(具体就在结尾总结说吧)。

第一个解决方法:

依照highcharts为iChartjs添加上touchstart事件:

if($.touch){
   _.T.on('touchstart',function(c,e,m){
    _.show(e,m);    
   })
}

很遗憾的是,这个理想中的方法,并没有起效,我探寻了很多种原因,都还没找到原因(如果有谁知道请麻烦告诉我)。

我打印过 _.T 这个对象出来看过,内容如下:

可以看到其实是有touchstart事件的,就是不知道为什么失效,但可以明确是,那些Array[1或2]的事件是肯定有效的。

第二个解决方法:

这个方法算是普遍的做法,直接操作DOM,上代码:

复制代码
_.T.on('click',function(c,e,m){
 
    var shell=document.getElementById("shell-"+e.target.id);
    var allTip =shell.getElementsByTagName('div'),i=0;
    for(;i<allTip.length;i++){
        allTip[i].style.visibility="hidden";
    }
    _.show(e,m);
    
});
复制代码

在代码里我尽量使用原生的js,避免被其他代码影响。同样改动的地方也少。
缺点:点击饼图外边不能将提示框去除,总有一个存在(某种程度上不是那么影响体验)。

这两个方法,在没解决touchstart失效问题之前,还是使用第二个吧。

总结

iChartjs还需要在兼容移动端这方面下些功夫。

下面讲两点题外话:

一、mobile web

移动端上的事件并不与PC上的事件相同,所以在使用事件时也别惯用了PC上的事件,思考这些事件在移动端的可能的效果,寻找更适合移动端的事件,并实践和进行细节调整。

例如在使用clicktouch事件,touch的响应速度是快过click的,所以可以考虑使用touch替换click

二、highcharts和iChartjs的特点比较

iChartjs

1.代码开源免费
2.不依赖第三方库
3.图表效果还算美观,能够满足移动端图表的要求
4.有3D图表
5.可以拆分使用某种图表的源码,不必引入整个iChartjs源码
6.只能显示在支持canvas的浏览器

highcharts

1.要收费的
2.依赖jQuery库
3.图表效果非常美观,显示效果也非常好
4.兼容性非常好

本文转自 海角在眼前 博客园博客,原文链接: http://www.cnblogs.com/lovesong/p/3389886.html  ,如需转载请自行联系原作者


相关文章
|
存储 分布式计算 NoSQL
Flink / Scala - 使用 Jedis、JedisPool 作为 Source 读取数据
现在有一批数据写入多台 Redis 相同 key 的队列中,需要消费 Redis 队列作为 Flink Source,为了提高可用性,下面基于 JedisPool 进行队列的消费。
1349 0
Flink / Scala - 使用 Jedis、JedisPool 作为 Source 读取数据
|
前端开发 JavaScript
竞态问题:深入理解与解决方案
竞态问题:深入理解与解决方案
868 0
|
4天前
|
云安全 人工智能 自然语言处理
|
8天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
802 17
|
11天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
805 59
Meta SAM3开源:让图像分割,听懂你的话
|
2天前
|
人工智能 安全 小程序
阿里云无影云电脑是什么?最新收费价格个人版、企业版和商业版无影云电脑收费价格
阿里云无影云电脑是运行在云端的虚拟电脑,分企业版和个人版。企业版适用于办公、设计等场景,4核8G配置低至199元/年;个人版适合游戏、娱乐,黄金款14元/月起。支持多端接入,灵活按需使用。
239 164
|
9天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
336 116