html里定义了一个标签canvas,在整合其它插件的时候出现了冲突,想把canvas标签再封装一层该怎么写
准备两个(或多个,反正你要几个就是几个) canvas
标签。
在插件就绪之前,重写 HTMLCanvasElement.prototype.getContent
:
;(() => {
const { prototype: p } = HTMLCanvasElement;
const originFunc = p.getContent;
const getCanvas = () => document.querySelectorAll('canvas');
let canvasList = getCanvas();
let index = 0;
p.getContent = function(...args){
if(!canvasList){
canvasList = getCanvas();
}
return originFunc.apply(canvasList[index++], args);
}
})();
在页面变动不大且没有干扰的情况下,可以让它们的绘图互不干扰。
但是副作用比较大:
canvas
和插件顺序要一一对应,不然就会搞反画布;canvas
的代码都会受到牵连;toBlob
和toData
,得到的数据都将是第一个canvas
的。所以考虑下,从其他方面着手解决这个问题。
10 回答11.1k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
5 回答1.9k 阅读
如果插件是一次性的,可以把自己的js放在它后面,等它加完特效再动态添加自己的canvas。
如果这样也逃不过它的毒手,再怎么封装也是没有用的,只能把自己的canvas放iframe了。