背景
之前老版本FusionCharts去除水印比较简单,新版本进行了不少的改动,个人进行了2小时调试终于实现去除水印操作。
思路
思路1:利用JQuery直接进行DOM操作
- Charts页面加载完成后,可通过进行jquery的直接dom修改,经测试可隐藏或删除水印。
// 隐藏元素
$('g[pointer-events="bounding-box"]').each(function(){$(this).css("display:none")})
// 删除元素
$('g[pointer-events="bounding-box"]').each(function(){$(this).remove()})
- FusionCharts有渲染结束事件,事件名称为renderComplete,但在实际应用过程中发现水印的加载是在该事件之后,应当说是(阅读源码后)在所有事件之后。
结论:可在监听页面加载或渲染完毕事件,利用JQ隐藏水印(或者删除),这个思路应该是可行的,但是个人觉得这样子做对原生代码有侵入性操作,不如思路2来得直接。
思路2:调试FusionChart.js源码,找出插入水印的代码
fusionCharts3.20.0在fusioncharts.js中有这么一行代码r._crCreate=function(e){...},方法体里面添加e=0;即可。
即修改后代码为r._crCreate=function(e){e=0;...}
我把格式化后的源码发下,一目了然。
r._crCreate = function (e) {
e = 0;
var t,
r,
n = this,
a = n.getFromEnv("paper"),
o = +n.getFromEnv("chartHeight"),
s = n.getGraphicalElement(_),
l = n.getContainer("parentgroup"),
c = {
href: i.TXT_HREF
};
if (e) {
if (n.getContainer(S) && n.removeContainer(S),
s && n.removeGraphicalElement(s),
!a || !a.group)
return;
t = n.addContainer(S, a.group(function (e) {
void 0 === e && (e = 8);
for (var t = i.BLANK, r = 0; r < e; r++)
t += k();
return t
}
(), !0)),
l && t.insertAfter(l),
n.addGraphicalElement(_, void 0),
r = this._creatingTheLogo(o - 27.32),
t.node.appendChild(r),
n.config.observer ? n.config.observer.disconnect() : n.config.observer = new MutationObserver((function () {
return n._crCreate(e)
})),
n.config.observer.observe(n.getContainer(S).node, y),
t.on("fc-click", (function () {
try {
open(c.href)
} catch (e) {
(top || window).location.href = c.href
}
}))
} else
void 0
}
调试过程不细说了,列位看官可以自己去找关键词:raphael-group,以及水印的详细点击事件。
结论:该思路可行,并且给出了修改方法。
后记
本文只针对去除水印进行技术讨论,不用做商业用途。毕竟作为个人还是要有契约精神。
如果是版本升级,需注意缓存,多次刷新即可。