| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- class WebTileService {
- #canvas = null;
- #title = document.title;
- #config = { Background: 'red', Color: 'white', Type: 'scroll', Time: 500 };
- #ctx = null;
- #linkTag = null;
- #img = null;
- #timer = null;
- constructor(Config) {
- if (Config instanceof Object && Object.keys(Config).length) {
- this.#config = { ...this.#config, ...Config }
- }
- this.#init()
- }
- async #init() {
- const icon = document.querySelectorAll('link[rel~=shortcut]')[0]
- // img
- const img = new Image()
- img.style.width = `32px`
- img.style.height = `32px`
- img.crossOrigin = 'Anonymous'
- img.src = icon.href
- // canvas 初始化
- const canvas = document.createElement('canvas')
- canvas.height = 32
- canvas.width = 32
- this.#canvas = canvas
- const ctx = canvas.getContext('2d')
- this.#ctx = ctx
- // 画底图
- const res = await new Promise((res, rej) => {
- img.onload = () => res(true)
- img.onerror = () => rej(false)
- })
- if (res) ctx.drawImage(img, 0, 0, 32, 32)
- this.#img = img
- // dom 初始化
- const head = document.getElementsByTagName('head')[0]
- const linkTag = document.createElement('link')
- linkTag.setAttribute('rel', 'shortcut icon')
- linkTag.setAttribute('type', 'image/x-icon')
- linkTag.setAttribute('href', canvas.toDataURL('image/png'))
- linkTag.setAttribute('id', 'RESETLinkICON')
- head.removeChild(icon)
- head.appendChild(linkTag)
- this.#linkTag = linkTag
- }
- setTitle(text) {
- if (!text) return
- const { Type, Time } = this.#config
- let title = ''
- let scrollTitle = ''
- if (this.#timer) clearInterval(this.#timer)
- this.#timer = setInterval(() => {
- switch (Type) {
- case 'scroll':
- if (!scrollTitle || !scrollTitle.slice(1)) {
- document.title = text
- scrollTitle = text
- } else {
- scrollTitle = scrollTitle.slice(1)
- document.title = scrollTitle
- }
- break;
- case 'flicker':
- document.title = title === document.title ? text : title
- default:
- clearInterval(this.#timer)
- document.title = this.#title
- break;
- }
- }, Time);
- }
- setNum(num) {
- if (!(num instanceof Number) || !num || !this.#ctx || !this.#linkTag) return
- const { Background, Color } = this.#config
- this.#ctx.arc(21, 21, 11, 0, 2 * Math.PI)
- this.#ctx.fillStyle = Background
- this.#ctx.fill();
- this.#ctx.textAlign = 'center'
- this.#ctx.font = 'normal bold 16px Aria'
- this.#ctx.fillStyle = Color
- this.#ctx.fillText(num > 99 ? '・・' : num, 21, 27)
- if (num <= 100) this.#linkTag.setAttribute('href', this.#canvas.toDataURL('image/png'));
- }
- clearNum() {
- this.#ctx.drawImage(this.#img, 0, 0, 32, 32)
- this.#linkTag.setAttribute('href', this.#canvas.toDataURL('image/png'));
- }
- clearTitle() {
- clearTimeout(this.#timer)
- document.title = this.#title
- }
- }
|