55 lines
2.8 KiB
JavaScript
55 lines
2.8 KiB
JavaScript
/* 微信转发卡片图(11-04 用户:「孕期百问 / 计算器 / 趣味小测 / 孕妈广场所有能转发的内容都做 5:4 转发图,带兜爸心选 logo,核心内容大字」)
|
||
图是预先生成的静态 jpg(750×600),放在 assets/share/:
|
||
t/<专题 slug>.jpg 百问专题 / 计算器(topic/*)
|
||
c/<测试 id>.jpg 趣味小测(guangchang/ceshi/?id=)
|
||
g/<笔记 id>.jpg 广场笔记(?n=);g/t-<话题 id>.jpg 话题(?t=);g/home.jpg 广场;g/ceshi.jpg 测试列表
|
||
生成脚本在 tools/share-card/(node build.js 出清单 → python3 render.py 截图;icons.json 由 index.html CS_TI / app.js QA_IC 导出),改了标题 / 新增内容要重跑。
|
||
协议:wx.miniProgram.postMessage({action:'location', href, title, imageUrl}),宿主 shareCard 用它覆盖转发卡(box_app/docs/h5-auth-standard.md 第四节)。
|
||
postMessage 不是实时投递,微信在分享那一刻才派发,所以每次换内容都要再报一次;子页面没引 jweixin,这里按需加载。 */
|
||
(function (g) {
|
||
'use strict';
|
||
var V = '26110299';
|
||
var isWx = /MicroMessenger/i.test(navigator.userAgent || '');
|
||
var waiting = [], loading = false;
|
||
function ready(cb) {
|
||
if (g.wx && g.wx.miniProgram && g.wx.miniProgram.postMessage) { cb(); return; }
|
||
if (!isWx) return; /* 普通浏览器不用报 */
|
||
waiting.push(cb);
|
||
if (loading) return;
|
||
loading = true;
|
||
var s = document.createElement('script');
|
||
s.src = 'https://res.wx.qq.com/open/js/jweixin-1.6.0.js';
|
||
s.onload = function () { var l = waiting; waiting = []; l.forEach(function (f) { try { f(); } catch (e) {} }); };
|
||
document.head.appendChild(s);
|
||
}
|
||
/* img:相对当前页的图片路径;title:转发卡标题(缺省用页面标题) */
|
||
function share(img, title) {
|
||
var abs = '';
|
||
try { if (img) abs = new URL(img, document.baseURI).href.split('#')[0] + '?v=' + V; } catch (e) {}
|
||
var t = title || document.title || '';
|
||
ready(function () {
|
||
try { g.wx.miniProgram.postMessage({ data: { action: 'location', href: location.href, title: t, imageUrl: abs } }); } catch (e) {}
|
||
});
|
||
}
|
||
/* 单页里内容随地址变(pushState / replaceState / popstate / hashchange):get() 返回 [img, title],同一地址只报一次 */
|
||
function watch(get) {
|
||
var last = '';
|
||
function pull() {
|
||
var k = location.pathname + location.search;
|
||
if (k === last) return;
|
||
last = k;
|
||
var r = get() || [];
|
||
share(r[0], r[1]);
|
||
}
|
||
['pushState', 'replaceState'].forEach(function (fn) {
|
||
var o = history[fn];
|
||
history[fn] = function () { var r = o.apply(this, arguments); setTimeout(pull, 0); return r; };
|
||
});
|
||
g.addEventListener('popstate', pull);
|
||
g.addEventListener('hashchange', pull);
|
||
pull();
|
||
}
|
||
g.mbShare = share;
|
||
g.mbShareWatch = watch;
|
||
})(window);
|