typecho-core
Version:
An element-drived engine working well with XHR-intensive front-end. Originally designed for Typecho.
1 lines • 22.2 kB
JavaScript
let TypechoCore=window.TypechoCore||{};TypechoCore={initialized:!1,initRegistry:[],proxyRegistry:[],backendAssetsPath:"",resolvedRequests:[],unique:0,captchaProvider:null,init:function(){if(this.initialized)return console.error("TypechoCore 被重复加载。");this.State.init(),this.trigger(document,"core:preInit"),this.backendAssetsPath=this.utils.getRelativePath(),this.register("page-title"),this.register("captcha"),this.register("sync-toc"),this.register("overlay"),this.register("ajax-submit"),this.engine.seekResourceFromDOM(),this.xhr.register(this.content.fetchPermalinkCid,!0),this.xhr.register((()=>this.Element.activate())),this.xhr.registerSelector("#main"),this.xhr.registerElement('a:not(a[target="_blank"], a[data-typecho-init])'),this.xhr.init(),this.trigger(document,"core:postInit"),this.initialized=!0},state:function(e,t){if(!t)return this.State[e];this.State[e]=t},proxy:function(e,t,n){const o=e+"."+t;if(this.proxyRegistry.includes(o)||"function"!=typeof n)return;let i=e[t];Object.defineProperty(e,t,{get:()=>i,set(e){i=e,n(e)},enumerable:!0,configurable:!0}),this.proxyRegistry.push(o)},trigger:function(e,t,n){const o=new CustomEvent(t,{detail:n});e.dispatchEvent(o)},register:function(e,t=null,n=!0){this.initRegistry[e]&&console.warn("注册器在 "+e+" 上被重复注册,应检查其明确性。"),this.initRegistry[e]=t||e.replace(/-([a-z])/g,(function(e,t){return t.toUpperCase()})),n&&this.Element.activate(document.body,e)},registered:function(e){return this.initRegistry.hasOwnProperty(e)},uniqueId:()=>TypechoCore.unique++,xhr:{instance:null,elements:[],selectors:[],lastFormResponse:null,timeout:5e3,init:function(){const e=new window.Seamless({timeout:this.timeout,elements:this.elements.join(","),selectors:this.selectors});this.instance=e,this.refresh=this.instance.refresh.bind(e),this.reload=this.instance.reload.bind(e),this.load=this.instance.loadUrl.bind(e)},register:function(e,t=!1,n="success",o=null){"function"==typeof e&&(document.addEventListener(`seamless:${n}`,(t=>{e.call(o,t)})),t&&e())},registerOnce:function(e,t="complete",n=null){"function"==typeof e&&document.addEventListener(`seamless:${t}`,e.bind(n),{once:!0})},registerSelector:function(e){this.selectors.push(e)},registerElement:function(e){this.elements.push(e)},redirect:function(e=null){const t=e??window.location.href;let n=365;const o=TypechoCore.ui.overlay;o&&(n=TypechoCore.ui.getCssTransitionDuration(o),TypechoCore.ui.destroyOverlay()),setTimeout((function(){TypechoCore.xhr.load(t)}),n)},request:e=>new Promise(((t,n)=>{const o=new XMLHttpRequest,{url:i,method:s="GET",form:r=null,data:a=null,useFormData:c=!1,headers:l={},timeout:d=0,responseType:u="",withCredentials:h=!1}=e;let p;r&&r instanceof HTMLFormElement?p=new FormData(r):a&&"object"==typeof a&&(c?(p=new FormData,Object.keys(a).map((e=>p.append(e,a[e])))):p=a);let m=new URLSearchParams(p),f=i;"GET"===s&&p&&(f+=(i.includes("?")?"&":"?")+m.toString(),m=null),o.open(s,f),u&&(o.responseType=u),o.withCredentials=h,o.timeout=d,l["X-Requested-With"]="XMLHttpRequest",Object.entries(l).forEach((([e,t])=>{o.setRequestHeader(e,String(t))})),o.onload=()=>{const n="json"===o.responseType?o.response:o.responseText;e.success?.(n),t(n)},o.onerror=()=>{const t=new Error("网络错误。");e.error?.(t),n(t)},o.ontimeout=()=>{const t=new Error(`请求超时(${d}ms)`);e.error?.(t),n(t)};const y=!!l["Content-Type"];"POST"!==s||y||(l["Content-Type"]="application/json"),o.send(m)}))},utils:{getRelativePath:function(e=null){const t=e??document.currentScript.src,n=new URL(t).pathname,o=t.substring(t.lastIndexOf("/")+1);return n.replace(o,"")},getLocalRelativePath:function(e=null){return location.protocol+"//"+location.host+this.getRelativePath(e)},scrollTo:function(e,t={}){if(!(e instanceof HTMLElement))return;if((t={behavior:"smooth",block:"start",inline:"nearest",legacy:!1,offset:0,...t}).legacy){const n=parseInt(t.offset)||0;e.parentNode.scrollTop=e.offsetTop+n}else e.scrollIntoView(t)},bindKey:function(e,t,n=!1){function o(n){if(t(n))return n.preventDefault()||e(),!1}"function"==typeof e&&"function"==typeof t&&(document.addEventListener("keydown",o),n||TypechoCore.xhr.registerOnce((function(){document.removeEventListener("keydown",o)})))},setPair:function(e,t){if(e instanceof HTMLElement&&t instanceof HTMLElement){const n=TypechoCore.uniqueId();return e.dataset.tid=t.dataset.tid=n,n}return null},getPair:function(e){if(e instanceof HTMLElement){const t=e.dataset.tid;return document.querySelector(`[data-tid="${t}"]`)}},getNonceFormData:function(e){if(!(e&&e instanceof HTMLFormElement))return null;const t=[],n=e.elements;Array.from(n).forEach((e=>{e.name&&!e.disabled&&"file"!==e.type&&("SELECT"===e.tagName?e.multiple?Array.from(e.selectedOptions).forEach((n=>{t.push({name:e.name,value:n.value})})):t.push({name:e.name,value:e.value}):"checkbox"===e.type||"radio"===e.type?e.checked&&t.push({name:e.name,value:e.value}):t.push({name:e.name,value:e.value}))}));const o={};return t.forEach((({name:e,value:t})=>{o[e]=t})),o},serializeForm:function(e){const t=[],n=e.elements;return Array.from(n).forEach((e=>{e.name&&!e.disabled&&"file"!==e.type&&"BUTTON"!==e.tagName&&("select-multiple"===e.type?Array.from(e.selectedOptions).forEach((n=>{t.push(this.encodePair(e.name,n.value))})):("checkbox"!==e.type&&"radio"!==e.type||e.checked)&&("checkbox"===e.type&&e.checked?t.push(this.encodePair(e.name,e.value||"on")):t.push(this.encodePair(e.name,e.value))))})),t.join("&")},encodePair:function(e,t){return encodeURIComponent(e)+"="+encodeURIComponent(t)},getTinyTransparentDataUrl:function(){return"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"}},engine:{requestNew:function(e,t){"function"==typeof t&&t((t=>{t&&t(),TypechoCore.resolvedRequests.push(e)}),TypechoCore.resolvedRequests.includes(e))},requestResource:async function(e){TypechoCore.trigger(document,"core:requestLoadStart"),Array.isArray(e)||(e=[e]);for(const t of e){if(!t||""===t)continue;const e=t.split("/").pop().split("?")[0];await new Promise(((n,o)=>{TypechoCore.engine.requestNew(e,((o,i)=>{if(i)n();else if(e.endsWith(".js")){const e=document.createElement("script");e.src=t,e.onload=()=>{o(n)},e.onerror=()=>{console.error(`JavaScript 文件 ${t} 加载失败。`)},document.head.appendChild(e)}else if(e.endsWith(".css")){const e=document.createElement("link");e.href=t,e.type="text/css",e.rel="stylesheet",e.addEventListener("load",(()=>{o(n)})),e.onerror=()=>{console.error(`样式表文件 ${t} 加载失败。`)},document.head.appendChild(e)}}))}))}TypechoCore.trigger(document,"core:requestLoadEnd")},isResolved:function(e){return TypechoCore.resolvedRequests.includes(e)},seekResourceFromDOM:()=>{document.querySelectorAll("[data-require]").forEach((e=>{TypechoCore.engine.requestResource(e.dataset.require).then()}))},handleServerResponse:function(e){if("string"==typeof e)try{e=JSON.parse(e)}catch(e){return void console.warn("从服务器返回的数据无效。",e)}const t=e.message;TypechoCore.xhr.lastFormResponse=e,t&&TypechoCore.ui.flashMessage(t,2e3);const n=e.action;if(n&&"message"!==n&&"flashMessage"!==n){const o=e.redirect;switch(n){case"goBack":window.history.go(-1);break;case"tough":!function(e,n=2e3){function o(){e?location.href=e:location.reload()}t?setTimeout(o,n):o()}(o,e.delay);break;case"redirect":TypechoCore.xhr.redirect(o);break;default:TypechoCore.xhr.redirect()}}else e.redirect&&TypechoCore.xhr.redirect(e.redirect);TypechoCore.trigger(document,e.success?"core:xhrPositive":"core:xhrNegative")}},ui:{overlay:null,flashMessage:function(e,t=1250,n=null){const o=document.createElement("div"),i=document.createElement("div");o.classList.add("flashMessage"),i.classList.add("flashMessage-content"),i.innerHTML=e,o.appendChild(i),document.body.appendChild(o),TypechoCore.ui.addClassTransitioned(o,"is-active"),setTimeout((function(){TypechoCore.ui.removeClassTransitioned(o,"is-active",(()=>{o.remove(),n&&n()}))}),Math.max(1e3,t))},setupHtmlInsert:function(e,t,n,o=!1,i="",s=280,r="cubic-bezier(0.215,0.6,0.35,1)",a){if("string"==typeof t){const e=document.createRange();t=e.createContextualFragment(t).firstElementChild}switch(n){case-1:e.parentNode.insertBefore(t,e);break;case 0:e.insertBefore(t,e.firstChild);break;default:e.appendChild(t)}o&&t.scrollIntoView();const c=this.getOuterHeight(t);t.style.maxHeight="0",t.style.overflowY="clip";const l=[{maxHeight:getComputedStyle(t).maxHeight},{maxHeight:c}],d={duration:s,easing:r};return i&&t.classList.add(i),t.animate(l,d).addEventListener("finish",(()=>{t.style.maxHeight="unset",t.style.overflow="inherit"})),TypechoCore.Element.activate(t),"function"==typeof a&&a(),t},sticky:function(e,t={}){if(!e)return;t={stickyClass:"is-sticky",stickyDisabledClass:"is-sticky-disabled",minWindowHeight:0,setCss:!0,offsetTop:null,...t};let n=null,o=null;function i(){const o=document.documentElement.clientHeight<t.minWindowHeight;n&&o?function(){n=!1,e.classList.add(t.stickyDisabledClass),e.classList.remove(t.stickyClass),t.setCss&&(e.style.position="static",e.style.top="auto");window.removeEventListener("scroll",r)}():n||o||s()}function s(){n=!0,e.classList.remove(t.stickyDisabledClass),t.setCss&&(e.style.position="sticky",e.style.top=this.offsetTop+"px"),r(),window.addEventListener("scroll",r)}function r(){const n=Math.floor(e.getBoundingClientRect().top);n<o||n===o&&window.scrollY>0?e.classList.add(t.stickyClass):e.classList.remove(t.stickyClass)}o=null===t.offsetTop?parseInt(window.getComputedStyle(e).top||0,10):t.offsetTop,0===t.minWindowHeight?s():(i(),window.addEventListener("resize",i))},float:function(e,t={}){const n=e.querySelector(".js-floatHandler");if(!n)return void console.warn("浮动容器未提供 js-floatHandler 手柄。");t={magnetic:!0,blockSwitchableClose:!0,onDragging:null,onDragEnd:null,onBackOriginal:null,...t};const o=window.getComputedStyle(e);"static"===o.position&&(e.style.position="absolute");const i=o.transition;let s,r,a=!1,c=0,l=0,d=0,u=0;const h=30;let p,m,f,y,g,v,T=!0,C=!1;function w(o){if(!a)return;const i=o.clientX-c,s=o.clientY-l;e.classList.add("js-floatDragged","is-dragging");const r=u+s,y=d+i;if(e.style.top=`${r}px`,e.style.left=`${y}px`,"function"==typeof t.onDragging&&t.onDragging(n,o),t.magnetic){const t=Math.hypot(y-m,r-f);p.classList.remove("u-hidden"),t<h?(e.style.top=`${f}px`,e.style.left=`${m}px`,T=!0):T=!1}}function L(){a=!1,e.classList.remove("is-dragging"),e.style.transition=i,"function"==typeof t.onDragEnd&&t.onDragEnd(n),t.magnetic&&(p.classList.add("u-hidden"),T?(e.classList.remove("js-floatDragged"),e.classList.add("js-magnetAligned"),e.dataset.block="","function"==typeof t.onBackOriginal&&t.onBackOriginal()):(e.classList.remove("js-magnetAligned"),t.blockSwitchableClose&&(e.dataset.block="true")));const o=e.getBoundingClientRect();s=o.top/window.innerHeight,r=o.left/window.innerWidth,document.removeEventListener("mousemove",w),document.removeEventListener("mouseup",L)}window.addEventListener("resize",(t=>{const n=window.innerHeight,o=window.innerWidth;r&&(e.style.top=n*s+"px",e.style.left=o*r+"px"),C&&(f=g*n,m=y*o,p.style.top=`${f}px`,p.style.left=`${m}px`)})),n.style.cursor="move",n.addEventListener("mousedown",(function(n){n.preventDefault(),a=!0,c=n.clientX,l=n.clientY;const i=e.getBoundingClientRect();u=i.top,d=i.left,!C&&t.magnetic&&(f=i.top,m=i.left,y=m/window.innerWidth,g=f/window.innerHeight,v=o.transform,p=document.createElement("div"),p.classList.add("js-floatDragHelper"),p.style.position="absolute",p.style.top=`${f}px`,p.style.left=`${m}px`,p.style.width=`${i.width}px`,p.style.height=`${i.height}px`,e.after(p),C=!0),e.style.transition="unset",document.addEventListener("mousemove",w),document.addEventListener("mouseup",L)}))},getOverlayHtml:function(e,t,n=""){if("string"==typeof e){e=(new DOMParser).parseFromString(e,"text/html")}else if(!(e instanceof HTMLElement))throw new Error("只能使用字符串或原始 HTML 元素创建 Overlay。");if(!e.classList.contains("overlay")){if(!t){const n=e.querySelector(".overlay-title");n.length&&(t=n.innerHTML,n.remove())}t||(t=document.querySelector("title").innerText);const o=e.querySelector(".overlay-content");o&&o.length&&(e=o);const i=function(e){const t=document.createElement("div");return t.classList.add(e),t},s=i("overlay");s.tabIndex=-1;const r=i("overlay-title");r.innerHTML=t;const a=i("overlay-content");a.appendChild(e),s.appendChild(r),s.appendChild(a),e=s,n&&e.classList.add(n)}return document.body.appendChild(e),e},getOuterHeight:function(e,t=!0,n=!0){let o=e.offsetHeight;if(t){const t=window.getComputedStyle(e);o+=parseFloat(t.marginTop)+parseFloat(t.marginBottom)}return n?o+"px":o},getCssTransitionDuration:function(e){if(!(e&&e instanceof Element))return 0;let t=window.getComputedStyle(e).transitionDuration,n=0;if(t){const e=/^(\+|-|)([0-9]*\.[0-9]+|[0-9]+)(ms|s)$/i,o=t.match(e);if(o){n=("-"===o[1]?-1:1)*parseFloat(o[2])*("ms"===o[3].toLowerCase()?1:1e3)}}return n},addClassTransitioned:function(e,t,n){requestAnimationFrame((()=>{setTimeout((()=>{e.classList.add(t)}),16.5)})),this._transitionHandler(e,n)},removeClassTransitioned:function(e,t,n){e.classList.remove(t),this._transitionHandler(e,n)},fadeIn:function(e,t=400,n){let o=e.style.display||window.getComputedStyle(e).display;"none"===o&&(o="block"),e.style.display=o,e.style.opacity="0",e.offsetHeight,e.style.transition=`opacity ${t}ms`,e.style.opacity="1","function"==typeof n&&setTimeout(n,t)},fadeOut:function(e,t=400,n){e.style.opacity="1",e.style.transition=`opacity ${t}ms`,e.style.opacity="0","function"==typeof n&&setTimeout(n,t)},classTo:function(e,t,n){const o=String(t||"").split(/\s+/),i=String(n||"").split(/\s+/);o.forEach((t=>t&&e.classList.remove(t))),i.forEach((t=>t&&e.classList.add(t)))},createOverlay:function(e,t=!0){const n=document.createElement("div");n.classList.add("overlay-container"),n.appendChild(e),n.addEventListener("mousedown",(function(e){n.dataset.blockClose="",e.target!==n&&(n.dataset.blockClose="true")})),n.addEventListener("click",(function(e){e.target===n&&t&&(n.dataset.blockClose||TypechoCore.ui.destroyOverlay()),n.dataset.blockClose=""})),document.body.classList.add("is-modalOpen"),document.body.appendChild(n),TypechoCore.ui.addClassTransitioned(n,"is-active"),TypechoCore.xhr.registerOnce(this.destroyOverlay,"success",this),this.overlay=n},destroyOverlay:function(){const e=this.overlay;e&&(this.removeClassTransitioned(e,"is-active",(()=>{document.body.classList.remove("is-modalOpen"),e.remove()})),this.overlay=null)},dialog:function(e,t,n,o=!0){return new Promise(((i,s)=>{const r=document.createElement("div");r.classList.add("p-dialog--message");let a=t;if("string"==typeof t){a=(new DOMParser).parseFromString(t,"text/html")}if(a instanceof HTMLElement?r.appendChild(a):r.innerHTML=t,n){const e=document.createElement("div");e.classList.add("p-dialog--action"),n.forEach((t=>{void 0===t.destroyOnClick&&(t.destroyOnClick=!0),t.type&&void 0!==t.type||(t.type="default");const n=document.createElement("button");n.innerText=t.text;const o=t.callback;n.addEventListener("click",(function(e){"function"==typeof o&&o(),t.destroyOnClick&&TypechoCore.ui.destroyOverlay(),i(t)})),n.classList.add("p-button"),n.classList.add("p-button--"+t.type),e.appendChild(n)})),r.appendChild(e)}const c=this.getOverlayHtml(r,e,"overlay-dialog");this.createOverlay(c,o)}))},switchable:function(e,t=null,n="u-hidden"){if(t&&t instanceof HTMLElement||(t=document.querySelector(e.dataset.switchTarget)),!t)return;const o=function(o=!1){!o&&t.dataset.block||(t.classList.add(n),e.classList.remove("js-on"),TypechoCore.trigger(t,"switchable:hide"),window.removeEventListener("click",i))},i=t=>{const n=t.detail.switchTrigger;let i=n&&n!==e,r=t.target;i&&(r=n),s(r)&&o(!1)},s=e=>{try{return!t.contains(e)}catch(e){return!1}};return e.addEventListener("click",(function(s){t.classList.contains(n)?(t.classList.remove(n),window.addEventListener("click",i)):o(!0),TypechoCore.trigger(window,"click",{switchTrigger:e}),s.stopPropagation()})),o(),TypechoCore.utils.setPair(e,t),TypechoCore.xhr.register((()=>o())),t},inspector:function(e,t,n=["inspector","is-loading"],o="span"){if(!n||!Array.isArray(n))return;if(!(e instanceof HTMLElement))return;const i=document.createElement(o);i.innerText=t,n.forEach((e=>i.classList.add(e))),e.appendChild(i);return{element:i,remove:function(){TypechoCore.ui.removeClassTransitioned(i,"is-loading",(function(){i.remove()}))}}},inspectorButton:function(e,t="处理中",n="loading"){if(!n||"string"!=typeof n)return;if(!(e instanceof HTMLElement))return;const o=e.innerHTML;e.style.pointerEvents="none";const i=document.createElement("div");i.classList.add(n),e.replaceChildren(i),e.innerHTML=e.innerHTML+t;return{element:e,recover:function(){e.removeChild(i),e.innerHTML=o,e.style.pointerEvents=""},remove:()=>e.remove()}},idleByTimeout:function(e,t,n,o,i){let s=!1,r=!1,a=!1,c=null,l=null;const d=()=>{c=setTimeout((()=>{s||a||(t(),s=!0)}),o)},u=()=>{l=setTimeout((()=>{n(),s=!1,d()}),i)},h=()=>{r||(a=!0,s&&(clearTimeout(l),u()))},p=()=>{clearTimeout(c)},m=()=>{r||(a=!1,clearTimeout(l),d())},f=()=>{r=!1,e.addEventListener("mouseenter",h),e.addEventListener("mousemove",p),e.addEventListener("mouseleave",m),a?u():d()};return f(),{suspend:(t=!0)=>{r||(t&&(n(),s=!1),e.removeEventListener("mouseenter",h),e.removeEventListener("mousemove",p),e.removeEventListener("mouseleave",m),clearTimeout(c),clearTimeout(l),r=!0)},recover:f}},detach:function(e){return e.parentNode?e.parentNode.removeChild(e):null},createNode:function(e){const t=document.createElement("template");return t.innerHTML=e,t.children},_transitionHandler:function(e,t){if("function"!=typeof t)return;const n=this.getCssTransitionDuration(e);setTimeout(t,n)}},storage:{localStorageArray:function(e,t=null){let n=JSON.parse(localStorage.getItem(e));if(!t)return n;n||(n=[]),n.push(t),localStorage.setItem(e,JSON.stringify(n))},localStorageArrayExists:function(e,t){const n=this.localStorageArray(e);return n&&n.includes(t)}},content:{cid:null,areaId:"contentArea",html:null,permalink:"",pageTitle:null,getArea:function(){return document.getElementById(this.areaId)},registerArea:function(e=null){e?TypechoCore.content.areaId=e:e=TypechoCore.content.areaId;const t=document.getElementById(e);TypechoCore.content.html=t?t.innerHTML:null},registerPageTitle:function(e){const t=document.querySelector(e);return t&&t instanceof HTMLElement?this.pageTitle=t.innerText:this.pageTitle="",this.pageTitle},fetchPermalinkCid:function(){const e=document.querySelector("[data-permalink]"),t=document.querySelector("[data-cid]");TypechoCore.content.cid=t?.dataset.cid||null,TypechoCore.content.permalink=e?.dataset.permalink||null}},Processor:{},Callback:{},State:{loadedFrom:"browser",init:function(){TypechoCore.xhr.register((e=>{e&&(!0===e.backward?this.loadedFrom="backward":!0===e.forward?this.loadedFrom="forward":this.loadedFrom="click")}),!1,"send",this)},isLoadedForm:function(e=null){return e?this.loadedFrom===e:this.loadedFrom}},Element:{activate:function(e=document.body,t=null){const n="[data-typecho-init"+(t?"="+t:"")+"]",o=e.querySelectorAll(n);for(const e of o){if(e.dataset.initialized)continue;const t=e.dataset.typechoInit,n=TypechoCore.initRegistry[t];try{const t=TypechoCore.Element[n];"function"==typeof t&&(e.dataset.initialized="true",t(e))}catch(e){console.warn("触发器 "+t+" 出现了内部问题。",e)}}TypechoCore.trigger(e,"core:elementReady")},pageTitle:function(e){document.title=e.innerText},syncToc:function(e){const t=document.querySelector(".toc-list");if(!t)return;const n=e.querySelector(".js-switchable");TypechoCore.ui.switchable(n);const o=t.querySelectorAll("a"),i=window.location.href;o.forEach((e=>{e.href.includes(i)?(e.classList.add("is-active"),e.parentNode.classList.add("is-active-li")):(e.classList.remove("is-active"),e.parentNode.classList.remove("is-active-li"))}))},ajaxSubmit:function(e){e.dataset.trustedSubmitter="true";let t=e.closest("form"),n=t.getAttribute("action")??window.location.href;const o=t.getAttribute("method"),i=e.dataset.htmlResponse,s=e.getAttribute("rel"),r=e.getAttribute("name"),a=e.dataset.callback,c=e.dataset.preprocess,l=e.getAttribute("value"),d=e.getAttribute("href");function u(){if(c)try{t=TypechoCore.Processor[c](t)}catch(e){console.warn("XHR 表单提交的预处理行为 "+c+" 出现错误。",e)}TypechoCore.xhr.request({url:n,method:o,form:t,responseType:i?"":"json",success:e=>function(e){if("string"!=typeof e){if(a)try{TypechoCore.Callback[a](e,TypechoCore.utils.getNonceFormData(t))}catch(e){console.warn("动态表单提交回调 "+a+" 出现错误。",e)}TypechoCore.engine.handleServerResponse(e)}else{const e=i?n+"?"+TypechoCore.utils.getNonceFormData(t):n;TypechoCore.xhr.redirect(e)}}(e),error:function(e,t,n){console.error("服务器未能返回预期数据。",t,n)}})}r?n+=(-1!==n.indexOf("?")?"&":"?")+r+"="+l:d&&(n=d),s&&(n=s),e.addEventListener("click",(function(e){e.preventDefault(),u()})),t.addEventListener("submit",(function(e){e.preventDefault();const t=document.activeElement;if(!t.dataset.trustedSubmitter)return console.warn("表单中有元素尝试触发提交,但被拒绝了。",t),!1;u()}))},overlay:function(e){const t=e.href;if(!t)return;const n=e.dataset.fragment,o=e.dataset.secure,i=e.dataset.autoClose,s=e.getAttribute("title");e.addEventListener("click",(function(e){e.preventDefault(),e.stopPropagation(),TypechoCore.xhr.request({url:t,method:"GET",data:{proxy:!!o},success:e=>{const t=(new DOMParser).parseFromString(e,"text/html"),o=document.createElement("div");o.append(...t.body.children);e=(n?o.querySelector(n):null)||o.querySelector(".js-overlay");const r=TypechoCore.ui.getOverlayHtml(e,s);if(TypechoCore.ui.createOverlay(r),i){const e=()=>{TypechoCore.ui.destroyOverlay(),document.removeEventListener("core:xhrPositive",e)};document.addEventListener("core:xhrPositive",e,{once:!0})}TypechoCore.Element.activate(r)}})}))},captcha:function(e){const t=e.dataset.provider??"grecaptcha";let n;function o(){n.reset()}n=window[t],this.captchaProvider=n,n&&(document.addEventListener("core:xhrNegative",o),TypechoCore.xhr.registerOnce((function(){document.removeEventListener("core:xhrNegative",o)}),"send"))}}},TypechoCore.init();