/** * 通用分享功能模块 * 领明数据 SoHive */ class ShareManager { constructor() { this.qrCodeLoaded = false; this.init(); } init() { // 加载二维码库 if (typeof QRCode === 'undefined') { const script = document.createElement('script'); script.src = 'https://cdn.jsdelivr.net/npm/qrcodejs2@0.0.2/qrcode.min.js'; script.onload = () => { this.qrCodeLoaded = true; console.log('✅ QRCode 库加载成功'); }; document.head.appendChild(script); } else { this.qrCodeLoaded = true; } // 使用事件委托监听所有分享按钮 document.addEventListener('click', (e) => { const btn = e.target.closest('button[data-share]'); if (btn) { const platform = btn.dataset.share; this.share(platform); } }); console.log('✅ 分享模块初始化完成'); } // 获取页面信息 getPageInfo() { return { url: window.location.href, title: document.querySelector('meta[property="og:title"]')?.content || document.title, description: document.querySelector('meta[property="og:description"]')?.content || '', image: document.querySelector('meta[property="og:image"]')?.content || '' }; } // 主分享函数 share(platform) { const info = this.getPageInfo(); console.log(`🔗 分享到 ${platform}`); switch (platform) { case 'wechat': this.shareToWechat(info.url); break; case 'weibo': this.shareToWeibo(info); break; case 'linkedin': this.shareToLinkedIn(info); break; case 'twitter': this.shareToTwitter(info); break; case 'link': this.copyLink(info.url); break; default: console.warn('未知的分享平台:', platform); } } // 微信分享(二维码) shareToWechat(url) { // 移除旧弹窗 const oldModal = document.getElementById('wechatModal'); if (oldModal) oldModal.remove(); // 创建新弹窗 const modal = document.createElement('div'); modal.id = 'wechatModal'; modal.innerHTML = `
使用微信「扫一扫」分享给朋友
二维码生成中...
'; setTimeout(() => this.shareToWechat(url), 500); } }, 100); // ESC 键关闭 const closeHandler = (e) => { if (e.key === 'Escape') { modal.remove(); document.removeEventListener('keydown', closeHandler); } }; document.addEventListener('keydown', closeHandler); } // 微博分享 shareToWeibo(info) { const url = `https://service.weibo.com/share/share.php?url=${encodeURIComponent(info.url)}&title=${encodeURIComponent(info.title)}&pic=${encodeURIComponent(info.image)}`; this.openWindow(url, '分享到微博'); } // LinkedIn 分享 shareToLinkedIn(info) { const url = `https://www.linkedin.com/sharing/share-offsite/?url=${encodeURIComponent(info.url)}`; this.openWindow(url, '分享到LinkedIn'); } // Twitter 分享 shareToTwitter(info) { const url = `https://twitter.com/intent/tweet?url=${encodeURIComponent(info.url)}&text=${encodeURIComponent(info.title)}`; this.openWindow(url, '分享到Twitter'); } // 复制链接 copyLink(url) { if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(url) .then(() => this.showToast('链接已复制 ✓', 'success')) .catch(() => this.fallbackCopy(url)); } else { this.fallbackCopy(url); } } // 降级复制方案 fallbackCopy(text) { const textarea = document.createElement('textarea'); textarea.value = text; textarea.style.cssText = 'position: fixed; left: -9999px; top: -9999px;'; document.body.appendChild(textarea); textarea.select(); try { document.execCommand('copy'); this.showToast('链接已复制 ✓', 'success'); } catch (err) { this.showToast('复制失败', 'error'); console.error('复制失败:', err); } document.body.removeChild(textarea); } // 打开分享窗口 openWindow(url, title) { const width = 600; const height = 500; const left = (window.innerWidth - width) / 2; const top = (window.innerHeight - height) / 2; const popup = window.open( url, title, `width=${width},height=${height},left=${left},top=${top},toolbar=no,menubar=no,scrollbars=yes,resizable=yes` ); if (!popup) { this.showToast('请允许弹出窗口', 'error'); } } // 显示提示 showToast(message, type = 'info') { let toast = document.getElementById('shareToast'); if (!toast) { toast = document.createElement('div'); toast.id = 'shareToast'; document.body.appendChild(toast); } const bgColors = { success: '#222222', error: '#FF385C', info: '#484848' }; toast.style.cssText = ` position: fixed; top: 100px; left: 50%; transform: translateX(-50%) translateY(-20px); background: ${bgColors[type]}; color: white; padding: 14px 28px; border-radius: 50px; font-size: 15px; font-weight: 500; z-index: 100000; opacity: 0; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); box-shadow: 0 8px 24px rgba(0,0,0,0.2); display: flex; align-items: center; gap: 8px; `; toast.innerHTML = type === 'success' ? ` ${message}` : message; // 触发动画 setTimeout(() => { toast.style.opacity = '1'; toast.style.transform = 'translateX(-50%) translateY(0)'; }, 10); setTimeout(() => { toast.style.opacity = '0'; toast.style.transform = 'translateX(-50%) translateY(-20px)'; }, 2000); } } // 自动初始化 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { window.shareManager = new ShareManager(); }); } else { window.shareManager = new ShareManager(); }