<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://gf-ogas.wiki/index.php?action=history&amp;feed=atom&amp;title=Widget%3ATemplateAsyncLoad</id>
	<title>Widget:TemplateAsyncLoad - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://gf-ogas.wiki/index.php?action=history&amp;feed=atom&amp;title=Widget%3ATemplateAsyncLoad"/>
	<link rel="alternate" type="text/html" href="https://gf-ogas.wiki/index.php?title=Widget:TemplateAsyncLoad&amp;action=history"/>
	<updated>2026-04-16T01:11:02Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://gf-ogas.wiki/index.php?title=Widget:TemplateAsyncLoad&amp;diff=14792&amp;oldid=prev</id>
		<title>秋绘君：​创建页面，内容为“&lt;noinclude&gt;Only for{{tl|TemplateAsyncLoad}}&lt;/noinclude&gt;&lt;includeonly&gt;&lt;!--{if !isset($wgTemplateAsyncLoad) || !$wgTemplateAsyncLoad}--&gt;&lt;!--{assign var=&quot;wgTemplateAsyncLoad&quot; value=true scope=&quot;global&quot;}--&gt;&lt;script&gt; &quot;use strict&quot;; window.RLQ = window.RLQ || []; window.RLQ.push(async () =&gt; {     await mw.loader.using([&quot;mediawiki.page.ready&quot;, &quot;mediawiki.api&quot;, &quot;ext.gadget.libPolyfill&quot;]);     const { wgPageName, skin, wgUserVariant } = mw.config.get([&quot;wgPageName&quot;, &quot;skin&quot;,…”</title>
		<link rel="alternate" type="text/html" href="https://gf-ogas.wiki/index.php?title=Widget:TemplateAsyncLoad&amp;diff=14792&amp;oldid=prev"/>
		<updated>2026-04-11T12:20:25Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;noinclude&amp;gt;Only for{{tl|TemplateAsyncLoad}}&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;!--{if !isset($wgTemplateAsyncLoad) || !$wgTemplateAsyncLoad}--&amp;gt;&amp;lt;!--{assign var=&amp;quot;wgTemplateAsyncLoad&amp;quot; value=true scope=&amp;quot;global&amp;quot;}--&amp;gt;&amp;lt;script&amp;gt; &amp;quot;use strict&amp;quot;; window.RLQ = window.RLQ || []; window.RLQ.push(async () =&amp;gt; {     await mw.loader.using([&amp;quot;mediawiki.page.ready&amp;quot;, &amp;quot;mediawiki.api&amp;quot;, &amp;quot;ext.gadget.libPolyfill&amp;quot;]);     const { wgPageName, skin, wgUserVariant } = mw.config.get([&amp;quot;wgPageName&amp;quot;, &amp;quot;skin&amp;quot;,…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;noinclude&amp;gt;Only for{{tl|TemplateAsyncLoad}}&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&amp;lt;!--{if !isset($wgTemplateAsyncLoad) || !$wgTemplateAsyncLoad}--&amp;gt;&amp;lt;!--{assign var=&amp;quot;wgTemplateAsyncLoad&amp;quot; value=true scope=&amp;quot;global&amp;quot;}--&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
window.RLQ = window.RLQ || [];&lt;br /&gt;
window.RLQ.push(async () =&amp;gt; {&lt;br /&gt;
    await mw.loader.using([&amp;quot;mediawiki.page.ready&amp;quot;, &amp;quot;mediawiki.api&amp;quot;, &amp;quot;ext.gadget.libPolyfill&amp;quot;]);&lt;br /&gt;
    const { wgPageName, skin, wgUserVariant } = mw.config.get([&amp;quot;wgPageName&amp;quot;, &amp;quot;skin&amp;quot;, &amp;quot;wgUserVariant&amp;quot;]);&lt;br /&gt;
    const api = new mw.Api();&lt;br /&gt;
    /**&lt;br /&gt;
     * @param { HTMLDivElement } ele &lt;br /&gt;
     */&lt;br /&gt;
    const load = async (ele) =&amp;gt; {&lt;br /&gt;
        if (ele.classList.contains(&amp;quot;loading&amp;quot;)) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        ele.classList.add(&amp;quot;loading&amp;quot;);&lt;br /&gt;
        const { title } = ele.dataset;&lt;br /&gt;
        if (typeof title !== &amp;quot;string&amp;quot; || !/^Template:/.test(title)) {&lt;br /&gt;
            console.info(&amp;quot;[widget:TemplateAsyncLoad]&amp;quot;, `[${title}]`, &amp;quot;invalid title, skip.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        const wrapoutputclass = `TemplateAsyncLoad-${crypto.randomUUID()}`;&lt;br /&gt;
        const params = [];&lt;br /&gt;
        for (const keyIndex of Object.keys(ele.dataset)) {&lt;br /&gt;
            if (!/^key-[1-9]\d*$/.test(keyIndex)) {&lt;br /&gt;
                continue;&lt;br /&gt;
            }&lt;br /&gt;
            const valueIndex = keyIndex.replace(/^key-/, &amp;quot;value-&amp;quot;);&lt;br /&gt;
            if (!Reflect.has(ele.dataset, valueIndex)) {&lt;br /&gt;
                continue;&lt;br /&gt;
            }&lt;br /&gt;
            const key = ele.dataset[keyIndex]?.replaceAll(&amp;quot;|&amp;quot;, &amp;quot;{{!}}&amp;quot;);&lt;br /&gt;
            const value = ele.dataset[valueIndex]?.replaceAll(&amp;quot;|&amp;quot;, &amp;quot;{{!}}&amp;quot;);&lt;br /&gt;
            console.info(&amp;quot;[widget:TemplateAsyncLoad]&amp;quot;, `[${title}]`, &amp;quot;param:&amp;quot;, { key, value });&lt;br /&gt;
            params.push(`|${key}=${value}`);&lt;br /&gt;
        }&lt;br /&gt;
        for (let i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
            console.info(&amp;quot;[widget:TemplateAsyncLoad]&amp;quot;, `[${title}]`, &amp;quot;loading #&amp;quot;, i);&lt;br /&gt;
            try {&lt;br /&gt;
                /**&lt;br /&gt;
                 * @type { HTMLElement }&lt;br /&gt;
                 */&lt;br /&gt;
                const output = new DOMParser().parseFromString((await api.post({&lt;br /&gt;
                    action: &amp;quot;parse&amp;quot;,&lt;br /&gt;
                    title: wgPageName,&lt;br /&gt;
                    text: `{{${title}${params.join(&amp;quot;&amp;quot;)}}}`,&lt;br /&gt;
                    prop: &amp;quot;text&amp;quot;,&lt;br /&gt;
                    formatversion: 2,&lt;br /&gt;
                    wrapoutputclass,&lt;br /&gt;
                    disablelimitreport: true,&lt;br /&gt;
                    disableeditsection: true,&lt;br /&gt;
                    pst: true,&lt;br /&gt;
                    disabletoc: true,&lt;br /&gt;
                    useskin: skin,&lt;br /&gt;
                    variant: wgUserVariant,&lt;br /&gt;
                }))?.parse?.text || `&amp;lt;div class=&amp;quot;${wrapoutputclass}&amp;quot;&amp;gt;${wgULS(&amp;quot;无内容=。=&amp;quot;)}&amp;lt;/div&amp;gt;`, &amp;quot;text/html&amp;quot;).getElementsByClassName(wrapoutputclass)[0];&lt;br /&gt;
                if (output.children.length === 1 &amp;amp;&amp;amp; output.children[0].tagName === &amp;quot;P&amp;quot; &amp;amp;&amp;amp; output.children[0].attributes.length === 0) {&lt;br /&gt;
                    output.innerHTML = output.children[0].innerHTML;&lt;br /&gt;
                }&lt;br /&gt;
                output.classList.add(&amp;quot;mw-parser-output&amp;quot;, &amp;quot;templateAsyncLoadRoot&amp;quot;);&lt;br /&gt;
                ele.after(output);&lt;br /&gt;
                ele.style.display = &amp;quot;none&amp;quot;;&lt;br /&gt;
                mw.hook(&amp;quot;wikipage.content&amp;quot;).fire($(output));&lt;br /&gt;
                return;&lt;br /&gt;
            } catch (e) {&lt;br /&gt;
                console.error(&amp;quot;[widget:TemplateAsyncLoad]&amp;quot;, `[${title}]`, &amp;quot;error #&amp;quot;, i, e);&lt;br /&gt;
                if (i &amp;gt;= 2) {&lt;br /&gt;
                    ele.removeAttribute(&amp;quot;style&amp;quot;);&lt;br /&gt;
                    const pre = document.createElement(&amp;quot;pre&amp;quot;);&lt;br /&gt;
                    pre.innerText = `异步模板加载发生错误：${typeof e === &amp;quot;string&amp;quot; ? e : e instanceof Error ? `${e}${e.stack ? ` @ ${e.stack}}` : &amp;quot;&amp;quot;}` : JSON.stringify(e)}`;&lt;br /&gt;
                    ele.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;
                    ele.append(pre);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
    const lazyLoadObserver = new IntersectionObserver((entries) =&amp;gt; {&lt;br /&gt;
        for (const entry of entries) {&lt;br /&gt;
            if (entry.isIntersecting) {&lt;br /&gt;
                const lazyTarget = entry.target;&lt;br /&gt;
                load(lazyTarget);&lt;br /&gt;
                lazyLoadObserver.unobserve(lazyTarget);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    });&lt;br /&gt;
    for (const ele of [...document.querySelectorAll(&amp;quot;.TemplateAsyncLoad&amp;quot;)]) {&lt;br /&gt;
        lazyLoadObserver.observe(ele);&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/script&amp;gt;&amp;lt;!--{/if}--&amp;gt;&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>秋绘君</name></author>
	</entry>
</feed>