/** * Legacy frontend runtime — page behaviours, lazy module orchestration. * * @package AKSRT */ //libs-插件 //jQuery.cookie jQuery.cookie = function (e, o, t) { if (void 0 === o) { var i = null; if (document.cookie && '' != document.cookie) for (var r = document.cookie.split(';'), n = 0; n < r.length; n++) { var c = jQuery.trim(r[n]); if (c.substring(0, e.length + 1) == e + '=') { i = decodeURIComponent(c.substring(e.length + 1)); break; } } return i; } (t = t || {}), null === o && ((o = ''), (t.expires = -1)); var a = ''; if (t.expires && ('number' == typeof t.expires || t.expires.toUTCString)) { var l; 'number' == typeof t.expires ? ((l = new Date()), l.setTime(l.getTime() + 24 * t.expires * 60 * 60 * 1e3)) : (l = t.expires), (a = '; expires=' + l.toUTCString()); } var u = t.path ? '; path=' + t.path : '', s = t.domain ? '; domain=' + t.domain : '', m = t.secure ? '; secure' : ''; document.cookie = [e, '=', encodeURIComponent(o), a, u, s, m].join(''); }; var lcs = { get: function (e) { return window.localStorage ? localStorage.getItem(e) : jQuery.cookie(e); }, set: function (e, o) { window.localStorage ? (localStorage[e] = o) : jQuery.cookie(e, o); }, remove: function (e) { window.localStorage ? localStorage.removeItem(e) : jQuery.cookie(e, ''); }, }; /** * 读取 PHP 注入的 JS 国际化文案(语义化 key) * @param {string} key * @returns {string} */ function aksrt__(key) { var map = window._win && window._win.i18n; return map && Object.prototype.hasOwnProperty.call(map, key) ? map[key] : key; } /** 检测 AJAX 响应是否含 WordPress 致命错误 */ function aksrt_is_fatal_error_response(text) { return text && (text.indexOf('Fatal error') > -1 || text.indexOf('致命错误') > -1); } /** * 简单 sprintf:key 对应带 %s、%1$s 占位符的文案 */ function aksrt_sprintf(key) { var args = Array.prototype.slice.call(arguments, 1); var str = aksrt__(key); var autoIndex = 0; return str.replace(/%(\d+\$)?s/g, function (match, num) { var idx = num ? parseInt(num, 10) - 1 : autoIndex++; return args[idx] !== undefined && args[idx] !== null ? args[idx] : match; }); } //lazySizes (function (window, factory) { var lazySizes = factory(window, window.document, Date); window.lazySizes = lazySizes; if (typeof module == 'object' && module.exports) { module.exports = lazySizes; } })(typeof window != 'undefined' ? window : {}, function l(window, document, Date) { // Pass in the windoe Date function also for SSR because the Date class can be lost 'use strict'; /*jshint eqnull:true */ var lazysizes, lazySizesCfg; (function () { var prop; var lazySizesDefaults = { lazyClass: 'lazyload', loadedClass: 'lazyloaded', loadingClass: 'lazyloading', preloadClass: 'lazypreload', loadafterClass: 'lazyloadafter', errorClass: 'lazyerror', //strictClass: 'lazystrict', autosizesClass: 'lazyautosizes', srcAttr: 'data-src', srcsetAttr: 'data-srcset', sizesAttr: 'data-sizes', //preloadAfterLoad: false, minSize: 40, customMedia: {}, init: true, expFactor: 1.5, hFac: 0.8, loadMode: 2, loadHidden: true, ricTimeout: 0, throttleDelay: 125, }; lazySizesCfg = window.lazySizesConfig || window.lazysizesConfig || {}; for (prop in lazySizesDefaults) { if (!(prop in lazySizesCfg)) { lazySizesCfg[prop] = lazySizesDefaults[prop]; } } })(); if (!document || !document.getElementsByClassName) { return { init: function () {}, cfg: lazySizesCfg, noSupport: true, }; } var docElem = document.documentElement; var supportPicture = window.HTMLPictureElement; var _addEventListener = 'addEventListener'; var _getAttribute = 'getAttribute'; /** * Update to bind to window because 'this' becomes null during SSR * builds. */ var addEventListener = window[_addEventListener].bind(window); var setTimeout = window.setTimeout; var requestAnimationFrame = window.requestAnimationFrame || setTimeout; var requestIdleCallback = window.requestIdleCallback; var regPicture = /^picture$/i; var loadEvents = ['load', 'error', 'lazyincluded', '_lazyloaded']; var regClassCache = {}; var forEach = Array.prototype.forEach; var hasClass = function (ele, cls) { if (!regClassCache[cls]) { regClassCache[cls] = new RegExp('(\\s|^)' + cls + '(\\s|$)'); } return regClassCache[cls].test(ele[_getAttribute]('class') || '') && regClassCache[cls]; }; var addClass = function (ele, cls) { if (!hasClass(ele, cls)) { ele.setAttribute('class', (ele[_getAttribute]('class') || '').trim() + ' ' + cls); } }; var removeClass = function (ele, cls) { var reg; if ((reg = hasClass(ele, cls))) { ele.setAttribute('class', (ele[_getAttribute]('class') || '').replace(reg, ' ')); } }; var addRemoveLoadEvents = function (dom, fn, add) { var action = add ? _addEventListener : 'removeEventListener'; if (add) { addRemoveLoadEvents(dom, fn); } loadEvents.forEach(function (evt) { dom[action](evt, fn); }); }; var triggerEvent = function (elem, name, detail, noBubbles, noCancelable) { var event = document.createEvent('Event'); if (!detail) { detail = {}; } detail.instance = lazysizes; event.initEvent(name, !noBubbles, !noCancelable); event.detail = detail; elem.dispatchEvent(event); return event; }; var updatePolyfill = function (el, full) { var polyfill; if (!supportPicture && (polyfill = window.picturefill || lazySizesCfg.pf)) { if (full && full.src && !el[_getAttribute]('srcset')) { el.setAttribute('srcset', full.src); } polyfill({ reevaluate: true, elements: [el] }); } else if (full && full.src) { el.src = full.src; } }; var getCSS = function (elem, style) { return (getComputedStyle(elem, null) || {})[style]; }; var getWidth = function (elem, parent, width) { width = width || elem.offsetWidth; while (width < lazySizesCfg.minSize && parent && !elem._lazysizesWidth) { width = parent.offsetWidth; parent = parent.parentNode; } return width; }; var rAF = (function () { var running, waiting; var firstFns = []; var secondFns = []; var fns = firstFns; var run = function () { var runFns = fns; fns = firstFns.length ? secondFns : firstFns; running = true; waiting = false; while (runFns.length) { runFns.shift()(); } running = false; }; var rafBatch = function (fn, queue) { if (running && !queue) { fn.apply(this, arguments); } else { fns.push(fn); if (!waiting) { waiting = true; (document.hidden ? setTimeout : requestAnimationFrame)(run); } } }; rafBatch._lsFlush = run; return rafBatch; })(); var rAFIt = function (fn, simple) { return simple ? function () { rAF(fn); } : function () { var that = this; var args = arguments; rAF(function () { fn.apply(that, args); }); }; }; var throttle = function (fn) { var running; var lastTime = 0; var gDelay = lazySizesCfg.throttleDelay; var rICTimeout = lazySizesCfg.ricTimeout; var run = function () { running = false; lastTime = Date.now(); fn(); }; var idleCallback = requestIdleCallback && rICTimeout > 49 ? function () { requestIdleCallback(run, { timeout: rICTimeout }); if (rICTimeout !== lazySizesCfg.ricTimeout) { rICTimeout = lazySizesCfg.ricTimeout; } } : rAFIt(function () { setTimeout(run); }, true); return function (isPriority) { var delay; if ((isPriority = isPriority === true)) { rICTimeout = 33; } if (running) { return; } running = true; delay = gDelay - (Date.now() - lastTime); if (delay < 0) { delay = 0; } if (isPriority || delay < 9) { idleCallback(); } else { setTimeout(idleCallback, delay); } }; }; //based on http://modernjavascript.blogspot.de/2013/08/building-better-debounce.html var debounce = function (func) { var timeout, timestamp; var wait = 99; var run = function () { timeout = null; func(); }; var later = function () { var last = Date.now() - timestamp; if (last < wait) { setTimeout(later, wait - last); } else { (requestIdleCallback || run)(run); } }; return function () { timestamp = Date.now(); if (!timeout) { timeout = setTimeout(later, wait); } }; }; var loader = (function () { var preloadElems, isCompleted, resetPreloadingTimer, loadMode, started; var eLvW, elvH, eLtop, eLleft, eLright, eLbottom, isBodyHidden; var regImg = /^img$/i; var regIframe = /^iframe$/i; var supportScroll = 'onscroll' in window && !/(gle|ing)bot/.test(navigator.userAgent); var shrinkExpand = 0; var currentExpand = 0; var isLoading = 0; var lowRuns = -1; var resetPreloading = function (e) { isLoading--; if (!e || isLoading < 0 || !e.target) { isLoading = 0; } }; var isVisible = function (elem) { if (isBodyHidden == null) { isBodyHidden = getCSS(document.body, 'visibility') == 'hidden'; } return isBodyHidden || !(getCSS(elem.parentNode, 'visibility') == 'hidden' && getCSS(elem, 'visibility') == 'hidden'); }; var isNestedVisible = function (elem, elemExpand) { var outerRect; var parent = elem; var visible = isVisible(elem); eLtop -= elemExpand; eLbottom += elemExpand; eLleft -= elemExpand; eLright += elemExpand; while (visible && (parent = parent.offsetParent) && parent != document.body && parent != docElem) { visible = (getCSS(parent, 'opacity') || 1) > 0; if (visible && getCSS(parent, 'overflow') != 'visible') { outerRect = parent.getBoundingClientRect(); visible = eLright > outerRect.left && eLleft < outerRect.right && eLbottom > outerRect.top - 1 && eLtop < outerRect.bottom + 1; } } return visible; }; var checkElements = function () { var eLlen, i, rect, autoLoadElem, loadedSomething, elemExpand, elemNegativeExpand, elemExpandVal, beforeExpandVal, defaultExpand, preloadExpand, hFac; var lazyloadElems = lazysizes.elements; if ((loadMode = lazySizesCfg.loadMode) && isLoading < 8 && (eLlen = lazyloadElems.length)) { i = 0; lowRuns++; for (; i < eLlen; i++) { if (!lazyloadElems[i] || lazyloadElems[i]._lazyRace) { continue; } if (!supportScroll || (lazysizes.prematureUnveil && lazysizes.prematureUnveil(lazyloadElems[i]))) { unveilElement(lazyloadElems[i]); continue; } if (!(elemExpandVal = lazyloadElems[i][_getAttribute]('data-expand')) || !(elemExpand = elemExpandVal * 1)) { elemExpand = currentExpand; } if (!defaultExpand) { defaultExpand = !lazySizesCfg.expand || lazySizesCfg.expand < 1 ? (docElem.clientHeight > 500 && docElem.clientWidth > 500 ? 500 : 370) : lazySizesCfg.expand; lazysizes._defEx = defaultExpand; preloadExpand = defaultExpand * lazySizesCfg.expFactor; hFac = lazySizesCfg.hFac; isBodyHidden = null; if (currentExpand < preloadExpand && isLoading < 1 && lowRuns > 2 && loadMode > 2 && !document.hidden) { currentExpand = preloadExpand; lowRuns = 0; } else if (loadMode > 1 && lowRuns > 1 && isLoading < 6) { currentExpand = defaultExpand; } else { currentExpand = shrinkExpand; } } if (beforeExpandVal !== elemExpand) { eLvW = innerWidth + elemExpand * hFac; elvH = innerHeight + elemExpand; elemNegativeExpand = elemExpand * -1; beforeExpandVal = elemExpand; } rect = lazyloadElems[i].getBoundingClientRect(); if ((eLbottom = rect.bottom) >= elemNegativeExpand && (eLtop = rect.top) <= elvH && (eLright = rect.right) >= elemNegativeExpand * hFac && (eLleft = rect.left) <= eLvW && (eLbottom || eLright || eLleft || eLtop) && (lazySizesCfg.loadHidden || isVisible(lazyloadElems[i])) && ((isCompleted && isLoading < 3 && !elemExpandVal && (loadMode < 3 || lowRuns < 4)) || isNestedVisible(lazyloadElems[i], elemExpand))) { unveilElement(lazyloadElems[i]); loadedSomething = true; if (isLoading > 9) { break; } } else if (!loadedSomething && isCompleted && !autoLoadElem && isLoading < 4 && lowRuns < 4 && loadMode > 2 && (preloadElems[0] || lazySizesCfg.preloadAfterLoad) && (preloadElems[0] || (!elemExpandVal && (eLbottom || eLright || eLleft || eLtop || lazyloadElems[i][_getAttribute](lazySizesCfg.sizesAttr) != 'auto')))) { autoLoadElem = preloadElems[0] || lazyloadElems[i]; } } if (autoLoadElem && !loadedSomething) { unveilElement(autoLoadElem); } } }; var throttledCheckElements = throttle(checkElements); var switchLoadingClass = function (e) { var elem = e.target; if (elem._lazyCache) { delete elem._lazyCache; return; } resetPreloading(e); addClass(elem, lazySizesCfg.loadedClass); removeClass(elem, lazySizesCfg.loadingClass); addRemoveLoadEvents(elem, rafSwitchLoadingClass); triggerEvent(elem, 'lazyloaded'); //添加loadafterClass,防止后期二次触发动画 setTimeout(function () { addClass(elem, lazySizesCfg.loadafterClass); }, 700); }; var rafedSwitchLoadingClass = rAFIt(switchLoadingClass); var rafSwitchLoadingClass = function (e) { rafedSwitchLoadingClass({ target: e.target }); }; var changeIframeSrc = function (elem, src) { try { elem.contentWindow.location.replace(src); } catch (e) { elem.src = src; } }; var handleSources = function (source) { var customMedia; var sourceSrcset = source[_getAttribute](lazySizesCfg.srcsetAttr); if ((customMedia = lazySizesCfg.customMedia[source[_getAttribute]('data-media') || source[_getAttribute]('media')])) { source.setAttribute('media', customMedia); } if (sourceSrcset) { source.setAttribute('srcset', sourceSrcset); } }; var lazyUnveil = rAFIt(function (elem, detail, isAuto, sizes, isImg) { var src, srcset, parent, isPicture, event, firesLoad; if (!(event = triggerEvent(elem, 'lazybeforeunveil', detail)).defaultPrevented) { if (sizes) { if (isAuto) { addClass(elem, lazySizesCfg.autosizesClass); } else { elem.setAttribute('sizes', sizes); } } srcset = elem[_getAttribute](lazySizesCfg.srcsetAttr); src = elem[_getAttribute](lazySizesCfg.srcAttr); if (isImg) { parent = elem.parentNode; isPicture = parent && regPicture.test(parent.nodeName || ''); } firesLoad = detail.firesLoad || ('src' in elem && (srcset || src || isPicture)); event = { target: elem }; addClass(elem, lazySizesCfg.loadingClass); if (firesLoad) { clearTimeout(resetPreloadingTimer); resetPreloadingTimer = setTimeout(resetPreloading, 2500); addRemoveLoadEvents(elem, rafSwitchLoadingClass, true); } if (isPicture) { forEach.call(parent.getElementsByTagName('source'), handleSources); } if (srcset) { elem.setAttribute('srcset', srcset); } else if (src && !isPicture) { if (regIframe.test(elem.nodeName)) { changeIframeSrc(elem, src); } else { elem.src = src; } } if (isImg && (srcset || isPicture)) { updatePolyfill(elem, { src: src }); } } if (elem._lazyRace) { delete elem._lazyRace; } removeClass(elem, lazySizesCfg.lazyClass); rAF(function () { // Part of this can be removed as soon as this fix is older: https://bugs.chromium.org/p/chromium/issues/detail?id=7731 (2015) var isLoaded = elem.complete && elem.naturalWidth > 1; if (!firesLoad || isLoaded) { if (isLoaded) { addClass(elem, 'ls-is-cached'); } switchLoadingClass(event); elem._lazyCache = true; setTimeout(function () { if ('_lazyCache' in elem) { delete elem._lazyCache; } }, 9); } if (elem.loading == 'lazy') { isLoading--; } }, true); }); var unveilElement = function (elem) { if (elem._lazyRace) { return; } var detail; var isImg = regImg.test(elem.nodeName); //allow using sizes="auto", but don't use. it's invalid. Use data-sizes="auto" or a valid value for sizes instead (i.e.: sizes="80vw") var sizes = isImg && (elem[_getAttribute](lazySizesCfg.sizesAttr) || elem[_getAttribute]('sizes')); var isAuto = sizes == 'auto'; if ((isAuto || !isCompleted) && isImg && (elem[_getAttribute]('src') || elem.srcset) && !elem.complete && !hasClass(elem, lazySizesCfg.errorClass) && hasClass(elem, lazySizesCfg.lazyClass)) { return; } detail = triggerEvent(elem, 'lazyunveilread').detail; if (isAuto) { autoSizer.updateElem(elem, true, elem.offsetWidth); } elem._lazyRace = true; isLoading++; lazyUnveil(elem, detail, isAuto, sizes, isImg); }; var afterScroll = debounce(function () { lazySizesCfg.loadMode = 3; throttledCheckElements(); }); var altLoadmodeScrollListner = function () { if (lazySizesCfg.loadMode == 3) { lazySizesCfg.loadMode = 2; } afterScroll(); }; var onload = function () { if (isCompleted) { return; } if (Date.now() - started < 999) { setTimeout(onload, 999); return; } isCompleted = true; lazySizesCfg.loadMode = 3; throttledCheckElements(); addEventListener('scroll', altLoadmodeScrollListner, true); }; return { _: function () { started = Date.now(); lazysizes.elements = document.getElementsByClassName(lazySizesCfg.lazyClass); preloadElems = document.getElementsByClassName(lazySizesCfg.lazyClass + ' ' + lazySizesCfg.preloadClass); addEventListener('scroll', throttledCheckElements, true); addEventListener('resize', throttledCheckElements, true); addEventListener('pageshow', function (e) { if (e.persisted) { var loadingElements = document.querySelectorAll('.' + lazySizesCfg.loadingClass); if (loadingElements.length && loadingElements.forEach) { requestAnimationFrame(function () { loadingElements.forEach(function (img) { if (img.complete) { unveilElement(img); } }); }); } } }); if (window.MutationObserver) { new MutationObserver(throttledCheckElements).observe(docElem, { childList: true, subtree: true, attributes: true }); } else { docElem[_addEventListener]('DOMNodeInserted', throttledCheckElements, true); docElem[_addEventListener]('DOMAttrModified', throttledCheckElements, true); setInterval(throttledCheckElements, 999); } addEventListener('hashchange', throttledCheckElements, true); //, 'fullscreenchange' ['focus', 'mouseover', 'click', 'load', 'transitionend', 'animationend'].forEach(function (name) { document[_addEventListener](name, throttledCheckElements, true); }); if (/d$|^c/.test(document.readyState)) { onload(); } else { addEventListener('load', onload); document[_addEventListener]('DOMContentLoaded', throttledCheckElements); setTimeout(onload, 20000); } if (lazysizes.elements.length) { checkElements(); rAF._lsFlush(); } else { throttledCheckElements(); } }, checkElems: throttledCheckElements, unveil: unveilElement, _aLSL: altLoadmodeScrollListner, }; })(); var autoSizer = (function () { var autosizesElems; var sizeElement = rAFIt(function (elem, parent, event, width) { var sources, i, len; elem._lazysizesWidth = width; width += 'px'; elem.setAttribute('sizes', width); if (regPicture.test(parent.nodeName || '')) { sources = parent.getElementsByTagName('source'); for (i = 0, len = sources.length; i < len; i++) { sources[i].setAttribute('sizes', width); } } if (!event.detail.dataAttr) { updatePolyfill(elem, event.detail); } }); var getSizeElement = function (elem, dataAttr, width) { var event; var parent = elem.parentNode; if (parent) { width = getWidth(elem, parent, width); event = triggerEvent(elem, 'lazybeforesizes', { width: width, dataAttr: !!dataAttr }); if (!event.defaultPrevented) { width = event.detail.width; if (width && width !== elem._lazysizesWidth) { sizeElement(elem, parent, event, width); } } } }; var updateElementsSizes = function () { var i; var len = autosizesElems.length; if (len) { i = 0; for (; i < len; i++) { getSizeElement(autosizesElems[i]); } } }; var debouncedUpdateElementsSizes = debounce(updateElementsSizes); return { _: function () { autosizesElems = document.getElementsByClassName(lazySizesCfg.autosizesClass); addEventListener('resize', debouncedUpdateElementsSizes); }, checkElems: debouncedUpdateElementsSizes, updateElem: getSizeElement, }; })(); var init = function () { if (!init.i && document.getElementsByClassName) { init.i = true; autoSizer._(); loader._(); } }; setTimeout(function () { if (lazySizesCfg.init) { init(); } }); lazysizes = { cfg: lazySizesCfg, autoSizer: autoSizer, loader: loader, init: init, uP: updatePolyfill, aC: addClass, rC: removeClass, hC: hasClass, fire: triggerEvent, gW: getWidth, rAF: rAF, }; return lazysizes; }); //滑动手势minitouch jQuery.fn.minitouch = function (options) { var is_on = 'minitouch-isload'; var _e = jQuery(this); if (_e.data(is_on)) { return; } options = jQuery.extend( { direction: 'bottom', selector: '', start_selector: '', depreciation: 50, stop: false, onStart: false, onIng: false, onEnd: false, inEnd: false, }, options ); var is_stop = false; var dep = options.depreciation; var startX = 0; var startY = 0; var endX = 0; var endY = 0; var angle = 0; var distanceX = 0; var distanceY = 0; var dragging = false; var cssTransition = function (a, b, c, d, s) { var e, f, g; d && ((b += 'px'), (c += 'px'), (e = 'translate3D(' + b + ',' + c + ' , 0)'), (f = {}), (g = cssT_Support()), (f[g + 'transform'] = e), (f[g + 'transition'] = g + 'transform 0s linear'), (f['cursor'] = s), 'null' == d && ((f[g + 'transform'] = ''), (f[g + 'transition'] = '')), a.css(f)); }; var cssT_Support = function () { var a = document.body || document.documentElement; a = a.style; return '' == a.WebkitTransition ? '-webkit-' : '' == a.MozTransition ? '-moz-' : '' == a.OTransition ? '-o-' : '' == a.transition ? '' : void 0; }; var touch_selector = options.start_selector || options.selector; _e.on('touchstart pointerdown MSPointerDown', touch_selector, function (e) { startX = startY = endX = endY = angle = distanceX = distanceY = 0; startX = e.originalEvent.pageX || e.originalEvent.touches[0].pageX; startY = e.originalEvent.pageY || e.originalEvent.touches[0].pageY; dragging = !0; //兼容swiper if (jQuery(e.target).parentsUntil(touch_selector, '.swiper-container,.scroll-x').length) { dragging = !1; } }) .on('touchmove pointermove MSPointerMove', touch_selector, function (a) { var _move = options.start_selector ? (options.selector ? _e.find(options.selector) : _e.find(options.start_selector)) : jQuery(this); if (jQuery.isFunction(options.stop)) { is_stop = options.stop(_e, _move, startX, startY); } if (dragging && !is_stop) { endX = a.originalEvent.pageX || a.originalEvent.touches[0].pageX; endY = a.originalEvent.pageY || a.originalEvent.touches[0].pageY; distanceX = endX - startX; distanceY = endY - startY; angle = (180 * Math.atan2(distanceY, distanceX)) / Math.PI; 'right' == options.direction && ((distanceY = 0), (distanceX = angle > -40 && angle < 40 && distanceX > 0 ? distanceX : 0)); 'left' == options.direction && ((distanceY = 0), (distanceX = (angle > 150 || angle < -150) && 0 > distanceX ? distanceX : 0)); 'top' == options.direction && ((distanceX = 0), (distanceY = angle > -130 && angle < -50 && 0 > distanceY ? distanceY : 0)); 'bottom' == options.direction && ((distanceX = 0), (distanceY = angle > 50 && angle < 130 && distanceY > 0 ? distanceY : 0)); if (distanceX !== 0 || distanceY !== 0) { a.preventDefault ? a.preventDefault() : (a.returnValue = !1); cssTransition(_move, distanceX, distanceY, dragging, 'grab'); jQuery.isFunction(options.onIng) && options.onIng(_e, _move, distanceX, distanceY); } } }) .on('touchend touchcancel pointerup MSPointerUp', touch_selector, function () { var _move = options.start_selector ? (options.selector ? _e.find(options.selector) : _e.find(options.start_selector)) : jQuery(this); if (dragging && !is_stop) { cssTransition(_move, 0, 0, 'null', ''); jQuery.isFunction(options.inEnd) && options.inEnd(_e, _move, distanceX, distanceY); if (Math.abs(distanceX) > dep || Math.abs(distanceY) > dep) { jQuery.isFunction(options.onEnd) && options.onEnd(_e, _move, distanceX, distanceY); } startX = startY = endX = endY = angle = distanceX = distanceY = 0; dragging = !1; } }) .data(is_on, true); }; //全局WIN变量 _win.bd = jQuery('body'); _win.window = jQuery(window); _win.is_signin = !!_win.bd.hasClass('logged-in'); var _wid = _win.window.width(); var _hei = _win.window.height(); _win.bd.on('click', '[data-close]', function () { var e = jQuery(this).attr('data-close'); return jQuery(e).removeClass('show in'), !1; }); _win.bd.on('click', '[data-toggle-class]', function () { var c = jQuery(this).attr('data-toggle-class') || 'show'; var e = jQuery(this).attr('data-target') || this; return jQuery(e).toggleClass(c).trigger('toggleClass'), !1; }); //只允许一个dropup弹出框 _win.bd.on('click', only_drop); _win.bd.on('toggleClass', '.dropup,.dropdown', only_drop); function only_drop(e) { var drop = jQuery(e.target).closest('.dropup,.dropdown'); jQuery('.dropup.open,.dropdown.open').not(drop).removeClass('open'); } _win.bd.on('click', '.alert-dismissible > .close', function () { jQuery(this).parent().slideUp(); }); //按钮点击触发另一个按钮点击 _win.bd.on('click', '[data-onclick]', function () { var e = jQuery(this).attr('data-onclick'); return jQuery(e).click(); }); //单次绑定事件,只能绑定一次事件 jQuery.fn.OnlyOn = function (type, selector, data, fun) { var rnotwhite = /\S+/g; var is_oned = false; //提取第一个绑定类型 type = type.match(rnotwhite)[0]; //获取目前已经绑定的全部事件 var events = jQuery._data(this[0], 'events'); if (events && typeof events['type'] != 'undefined') { jQuery.each(events[type], function (i, item) { if (item.selector == selector && item.data == data) { is_oned = true; return false; } }); } if (!is_oned) { this.on(type, selector, data, fun); } else { console.log('事件重复绑定{type:' + type + ',selector:' + selector + ',data:' + data + '}'); } }; jQuery.fn.aksrt_ajax = function (data, success, noty, no_loading) { return aksrt_ajax(jQuery(this), data, success, noty, no_loading); }; jQuery.fn.countdown = function () { function getTimeRemaining(endtime, max_unit) { //endtime 为 ISO 8601 字符串 var date = new Date(); var now = date.getTime(); var endDate = new Date(endtime); //设置截止时间 var end = endDate.getTime(); var total = end - now; var seconds = (total / 1000) % 60; seconds = seconds.toFixed(2); var mseconds = ~~(total % 1000); var minutes = ~~((total / 1000 / 60) % 60); var hours = ~~((total / (1000 * 60 * 60)) % 24); var days = ~~(total / (1000 * 60 * 60 * 24)); if (max_unit === 'minute' && minutes > 0) { hours = 0; days = 0; minutes = ~~(total / 1000 / 60); } if (max_unit === 'hour' && hours > 0) { days = 0; hours = ~~(total / (1000 * 60 * 60)); } seconds = seconds < 10 ? '0' + seconds : seconds; minutes = minutes < 10 ? '0' + minutes : minutes; return { total, days, hours, minutes, seconds, mseconds, }; } jQuery(this).each(function () { var _this = jQuery(this); var endtime = _this.attr('data-countdown'); if (!endtime) { return; } //整数显示秒 var int_second = _this.attr('int-second'); var max_unit = _this.attr('max-unit'); _this.attr('title', aksrt__('countdown_end_time') + endtime); if (int_second === 'auto') { var t = getTimeRemaining(endtime, max_unit); int_second = t.days > 0; } function updateClock() { var t = getTimeRemaining(endtime, max_unit); if (int_second) { //去除小数点后面的数 t.seconds = t.seconds.toString().replace(/\.\d+$/, ''); } if (_this.find('.day').length) { _this.find('.day').html(t.days); } if (_this.find('.hour').length) { _this.find('.hour').html(t.hours); } if (_this.find('.minute').length) { _this.find('.minute').html(t.minutes); } if (_this.find('.second').length) { _this.find('.second').html(t.seconds); } else { var html = ''; if (t.days > 0) { html += '' + t.days + '' + aksrt__('countdown_day') + ''; } if (t.hours > 0 || t.days > 0) { html += '' + t.hours + '' + aksrt__('countdown_hour') + ''; } if (t.minutes > 0 || t.hours > 0 || t.days > 0) { html += '' + t.minutes + '' + aksrt__('countdown_minute') + ''; } html += '' + t.seconds + '' + aksrt__('countdown_second') + ''; _this.html(html); } if (t.total <= 0) { clearInterval(timeinterval); var over_text = _this.attr('data-over-text') || aksrt__('countdown_ended'); _this.html(over_text).trigger('countdown-over'); } } updateClock(); var timeinterval = setInterval(updateClock, int_second ? 1000 : 20); _this.removeAttr('data-countdown').addClass('countdown-box'); }); }; _win.dplayer = { tbquire: ['dplayer'], obj: {}, }; //视频 function new_dplayer() { var selector = '.new-dplayer:not(.dplayer-initialized),[data-dplayer]:not(.dplayer-initialized)'; //选择器 if (jQuery(selector).length) { jQuery(selector).each(function () { var _this = jQuery(this); get_new_dplayer(_this, function (dplayer) { _this .addClass('dplayer-initialized') .siblings('.dplayer-featured') .find('.switch-video') .each(function () { var _this = jQuery(this); var video_url = _this.attr('video-url'); var video_pic = _this.attr('video-pic'); _this.data({ 'video-url': video_url, 'video-pic': video_pic, }); _this.attr({ 'dplayer-id': dplayer.container.id, }); setTimeout(function () { _this.removeAttr('video-url').removeAttr('video-pic'); }, 50); }); }); }); } } /** * @description: 获取新的dplayer * @param {*} _this 当前元素 * @param {*} func 回调函数 * @return {*} 返回dplayer的id */ function get_new_dplayer(_this, func) { var option = {}; var video_url = _this.attr('video-url') || _this.data('video-url'); var data_volume = _this.attr('data-volume'); var i = parseInt((Math.random() + 1) * Math.pow(10, 4)); if (_this.find('.dplayer-video-wrap').length || !video_url) return; _this.attr('id', 'dplayer-' + i); option.container = document.getElementById('dplayer-' + i); option.theme = '#f04494'; option.video = { url: video_url, pic: _this.attr('video-pic') || '', type: _this.attr('video-type') || 'auto', }; _this.attr('data-loop') && (option.loop = true); _this.attr('data-autoplay') && (option.autoplay = true); if (data_volume && data_volume < 1) { option.volume = data_volume; } if (data_volume === 'none') { option.volume = 0; } var option_attr = _this.attr('video-option'); if (option_attr) { try { option_attr = JSON.parse(option_attr); } catch (e) { console.log(e); } jQuery.extend(option, option_attr); } //第三方插件判断添加 var v_u = video_url.toLowerCase(); v_u.indexOf('.m3u') != -1 && _win.dplayer.tbquire.push('hls'); v_u.indexOf('.mpd') != -1 && _win.dplayer.tbquire.push('dash'); v_u.indexOf('.flv') != -1 && _win.dplayer.tbquire.push('flv'); jQuery('link#dplayer').length || jQuery('dplayer').append(''); _win.dplayer.tbquire.push('dplayer'); tbquire(_win.dplayer.tbquire, function () { try { var newDPlayer = new DPlayer(option); newDPlayer.on('play', function () { _win.dplayer.play = newDPlayer; }); _this.data('dplayer', newDPlayer); _win.dplayer.obj[i] = newDPlayer; _this.attr({ 'video-url': '', 'video-pic': '', }); jQuery.isFunction(func) && func(newDPlayer); } catch (e) { console.error(e); } }); return i; } _win.bd.on('click', '.swiper-slide.slide-dplayer:not(.slide-dplayer-played) > *', function () { var _this = jQuery(this); var dplayer = _this.find('.new-dplayer').data('dplayer'); if (dplayer) { dplayer.play(); _this.parent().addClass('slide-dplayer-played'); } }); //视频列表图封面 function thumb_dplayer(mouseenter_e, box_e) { var $body = jQuery('body'); var thumb_dplayer_data_text = 'thumb_dplayer_data'; var thumb_dplayer_data = $body.data(thumb_dplayer_data_text) || {}; if (thumb_dplayer_data[mouseenter_e + box_e]) { return; } var ing_class = 'thumb-dplayer-playing'; var thumb_hide_class = 'dplayer-thumb-hide'; function to_play(_this_m, _this, dplayer) { _this.find('.dplayer-thumb').removeClass(thumb_hide_class); _win.dplayer.thumb_play = dplayer; _this.find('.progress').show(); _this_m.addClass(ing_class); } function to_pause(_this_m, _this, dplayer) { dplayer.pause(); _this.find('.dplayer-thumb').addClass(thumb_hide_class); _win.dplayer.thumb_play = false; _this.find('.progress').hide(); _this_m.removeClass(ing_class); } function video_thumb_stop() { if (_win.dplayer.thumb_play) { var _this = jQuery(_win.dplayer.thumb_play.container).closest(box_e); var _this_m = _this.closest(mouseenter_e); to_pause(_this_m, _this, _win.dplayer.thumb_play); } } function video_thumb_play() { var _this_m = jQuery(this); var _this = _this_m.find(box_e); if (!_this.length) { return; } var dplayer = _this.find('.dplayer-thumb').data('dplayer'); if (dplayer) { to_play(_this_m, _this, dplayer); return dplayer.play(); } function dplayer_init(dplayer) { dplayer.on('loadeddata', function () { setTimeout(function () { _this.find('.progress-bar').css({ width: '100%', opacity: '0', transition: 'width .2s, opacity .3s .3s', }); }, 100); setTimeout(function () { _this.find('.progress').remove(); }, 800); }); setTimeout(function () { to_play(_this_m, _this, dplayer); dplayer.play(); }, 200); } if (!_this.find('.dplayer-thumb').length) { var video_url = _this.attr('video-url'); var video_volume = _this.attr('data-volume') || 'none'; var video_pic = ''; var scale_height = ~~_this.attr('scale-height'); var progress = '
'; var _dplayer = jQuery('
'); _this.find('.video-thumb').html(_dplayer).after(progress); setTimeout(function () { _this.find('.progress-bar').css({ transition: 'width 6s', width: '80%', }); }, 50); _this.attr('video-url', ''); get_new_dplayer(_dplayer, dplayer_init); } } $body.on('mouseenter touchstart', mouseenter_e, video_thumb_play); $body.on('mouseleave', mouseenter_e, video_thumb_stop); var thumb_dplayer_init = 'thumb_dplayer_init'; if (!$body.data(thumb_dplayer_init)) { $body .on('touchstart', function (e) { var _target = jQuery(e.target); if (!_target.parents('.' + ing_class).length && _win.dplayer.thumb_play) { video_thumb_stop(); } }) .data(thumb_dplayer_init, true); } thumb_dplayer_data[mouseenter_e + box_e] = true; $body.data(thumb_dplayer_data_text, thumb_dplayer_data); } //视频剧集 _win.bd.on('click', '.switch-video', function () { var _this = jQuery(this); var dplayer = jQuery('#' + _this.attr('dplayer-id')).data('dplayer'); var video_url = _this.data('video-url'); var video_pic = _this.data('video-pic'); if (!video_url || !dplayer || _this.hasClass('active')) return; _this.addClass('active').siblings().removeClass('active'); //第三方插件判断添加 var v_u = video_url.toLowerCase(); v_u.indexOf('.m3u') != -1 && _win.dplayer.tbquire.push('hls'); v_u.indexOf('.mpd') != -1 && _win.dplayer.tbquire.push('dash'); v_u.indexOf('.flv') != -1 && _win.dplayer.tbquire.push('flv'); tbquire(_win.dplayer.tbquire, function () { try { var op = { url: video_url, type: 'auto', }; if (video_pic) { op.pic = video_pic; } dplayer.switchVideo(op); setTimeout(function () { dplayer.play(); }, 100); } catch (e) { console.log(e); } }); }); //iframe剧集切换 _win.bd.on('click', '.switch-iframe', function () { var _this = jQuery(this); var video_url = _this.attr('iframe-url'); var $iframe = _this.closest('.iframe-series').find('iframe'); if (!video_url || _this.hasClass('active')) return; //执行切换 try { $iframe[0].contentWindow.location.replace(video_url); } catch (c) { $iframe.attr('src', video_url); } //激活状态 _this.addClass('active').siblings().removeClass('active'); }); //文章古腾堡TAB _win.bd.on('click', '.post-tab-toggle', function () { var _this = jQuery(this); var tab_id = _this.attr('tab-id'); if (_this.parent().hasClass('active')) return; var _con = _this .parent() .addClass('active') .siblings() .removeClass('active') .parent() .next() .find('[tab-id="' + tab_id + '"]'); _con.siblings().removeClass('in'); setTimeout(function () { _con.addClass('active').siblings().removeClass('active'); }, 150); setTimeout(function () { _con.addClass('in'); }, 160); }); //幻灯片 _win.swiper = []; _win.swiper.tab = {}; _win.swiper.scroll = {}; _win.swiper.new = {}; function new_swiper() { if (jQuery('.swiper-scroll:not(.swiper-container-initialized),.new-swiper:not(.swiper-container-initialized),.swiper-tab:not(.swiper-container-initialized)').length) { jQuery('link#swiper').length || jQuery('head').append(''); tbquire(['swiper'], function () { jQuery('.swiper-scroll').each(function (e) { if (jQuery(this).hasClass('swiper-container-initialized')) return; var option = {}; var _this = jQuery(this); var _eq = 'swiper-scroll-eq-' + e; var slideClass = _this.attr('data-slideClass') || false; slideClass && (option.slideClass = slideClass); if (!_this.attr('scroll-nogroup')) { var c_w = _this.width(); var i_w = _this.find('.swiper-wrapper>*:eq(0)').outerWidth(); var slidesPerGroup = ~~(c_w / i_w); option.slidesPerGroup = slidesPerGroup || 1; } option.autoplay = _this.attr('data-autoplay') ? { delay: ~~_this.attr('data-interval') || 4000, disableOnInteraction: false, } : false; option.loop = _this.attr('data-loop'); option.slidesPerView = 'auto'; option.mousewheel = { forceToAxis: true, }; option.freeMode = true; option.freeModeSticky = true; option.navigation = { nextEl: '.swiper-scroll.' + _eq + ' .swiper-button-next', prevEl: '.swiper-scroll.' + _eq + ' .swiper-button-prev', }; _this.addClass(_eq).attr('swiper-scroll-index', e); _win.swiper.scroll[e] = new Swiper('.swiper-scroll.' + _eq, option); }); jQuery('.swiper-tab').each(function (e) { if (jQuery(this).hasClass('swiper-container-initialized')) return; var _eq = 'swiper-eq-' + e; var _this = jQuery(this); var speed = ~~_this.attr('data-speed') || ~~((_this.width() + 1200) / 170) * 50; var initialSlide = ~~_this.attr('active-index'); speed = speed < 300 ? 300 : speed; var option = { loop: false, initialSlide: initialSlide, autoHeight: true, spaceBetween: 20, autoplay: false, speed: speed, pagination: { el: '.swiper-tab.' + _eq + ' .swiper-pagination', clickable: true, }, on: { init: function () { auto_maxHeight(); }, slideChangeTransitionEnd: function (bvv) { var b = jQuery('.swiper-tab.' + _eq + ' .swiper-slide-active .post_ajax_trigger .ajax-open'); if (b.length) { scrollTopTo(jQuery('.swiper-tab.' + _eq), -40); b.attr('no-scroll', true).click(); } var r = bvv.onStart && jQuery('[swiper-scroll-index="' + e + '"] .swiper-slide-thumb-active [data-route]'); if (r && r.length) { history.replaceState(null, document.title, r.attr('data-route')); } bvv.onStart = true; }, }, }; var tab_id = _this.attr('swiper-tab'); var tab_nav = jQuery('[swiper-tab-nav="' + tab_id + '"]'); if (tab_nav.length) { var tab_nav_index = tab_nav.attr('swiper-scroll-index'); option['thumbs'] = { swiper: _win.swiper.scroll[tab_nav_index], autoScrollOffset: 2, }; tab_nav.on('click', 'a[data-route]', function (e) { e.preventDefault(); }); } _this.addClass(_eq).attr('swiper-tab-index', e); _win.swiper.tab[e] = new Swiper('.swiper-tab.' + _eq, option); }); jQuery('.new-swiper').each(function (e) { if (jQuery(this).hasClass('swiper-container-initialized')) return; var _eq = 'swiper-eq-' + e; var _this = jQuery(this); var delay = ~~_this.attr('data-interval') || 6000; var autoplay = _this.attr('data-autoplay') ? { delay: delay, disableOnInteraction: false, } : false; var auto_h = _this.attr('auto-height') ? true : false; var speed = ~~_this.attr('data-speed') || ~~((_this.width() + 1000) / 22) * 10; speed = speed < 400 ? 400 : speed; speed = autoplay === false ? speed / 1.6 : speed; var loop = _this.attr('data-loop') ? true : false; var parallax = _this.find('[data-swiper-parallax],[data-swiper-parallax-scale]').length ? true : false; var effect = _this.attr('data-effect') || 'slide'; var direction = _this.attr('data-direction') || 'horizontal'; var spaceBetween = ~~_this.attr('data-spaceBetween') || 0; var pagination_type = _this.attr('data-pagination-type') || 'bullets'; _this.addClass(_eq).attr('swiper-new-index', e); var swiper_args = { loop: loop, autoHeight: auto_h, direction: direction, spaceBetween: spaceBetween, parallax: parallax, effect: effect, lazy: { loadPrevNext: !0, }, autoplay: autoplay, speed: speed, pagination: { el: '.new-swiper.' + _eq + ' .swiper-pagination', type: pagination_type, clickable: true, }, navigation: { nextEl: '.new-swiper.' + _eq + ' .swiper-button-next', prevEl: '.new-swiper.' + _eq + ' .swiper-button-prev', }, on: { lazyImageReady: function (slideEl, imageEl) { jQuery(imageEl).addClass('lazyloaded'); }, slideChange: function () { _this.find('.new-dplayer').each(function (index, item) { var dplayer = jQuery(item).data('dplayer'); if (dplayer) { dplayer.pause(); } }); }, init: function () { if (loop) { //解决loop模式下,图片放大后,前后重复的图片没有添加no-imgbox的问题 _this.find('.swiper-slide-duplicate img').addClass('no-imgbox'); } }, }, }; if (pagination_type === 'thumbnail') { swiper_args.pagination.type = 'bullets'; swiper_args.pagination.bulletClass = 'pagination-thumbnail-item'; swiper_args.pagination.bulletActiveClass = 'pagination-thumbnail-item-active'; swiper_args.pagination.renderBullet = function (index, className) { // console.log(this.slides[index], index); var imgsrc, thumbnail; var _img = jQuery(this.slides[index]).find('img'); //第一个 if (_img.length) { _img = jQuery(_img[0]); imgsrc = _img.attr('data-src') || _img.attr('src'); } if (imgsrc) { thumbnail = '
'; return thumbnail; } return ''; }; } _win.swiper.new[e] = new Swiper('.new-swiper.' + _eq, swiper_args); }); }); } } window.swiper_tab_AutoHeight = debounce(function ($con) { var tab = $con.closest('[swiper-tab-index]'); if (tab.length) { var tab_index = tab.attr('swiper-tab-index'); _win.swiper.tab[tab_index].updateAutoHeight(500); } }, 100); jQuery.fn.scrollX = function () { return this.each(function () { var _this = jQuery(this); var is_on = 'is-on'; if (!_this.data(is_on)) { _this.data(is_on, true); var btn_class = 'scroll-x-'; var prev_btn_class = btn_class + 'prev'; var next_btn_class = btn_class + 'next'; var prev = jQuery(''); var next = jQuery(''); init(); } function scroll(type) { var data = get_data(); _this.animate( { scrollLeft: type === 'prev' ? data[0] : data[1], }, 300, 'linear', hover_show ); } function init() { _this.after(prev).after(next); prev.on('click', function () { scroll('prev'); }); next.on('click', scroll); _this.parent().hover(hover_show, function () { prev.hide(); next.hide(); }); } function hover_show() { var data = get_data(); if (data[3]) { prev.show(); } else { prev.hide(); } if (data[3] < data[2]) { next.show(); } else { next.hide(); } } function get_data() { var _this_w = _this.innerWidth(); var _this_scrollLeft = _this.scrollLeft(); var max = ~~(_this.prop('scrollWidth') - _this_w); var prev_scroll = ~~(_this_scrollLeft - _this_w); prev_scroll = prev_scroll > 0 ? prev_scroll : 0; var next_scroll = ~~(_this_scrollLeft + _this_w); next_scroll = next_scroll > max ? max : next_scroll; return [prev_scroll, next_scroll, max, _this_scrollLeft]; } }); }; //让tab栏目的高亮元素显示在中间 jQuery.fn.Tabcenter = function () { return this.each(function () { var _this = jQuery(this); var _active = _this.find('.active'); if (_active.length) { var _this_w = _this.innerWidth(); var _active_w = _active.innerWidth(); var _this_scrollLeft = _this.scrollLeft(); var _active_left = _active.position().left; var max = ~~(_this.prop('scrollWidth') - _this_w); var _yd = ~~(_this_scrollLeft + _active_left - _this_w / 2 + _active_w / 2); _yd = _yd > 0 ? _yd : 0; _yd = _yd > max ? max : _yd; if (_yd != _this_scrollLeft) { _this.animate( { scrollLeft: _yd, }, 300 ); } } }); }; _win.bd.on('shown.bs.tab', 'a[data-ajax]', function () { jQuery(this).closest('ul.list-inline').Tabcenter(); }); jQuery('.tab-nav-theme,.tab-nav-but,.index-tab ul.list-inline').Tabcenter(); /** * @description: AJAX获取包装函数 * @param {*} _this 传入点击按钮的自己,需要有href或ajax-href下一页的链接(必须) * @param {*} con 需要插入的父元素选择器 (必须) * @param {*} jcon 获取内容的父元素选择器 (必须) * @param {*} item 获取的列表选择器 (必须) * @param {*} loader 加载动画的内容 (非必须,有默认值) * @param {*} pag 获取的分页内容选择器 (必须) * @param {*} next 如果需要重新插入下一页链接:获取分页内容中的下一页 选择器 * @param {*} trigger 将获取的下一页链接从新插入到的新的 按钮中-的class值 * @param {*} replace 替换列表内容而不是追加|'ajax-replace' * @param {*} nomore 全部加载完成之后的文案 * @param {*} top 将内容追加到顶部而不是底部 * @return {*} */ function post_ajax(_this, con, jcon, item, loader, pag, next, trigger, replace, nomore, top, ajax_trigger) { //准备参数 var $con = _this.closest(con); if ($con.attr('ing')) return !1; var $item = find(item); var href = _this.attr('ajax-href') || _this.attr('href') || _this.find('a').attr('ajax-href') || _this.find('a').attr('href'); jcon = jcon || con; ajax_trigger = ajax_trigger || (_win.ajax_trigger ? _win.ajax_trigger : '' + aksrt__('load_more')); replace = _this.attr('ajax-replace') || replace; nomore = nomore || _win.ajax_nomore; var $loader = find('.post_ajax_loader'); if (!$loader.length) { loader = loader || '

'; $loader = jQuery('
' + loader + '
'); } //3级目录find function find(selector, $parent, con_selector) { $parent = $parent && $parent.length ? $parent : $con; con_selector = con_selector || con; var $element = $parent.find('>' + selector); if ($element.length) { return $element; } //二级 $element = $parent.find('>*:not(' + con_selector + ')>' + selector); if ($element.length) { return $element; } //三级 $element = $parent.find('>*:not(' + con_selector + ')>*:not(' + con_selector + ')>' + selector); if ($element.length) { return $element; } //四级 $element = $parent.find('>*:not(' + con_selector + ')>*:not(' + con_selector + ')>*:not(' + con_selector + ')>' + selector); if ($element.length) { return $element; } return jQuery('null#null'); } href && jQuery.ajax({ type: 'POST', url: href, dataType: 'html', beforeSend: function () { if (replace && $item.length) { $item.remove(); } $con.attr('ing', true); find('.post_ajax_trigger').remove(); find('.no-more').remove(); find('.post_ajax_loader').remove(); find('.noajax-pag').remove(); find(pag).remove(); $item = find(item); //必须重新获取列表,因为可能已经删除了 if ($item.length) { top ? $item.first().before($loader) : $item.last().after($loader); } else { $con.append($loader); } $loader.fadeIn(); swiper_tab_AutoHeight($con); }, success: function (a) { a = jQuery.parseHTML('
' + a + '
'); var $a = jQuery(a); //全页面全局替换 $a.find('[win-ajax-replace]').each(function () { var replace_key = jQuery(this).attr('win-ajax-replace'); var replace_e = jQuery('[win-ajax-replace="' + replace_key + '"]'); if (replace_e.length) { replace_e.html(jQuery(this).html()); jQuery(this).remove(); } }); var $jcon = $a.find(jcon); var c_c = find(item, $jcon, jcon); //列表 var c_p = find(pag, $jcon, jcon); //下一页 var n_h = c_p.find(next).attr('href') || c_p.find(next).find('a').attr('href'); //下一页链接 c_p = c_p.length ? c_p : '
' + nomore + '
'; //是否还有下一页 c_p = $jcon.find('.noajax-pag').length ? $jcon.find('.noajax-pag') : c_p; //头部保留 if (trigger) { //将获取的下一页链接重新插入到的新的 按钮中 c_p = 'undefined' != typeof n_h ? '' + ajax_trigger + '' : c_p; } //添加头部 var $item_header = find('.ajax-item-header', $jcon, jcon); if ($item_header.length) { find('.ajax-item-header').remove(); //删除列表头部内容 $con.prepend($item_header); } $item = find(item); //必须重新获取列表,因为可能已经删除了 if ($item.length) { //原本有列表则追加 if (top) { //追加方向为顶部 $item.first().before(c_p).before(c_c); } else { //追加方向为底部 $item.last().after(c_p).after(c_c); } } else { //原本无列表则添加 if (top) { $con.append(c_p).append(c_c); } else { $con.append(c_c).append(c_p); } } $con.removeAttr('ing').trigger('post_ajax.ed', jQuery(a)); find('.post_ajax_loader', $con).hide(); if (!_this.attr('no-scroll')) { var _scroll_To = replace ? $con : jQuery(c_c[0]); setTimeout(function () { scrollTopTo(_scroll_To, -40); }, 100); } else { _win.auto_scroll = true; setTimeout(function () { _win.window.trigger('scroll'); _win.auto_scroll = false; }, 20); } if (_this.attr('route')) { var route_title = _this.attr('route-title') || $a.find('title').text(); history.replaceState(null, route_title, href); if (route_title) { jQuery('head title').text(route_title); } } swiper_tab_AutoHeight($con); auto_fun(); }, }); return !1; } _win.bd.on('click', '[remote-box]', function () { var _this = jQuery(this); var remote = _this.attr('remote-box'); if (remote) { jQuery.post(remote, null, function (data) { _this.html(data).removeAttr('remote-box'); auto_fun(); _this.trigger('aksrt:remote-loaded'); }); } }); _win.bd.on('show.bs.tab', 'a[data-ajax]', function () { var _this = jQuery(this); var a = _this.data('target') || _this.attr('href'); var selector = a + ' .post_ajax_trigger .ajax-next'; var b = jQuery(selector).attr('ajax-replace', true); if (b.length) { b.click(); } else { var href = _this.attr('data-ajax'); if (href) { var trigger = ''; jQuery(a).append(trigger); jQuery(selector).click(); } } if (_this.attr('only-one')) { _this.removeAttr('data-ajax'); } }); _win.bd.on('click', '[ajax-tab],[ajax-target]', function () { var _this = jQuery(this); var replace = _this.attr('ajax-replace') ? ' ajax-replace="true"' : ''; var target = _this.attr('ajax-tab') || _this.attr('ajax-target'); var href = _this.attr('data-ajax'); var trigger = ''; console.log(target); jQuery(target).find('.post_ajax_trigger').remove(); jQuery(target).append(trigger); jQuery(target + ' .post_ajax_trigger .ajax-next').click(); jQuery('a[href="' + target + '"]').click(); }); //文章手动ajax _win.bd.on('click', '.ajax-next', function (e) { e.preventDefault(); var _this = jQuery(this); if (_this.hasClass('pag-jump')) return false; var _loader = '
' + aksrt__('loading') + '
'; if (_this.attr('ajax-replace')) { _loader = '

'; _loader += _loader; _loader += _loader; } _loader = '
' + _loader + '
'; var t_con = _this.attr('ajaxpager-target') || '.ajaxpager'; var t_item = _this.attr('ajaxitem-target') || '.ajax-item'; var $item1 = _this.parents(t_con + ':eq(0)').find(t_item + ':first'); var $item1_class = $item1.attr('class'); if ($item1_class && $item1_class.indexOf('posts-item') > -1) { if ($item1_class.indexOf('card') > -1) { var loader_class = $item1_class.replace('ajax-item', ''); _loader = '

'; _loader = _loader.repeat(_wid > 766 ? (_wid > 992 && !jQuery('.sidebar').length ? 8 : 6) : 4); } else if ($item1_class.indexOf('list') > -1) { _loader = '

'; _loader = _loader.repeat(_wid > 766 ? 4 : 3); } } return post_ajax(_this, t_con, t_con, t_item, _loader, '.ajax-pag'); }); if (_wid < 769 && jQuery('.drawer-sm').length) { _win.bd.on('click', '[data-drawer]', function () { var _this = jQuery(this); var title = _this.attr('drawer-title') || ''; var drawer_selector = _this.attr('drawer-selector') || '.drawer-sm'; var action = _this.attr('data-drawer'); var route = _this.attr('route'); var route_back = _this.attr('route-back'); jQuery(drawer_selector).Drawer(action, title, route, route_back); }); var this_url = (window.parent.location.origin + window.parent.location.pathname).replace(/(\/*$)/g, ''); _win.url_request = window.parent.location.search; //兼容支付的GetRequest函数 setTimeout(function () { jQuery('[data-drawer][route="' + this_url + '"]').click(); }, 20); } else { _win.bd.on('shown.bs.tab', '[data-drawer][route]', tabOnRoute); _win.bd.on('hide.bs.tab', '[data-drawer][route]', tabOnRoute_hidden); } //tab路由 _win.bd.on('shown.bs.tab', '[data-route]', tabOnRoute); _win.bd.on('hide.bs.tab', '[data-route]', tabOnRoute_hidden); function tabOnRoute_hidden() { var _this = jQuery(this); if (!history.state) { var route = _this.attr('route') || _this.attr('data-route'); var tab_id = _this.attr('data-target'); if (route) { history.replaceState( { tab_id: tab_id, }, null, route ); } } } function tabOnRoute() { var _this = jQuery(this); if (_this.attr('onpopstate')) { _this.attr('onpopstate', false); } else { var route = _this.attr('route') || _this.attr('data-route'); var tab_id = _this.attr('data-target'); if (route) { routeGo(route, { tab_id: tab_id, }); } } } window.onpopstate = function (event) { var tab = event.state && jQuery('[data-toggle="tab"][data-target="' + event.state.tab_id + '"]'); if (tab && tab.length) { tab.attr('onpopstate', true).click(); } }; /** * @description: 设置浏览器网址 * @param {*} url * @param {*} title * @return {*} */ function routeGo(url, data, title) { title = title || document.title; if (url) { history.pushState(data, title, url); } } jQuery.fn.loading = function (action) { var _this = jQuery(this); action = action == 'show' || action == 'hide' ? action : _this.hasClass('loading-show') ? 'hide' : 'show'; var loading_class = 'loading-backdrop'; var loading_html = ''; if (action == 'show') { _this .addClass('loading-show') .append(loading_html) .find('.' + loading_class) .fadeIn(200); } else { _this .removeClass('loading-show') .find('.' + loading_class) .fadeOut(200, function () { jQuery(this).remove(); }); } return _this; }; /** * @description: 移动端全屏抽屉 * @param {*} * @return {*} */ jQuery.fn.Drawer = function (action, title, route, route_back) { title = title || ''; var _this = jQuery(this); if (!_this.length) return; action = action == 'show' || action == 'hide' ? action : _this.hasClass('show') ? 'hide' : 'show'; var _body = jQuery('body'); if (!_this.attr('on-start')) { _this.attr('on-start', true).minitouch({ direction: 'right', onEnd: function () { _this.Drawer('hide'); }, }); } function urlTo(url) { history.replaceState(null, document.title, url); } switch (action) { case 'show': var header = jQuery('
' + title + '
').on('click', '.drawer-close', function () { _this.Drawer('hide'); }); _body.append(header); setTimeout(function () { _body.addClass('drawer-show'); }, 10); route_back && _this.data('route_back', route_back); route && urlTo(route); return _this.addClass('show'); case 'hide': _body.removeClass('drawer-show'); setTimeout(function () { jQuery('.drawer-header').remove(); }, 400); urlTo(_this.data('route_back')); return _this.removeClass('show'); default: } }; //文章幻灯片 if (jQuery('.wp-block-carousel').length) { if (!jQuery('link#swiper').length) { jQuery('head').append(''); } var _sc = jQuery('.wp-block-carousel'); var Sw = []; tbquire(['swiper'], function () { _sc.each(function (si) { var _this = jQuery(this); var _eq = 'swiper-post-' + si; if (_this.find('.wp-block-gallery>.blocks-gallery-grid').length) { _this.find('.wp-block-gallery').html(_this.find('.wp-block-gallery>.blocks-gallery-grid').html()); } _this.find('.wp-block-gallery').removeClass().addClass('swiper-wrapper').find('.blocks-gallery-item,>.wp-block-image').addClass('swiper-slide'); _this.find('.carousel-control.left').replaceWith('
'); _this.find('.carousel-control.right').replaceWith('
'); var _ss = _this.find('.carousel'); var proportion = _ss.attr('proportion') || 0.6; var style = _ss.attr('style'); _ss.addClass(_eq + ' new-swiper scale-height').attr('style', '--scale-height:' + proportion * 100 + '%;'); _this.attr('style', style); var delay = ~~_ss.attr('data-interval') || 6000, loop = _ss.attr('data-jyloop') || false, effect = _ss.attr('data-effect') || 'slide'; var speed = ~~((_ss.width() + 1200) / 250) * 100; Sw['swiper_wz_' + si] = new Swiper('.wp-block-carousel .' + _eq, { spaceBetween: 10, speed: speed, loop: loop, effect: effect, autoplay: { delay: delay, disableOnInteraction: false, }, pagination: { el: '.' + _eq + ' .swiper-pagination', clickable: true, }, navigation: { nextEl: '.' + _eq + ' .swiper-button-next', prevEl: '.' + _eq + ' .swiper-button-prev', }, }); }); }); } /**模态框居中 */ _win.bd.on('show.bs.modal loaded.bs.modal', '.modal:not(.flex)', function () { var o = jQuery(this); var i = o.find('.modal-dialog'); o.css('display', 'block'), i.css({ 'margin-top': Math.max(0, (_hei - i.height()) / 2), }); }); _win.bd.on('show.bs.modal loaded.bs.modal', '.modal', function () { auto_fun(); }); _win.modal_z_index = 1050; _win.bd.on('show.bs.modal', '.modal', function () { _win.modal_z_index++; jQuery('.modal.in').addClass('modal-parent'); //父亲节点 jQuery(this).css('z-index', _win.modal_z_index).removeClass('modal-parent'); }); _win.bd.on('hide.bs.modal', '.modal', function () { jQuery('.modal.modal-parent').removeClass('modal-parent'); //父亲节点 }); //社交账号解绑 _win.bd.on('click', '.oauth-untying', function () { if (confirm(aksrt__('confirm_unbind')) == true) { var _this = jQuery(this), data = { action: 'user_oauth_untying', user_id: _this.attr('user-id'), type: _this.attr('untying-type'), _wpnonce: _this.attr('_wpnonce'), }; return aksrt_ajax(_this, data), !1; } }); //为用户授予勋章 _win.bd.on('click', '.medal-add-link', function () { if (confirm(aksrt__('confirm_grant_badge')) == true) { return aksrt_ajax(jQuery(this)), !1; } }); //为用户收回勋章 _win.bd.on('click', '.medal-remove-link', function () { if (window.confirm(aksrt__('confirm_revoke_badge'))) { aksrt_ajax(jQuery(this)); return false; } }); //打开对应的tab _win.bd.on('click', '[tab-id]', function (e) { var tab = jQuery(this).attr('tab-id'); if (tab) { var _tab = jQuery('a[data-target="#' + tab + '"]'); if (!_tab.length) { _tab = jQuery('a[href="#' + tab + '"]'); } if (_tab.length) { e.preventDefault(); _tab.tab('show'); } } }); //每次都刷新的模态框 _win.bd.on('click', '[data-toggle="RefreshModal"]', function (e) { e.preventDefault(); var _this = jQuery(this); var remote = _this.attr('data-remote'); if (!remote) { var action = _this.attr('data-action'); if (action) { remote = _win.ajax_url + '?action=' + action; } } refresh_modal({ class: _this.attr('data-class') || '', height: _this.attr('data-height') || 300, mobile_from_bottom: !!_this.attr('mobile-bottom'), new: _this.attr('new'), touch_close: !_this.attr('no-touch'), remote: remote, }); return false; }); /** * 刷新模态框 * @param {object} _config * @param {string} _config.class 模态框类名 * @param {number} _config.height 模态框初始高度 * @param {string} _config.mobile_from_bottom 移动端从底部弹出 * @param {boolean} _config.touch_close 是否显示触摸关闭 * @param {string} _config.remote 远程地址 * @param {string} _config.content 模态框内容 * @returns */ function refresh_modal(_config) { _config.mobile_from_bottom = typeof _config.mobile_from_bottom === 'undefined' ? true : _config.mobile_from_bottom; //默认从底部弹出 var id = 'refresh_modal'; var is_new = _config.new; var dataclass = _config.class || ''; var height = _config.height || 200; var mobile_bottom = _config.mobile_from_bottom && _wid < 769 ? ' bottom' : ''; var touch_close = typeof _config.touch_close === 'undefined' ? true : _config.touch_close; var modal_class = 'modal flex jc fade' + mobile_bottom; var remote = _config.remote || ''; var content = _config.content || ''; dataclass += ' modal-dialog'; id += is_new ? parseInt((Math.random() + 1) * Math.pow(10, 4)) : ''; var _id = '#' + id; var _modal = jQuery(_id); if (_modal.length) { var is_in = _modal.hasClass('in'); if (is_in) modal_class += ' in'; var $modal_content = _modal.find('.modal-content'); _modal.removeClass().addClass(modal_class); _modal.find('.modal-dialog').removeClass().addClass(dataclass); _modal.find('.loading-mask').fadeIn(200); _modal.find('.modal-body').fadeOut(200); $modal_content .css({ overflow: 'hidden', height: is_in ? $modal_content.height() : 100, }) .animate({ height: height, }); } else { var modal_html = ''; var loading = '
'; _win.bd.append(modal_html); _modal = jQuery(_id); _modal.on('hidden.bs.modal', function () { if (is_new) { jQuery(this).remove(); } else { jQuery(this).find('.modal-content').html(loading); } }); _modal.find('.modal-content').html(loading).css({ height: height, overflow: 'hidden', }); if (_wid < 769) { _modal.minitouch({ direction: 'bottom', selector: '.modal-dialog', start_selector: '.modal-colorful-header,.touch-close,.touch', onEnd: function () { _modal.modal('hide'); }, stop: function () { return !_modal.hasClass('bottom'); }, }); } } _modal.find('.touch-close').remove(); if (mobile_bottom && touch_close) { _modal.find('.modal-dialog').append('
'); } _modal.modal('show'); if (content) { _modal.find('.modal-body').html(content); _modal_content_open(); } else if (remote) { jQuery.post(remote, null, function (data) { _modal.find('.modal-body').html(data); setTimeout(function () { _modal.trigger('loaded.bs.modal'); }, 20); _modal_content_open(); }); } function _modal_content_open() { _modal.find('.modal-body').fadeIn(50, function () { var b_height = jQuery(this).outerHeight(true); _modal.find('.loading-mask').fadeOut(300); _modal.find('.modal-content').animate( { height: b_height, }, 300, 'swing', function () { _modal.find('.modal-content').css({ height: '', overflow: '', transition: '', }); } ); }); } return _modal; } window.auto_maxHeight = debounce(z_auto, 100); function z_auto() { _win.do_hh = document.documentElement.clientHeight; if (_win.do_hh > document.body.clientHeight) { var min_h = _win.do_hh - jQuery('.footer').outerHeight() - jQuery('.header').outerHeight() - 20; jQuery('main').animate({ 'min-height': min_h, }); } } window.auto_fun = debounce(z_auto_fun, 100); function z_auto_fun() { jQuery(document).trigger('auto_fun'); //自动搜索 jQuery('.auto-search').AutoSearch(); //控制器 jQuery('.dependency-box').dependency(); //可复制 jQuery('.cloneable').cloneable(); //倒计时 jQuery('[data-countdown]').countdown(); auto_maxHeight(); //兼容性图片懒加载 jQuery('img[data-src]:not(.lazyload,.lazyloaded,.lazyloading,.swiper-lazy)').addClass('lazyload'); /* 提示工具*/ jQuery("[data-toggle='tooltip']").tooltip({ container: 'body', }); //复制内容 jQuery('[data-clipboard-text]').length && tbquire(['clipboard']); jQuery("[data-toggle='popover']").popover({ sanitize: false, }); //浮动功能 if (_wid > 768) { jQuery('.fixed-wrap-nav').autoAffix(20, 38); jQuery('.relative>.scroll-x.no-scrollbar').scrollX(); } else { jQuery('.affix-header-sm').autoAffix(0, 20); } if (_wid > 900) { jQuery('.sidebar').sidebarAffix(); } //幻灯片检测 new_swiper(); //视频检测 new_dplayer(); // SVG-图标 tbquire(['svg-icon'], () => { show_svg(); }); //高亮代码 var _h_e = _win.highlight_kg ? 'pre code:not(.enlighter-origin)' : 'pre code.gl:not(.enlighter-origin),pre code.special:not(.enlighter-origin)'; jQuery(_h_e).length && tbquire(['enlighterjs'], function () { var lin = _win.highlight_hh ? !0 : !1; jQuery('link#enlighterjs').length || jQuery('head').append(''); jQuery(_h_e).enlight({ linenumbers: lin, indent: 2, textOverflow: 'scroll', rawcodeDbclick: !0, rawButton: !1, infoButton: !1, windowButton: !1, theme: _win.highlight_zt, }); }); //图片灯箱 _win.imgbox && jQuery('.alone-imgbox-img,a[data-imgbox],.comment-content .box-img,.wp-posts-content img,.imgbox-container').length && tbquire(['imgbox']); } //页面滚动监听函数 //创建闭包立即执行函数 (function () { var scroll_throttle = throttle(function () { var h = document.documentElement.scrollTop + document.body.scrollTop, ontop = jQuery('.ontop'); h > 100 ? _win.bd.addClass('body-scroll') : _win.bd.removeClass('body-scroll'); h > 400 ? ontop.addClass('show') : ontop.removeClass('show'); }, 100); _win.window.scroll(scroll_throttle); var debounce_scroll_end = debounce( function () { jQuery("[data-toggle='tooltip']").tooltip('hide'); }, 500, true ); _win.window.scroll(debounce_scroll_end); //滚动时隐藏一些元素 var debounce_scrolling_hide = debounce( function () { _win.bd.addClass('scroll-ing'); }, 500, true ); var debounce_scrolling_hide_end = debounce(function () { _win.bd.removeClass('scroll-ing'); }, 500); if (jQuery('.scrolling-hide').length) { _win.window.scroll(debounce_scrolling_hide).scroll(debounce_scrolling_hide_end); } //向下滚动时候,隐藏一些元素 var _last_scroll_top = 0; var debounce_scroll_down = debounce( function () { var _scroll_top = document.documentElement.scrollTop + document.body.scrollTop; if (_last_scroll_top > 100 && _scroll_top > _last_scroll_top) { //向下滚动 if (!_win.auto_scroll) { _win.bd.removeClass('scroll-up').addClass('scroll-down'); } } else { //向上滚动 if (!_win.auto_scroll || _last_scroll_top <= 100) { _win.bd.removeClass('scroll-down').addClass('scroll-up'); } } _last_scroll_top = _scroll_top; }, 10, true ); if (jQuery('.scroll-down-hide').length) { _win.window.scroll(debounce_scroll_down); } })(); /** * @description: 平滑滚动到指定位置,或者指定元素的位置 * @param {*} element 指定元素,或者元素选择器 * @param {*} offset 偏移量 * @return {*} */ function scrollTopTo(element, offset) { var scrollTop = 0; var body = jQuery('body,html'); var duration = duration || 300; offset = offset || 0; if (element) { var target = element instanceof jQuery ? element : jQuery(element); scrollTop = target.length ? target.offset().top + offset - (body.hasClass('nav-fixed') ? jQuery('.header').innerHeight() + 20 : 0) : 0; } if (Math.abs(scrollTop - body.scrollTop()) < 80) { return; } _win.auto_scroll = true; body.animate( { scrollTop: scrollTop, }, duration, 'swing', function () { setTimeout(function () { _win.auto_scroll = false; }, 20); } ); } _win.bd.on('click', '.toggle-radius,.float-right a,.but-ripple,.but,.item-thumbnail,.menu-item >a,.yiyan-box,.relates-thumb li a', function (e) { var _th = jQuery(this); if (!_th.hasClass('nowave') && !_th.hasClass('is-disabled')) { _th.css({ overflow: 'hidden', position: 'relative', }); var R; var waveWidth = ~~_th.outerWidth(); var waveHeight = ~~_th.outerHeight(); if (waveWidth < waveHeight) { R = waveHeight; } else { R = waveWidth; } var cllor = _th.css('color') || 'rgba(200, 200, 200)'; var wave = jQuery('
').css({ display: 'block', //涟漪的颜色 background: cllor, 'border-radius': '50%', position: ' absolute', '-webkit-transform': 'scale(0)', transform: 'scale(0)', opacity: '.3', //涟漪的速度 '-webkit-transition': 'all 1.5s cubic-bezier(0.22, 0.61, 0.36, 1)', transition: 'all 1.5s cubic-bezier(0.22, 0.61, 0.36, 1)', 'z-index': '1', overflow: 'hidden', 'pointer-events': 'none', }); _th.append(wave); wave.css({ width: R * 2 + 'px', height: R * 2 + 'px', top: e.pageY - _th.offset().top - R + 'px', left: e.pageX - _th.offset().left - R + 'px', transform: 'scale(1)', '-webkit-transform': 'scale(1)', opacity: 0, }); setTimeout(function () { wave.remove(); }, 2000); } }); //侧栏浮动-侧栏随动 jQuery.fn.sidebarAffix = function () { var _this = jQuery(this); var _affix = _this.find('[data-affix]'); var sidebar_class = 'sidebar-affix'; if (!_affix.length) return _this; if (_this.children('.' + sidebar_class).length) return _this; var _body = jQuery('body'); var affix_width = _affix.innerWidth(); var _header = jQuery('.header'); function nav_Height() { return _body.hasClass('nav-fixed') && (!_header.hasClass('scroll-down-hide') || !_body.hasClass('scroll-down')) ? _header.outerHeight(true) : 20; } var sidebarAffix_con = jQuery(''); _this.prepend(sidebarAffix_con); function top_css() { sidebarAffix_con.css({ top: nav_Height(), }); } var last_top = 0; sidebarAffix_con .affix({ offset: { top: function () { var new_top = _this.outerHeight(true) + _this.offset().top - nav_Height(); if (new_top !== last_top && sidebarAffix_con.hasClass('affix')) { top_css(); } last_top = new_top; return new_top; }, bottom: function () { var _wrap = _this.parent(); return document.body.clientHeight - _wrap.outerHeight() - _wrap.offset().top; }, }, }) .on('affix-top.bs.affix', function () { sidebarAffix_con.html(''); }) .on('affix.bs.affix', function () { if (!sidebarAffix_con.find('[data-affix]').length) { sidebarAffix_con.append(_this.find('[data-affix]').clone()); } top_css(); }) .find('[lazyload-action]:not(.lazyload)') .addClass('lazyload'); if (sidebarAffix_con.hasClass('affix')) { sidebarAffix_con.trigger('affix.bs.affix'); } if (sidebarAffix_con.hasClass('affix-bottom')) { sidebarAffix_con.trigger('affix-bottom.bs.affix'); } return _this; }; //内容浮动 jQuery.fn.autoAffix = function (top, bottom) { top = ~~top; bottom = ~~bottom; var _this = jQuery(this); if (_this.data('bs.affix')) { return _this; } var _body = jQuery('body'); var offset_top = ~~_this.attr('offset-top'); //偏移 var offset_bottom = ~~_this.attr('offset-bottom'); //偏移 var _wrap_attr = _this.attr('data-wrap'); var _wrap = _wrap_attr ? jQuery(_wrap_attr) : _this.parent(); var _header = jQuery('.header'); function get_nav_Height() { return (_body.hasClass('nav-fixed') && (!_header.hasClass('scroll-down-hide') || !_body.hasClass('scroll-down')) ? _header.outerHeight() : 0) + top; } function remove_clone() { _this.next('.affix-clone').remove(); } function top_css() { _this.css({ top: get_nav_Height(), }); } function this_clone() { if (!_this.next('.affix-clone').length) { _this.after(_this.clone().removeClass('affix-top affix affix-bottom').addClass('affix-clone').css('opacity', '0')); } } _wrap.css('min-height', _this.outerHeight() + bottom); var last_top = 0; _this .affix({ offset: { top: function () { var new_top = _this.parent().offset().top - get_nav_Height() + offset_top; if (new_top !== last_top && _this.hasClass('affix')) { top_css(); } last_top = new_top; return new_top; }, bottom: function () { return document.body.clientHeight - _wrap.outerHeight() - _wrap.offset().top + bottom + offset_bottom; }, }, }) .on('affix-top.bs.affix', function () { _this.css({ top: '', width: '', }); remove_clone(); }) .on('affix.bs.affix', function () { this_clone(); //在自己的位置下复制一份自己 top_css(); //设置固定位置 }) .on('affix-bottom.bs.affix', function () { this_clone(); }); if (_this.hasClass('affix')) { _this.trigger('affix.bs.affix'); } if (_this.hasClass('affix-bottom')) { _this.trigger('affix-bottom.bs.affix'); } if (_this.hasClass('affix-top')) { _this.trigger('affix-top.bs.affix'); } return _this; }; // 切换主题 _win.bd.on('click', '.toggle-theme', function (event) { var isDark = jQuery('body').hasClass('dark-theme'); // 检查浏览器是否支持 View Transition API if (!document.startViewTransition) { // 不支持则直接切换主题,不添加动画 toggle(); return; } const transition = document.startViewTransition(() => { toggle(); }); const { clientX, clientY } = event; const endRadius = Math.hypot(Math.max(clientX, innerWidth - clientX), Math.max(clientY, innerHeight - clientY)); const clipPath = [`circle(0px at ${clientX}px ${clientY}px)`, `circle(${endRadius}px at ${clientX}px ${clientY}px)`]; transition.ready.then(() => { document.documentElement.animate( { clipPath: isDark ? [...clipPath].reverse() : clipPath, }, { duration: 500, easing: isDark ? 'ease-out' : 'ease-in', fill: 'both', // 保持动画结束状态,避免闪烁 pseudoElement: isDark ? '::view-transition-old(root)' : '::view-transition-new(root)', } ); }); function toggle() { var highlight_white_zt = 'enlighter-t-' + _win.highlight_white_zt; var highlight_dark_zt = 'enlighter-t-' + _win.highlight_dark_zt; jQuery('img[switch-src]').each(function () { var _this = jQuery(this); var _src = _this.attr('data-src') || _this.attr('src'); var _s_src = _this.attr('switch-src'); _this.attr('src', _s_src).attr('switch-src', _src).attr('data-src', ''); }); jQuery('img[white-src],img[dark-src]').each(function () { var _this = jQuery(this); var _s_src = isDark ? _this.attr('white-src') : _this.attr('dark-src'); if (!_s_src) { return; } _this.attr('src', _s_src); }); var _enlighter = jQuery('.enlighter-default'); var _body = jQuery('body'); var _tinymce_body = jQuery('#post_content_ifr').contents().find('body'); if (!isDark) { jQuery('meta[name="theme-color"]').attr('content', '#2F3135'); document.documentElement.classList.add('dark'); _tinymce_body.addClass('dark-theme'); _enlighter.removeClass(highlight_white_zt).addClass(highlight_dark_zt); _body.addClass('dark-theme'), jQuery.cookie('theme_mode', 'dark-theme', { path: '/', }); } else { jQuery('meta[name="theme-color"]').attr('content', '#FDFCFE'); document.documentElement.classList.remove('dark'); _tinymce_body.removeClass('dark-theme'); _enlighter.removeClass(highlight_dark_zt).addClass(highlight_white_zt); _body.removeClass('dark-theme'), jQuery.cookie('theme_mode', 'white-theme', { path: '/', }); } } }); _win.bd.on('click', '[ajax-action]', function () { var _this = jQuery(this); if (_this.attr('disabled')) return false; var id = _this.attr('data-id'); var action = _this.attr('ajax-action'); var _text = _this.find('text'); _text = _text.length ? _text : _this.siblings('text'); var _this_html = _text.html(); _this.attr('disabled', true); _text.html(''); jQuery.ajax({ type: 'POST', url: _win.ajax_url, dataType: 'json', data: { id: id, action: action, _wpnonce: _this.attr('data-nonce'), }, error: function (n) { var _msg = aksrt_sprintf('ajax_error', n.status, n.statusText); if (aksrt_is_fatal_error_response(n.responseText)) { _msg = aksrt__('ajax_fatal_error'); } notyf(_msg, 'danger'); _this.attr('disabled', false); _text.html(_this_html); }, success: function (n) { _this.attr('disabled', false); if (!n.data || !n.success) { _text.html(_this_html); if (n.data && n.data.msg) { notyf(n.data.msg, n.data.ys || 'danger'); } } else { n = n.data; if (n.show_modal && n.modal) { //显示模态框 var modal_config = { class: 'modal-mini full-sm', height: 330, mobile_from_bottom: true, touch_close: true, content: n.modal, }; if (n.modal_config) { modal_config = jQuery.extend(modal_config, n.modal_config); } modal_config.content = n.modal; refresh_modal(modal_config); _text.html(_this_html); return; } jQuery('[ajax-action="' + action + '"][data-id="' + id + '"]').each(function () { var _this = jQuery(this); var _text = _this.find('text'); _text = _text.length ? _text : _this.siblings('text'); _text.html(n.text || _this_html).addClass('ajaxed'); if (n.active) { _this.addClass('active').siblings('.active').removeClass('active'); } else { _this.removeClass('active'); } }); } }, }); }); //防抖函数 function throttle(fn, delay) { let valid = true; return function (...args) { if (!valid) { //休息时间 暂不接客 return false; } // 工作时间,执行函数并且在间隔期内把状态位设为无效 valid = false; setTimeout(function () { fn.apply(this, args); valid = true; }, delay); }; } /** * @description: 节流函数 * @param {*} callback 函数 * @param {*} delay 时间 * @param {*} immediate 是否立即执行 为true则计时开始就就执行 * @return {*} */ // 定义一个debounce函数,用于函数防抖 function debounce(callback, delay, immediate) { // 定义一个变量,用于存放定时器 var timeout; // 返回一个函数 return function () { // 定义一个变量,用于存放this var context = this, // 定义一个变量,用于存放参数 args = arguments; // 定义一个函数,用于清除定时器 var later = function () { // 将定时器置为null timeout = null; // 如果不是立即执行,则执行回调函数 if (!immediate) { callback.apply(context, args); } }; // 如果是立即执行,且定时器不存在,则立即执行回调函数 var callNow = immediate && !timeout; // 清除定时器 clearTimeout(timeout); // 重新设置定时器 timeout = setTimeout(later, delay); // 如果是立即执行,则立即执行回调函数 if (callNow) { callback.apply(context, args); } }; } //textarea自动高度 _win.bd.on('input focus', 'textarea[autoHeight]', function () { var elem = this; //获取元素上下边框的宽度,并去除单位 var border = ~~getComputedStyle(elem).getPropertyValue('border-top-width').replace('px', '') + ~~getComputedStyle(elem).getPropertyValue('border-bottom-width').replace('px', ''); var max = ~~jQuery(elem).attr('maxHeight'); elem.style.height = 'auto'; if (max > elem.scrollHeight) { elem.style.height = elem.scrollHeight + border + 'px'; elem.style.overflow = 'hidden'; } else { elem.style.height = max + 'px'; elem.style.overflow = 'auto'; } }); //赞赏模态框 _win.bd.on('click', '.rewards', function () { jQuery('#rewards-popover').modal('show'); }); //作者页、文章导航、前台编辑、通用模板、微信分享均由 AKSRT 自有脚本按路由入队, //legacy main 不再通过 tbquire 重复加载同功能的旧模块副本。 //搜索关键词高亮 if (_win.bd.hasClass('search')) { var val = jQuery('.search-desc-text .search-key').text(); try { var reg = eval('/' + val + '/i'); jQuery('.search-tab .item-heading a,.search-tab .item-excerpt,.search-tab .forum-title a,.search-tab .excerpt,#search-tab-user .display-name').each(function () { var $this = jQuery(this); if ($this.text().search(reg) != -1) { $this.html( $this.html().replace(reg, function (w) { return '' + w + ''; }) ); } }); } catch (e) {} } //数字填写翻页 _win.bd.on('click', '.pag-jump .jump-icon', function () { var _input = jQuery(this).siblings('.jump-input'); pag_jump_go(_input); }); _win.bd.on( 'input', '.pag-jump .jump-input', debounce(function () { pag_jump(jQuery(this)); }, 200) ); _win.bd.on('keydown', '.pag-jump .jump-input', function (event) { if (event.keyCode == 13) { pag_jump_go(jQuery(this)); } }); function pag_jump(_input) { var max = _input.attr('max'); var current = _input.attr('current'); var val = ~~_input.val(); if (!val || val < 1 || val > max) { val = val > max ? max : ''; _input.val(val); } return val == current ? 0 : val; } function pag_jump_go(_input) { var val = pag_jump(_input); if (val) { var base = _input.attr('base'); var url = base.replace('%#%', val); var parent = _input.parent(); if (parent.hasClass('ajax-next')) { _input.val(''); var _ajax_link = parent.clone().removeClass('pag-jump').addClass('hide').attr('href', url); parent.append(_ajax_link); _ajax_link.click(); _ajax_link.remove(); } else { location.href = url; location.reload; } } else { _input.focus(); } } //可复制的 jQuery.fn.cloneable = function () { var cloneable_text = 'cloneable'; var cloneable_add_e = '.' + cloneable_text + '-add'; var cloneable_remove_e = '.' + cloneable_text + '-remove'; var cloneable_item_e = '.' + cloneable_text + '-item'; function max_min(_this, max, min) { var count = _this.children(cloneable_item_e).length; if (max && max <= count) { _this.nextAll(cloneable_add_e).hide(); } else { _this.nextAll(cloneable_add_e).show(); } if (min && min >= count) { _this.find(cloneable_remove_e).hide(); } else { _this.find(cloneable_remove_e).show(); } } return this.each(function () { var _this = jQuery(this); var _item = _this.children(cloneable_item_e); var is_on = 'is-on'; var click = 'click'; var max = _this.data('max') || 0; var min = _this.data('min') || 0; max_min(_this, max, min); if (!_item.length || _this.attr(is_on)) return; var add_item = jQuery(_item[0]).clone(false); add_item.find('input,textarea').val(''); _this .attr(is_on, true) .on(click, cloneable_remove_e, function () { jQuery(jQuery(this).parents(cloneable_item_e)[0]).remove(); max_min(_this, max, min); }) .nextAll(cloneable_add_e) .on(click, function () { var _add_item = add_item.clone(false); var count = _this.children(cloneable_item_e).length; _add_item.find('[name]').each(function () { var $this = jQuery(this); var name = $this.attr('name'); if (name == '_pseudo' || !name.includes('[0]')) return; $this.attr('name', $this.attr('name').replace('[0]', '[' + count + ']')); }); _this.append(_add_item); max_min(_this, max, min); }); }); }; //控制器 jQuery.fn.dependency = function () { function _number(val) { return Number(val); } function checkBoolean(v) { switch (v) { case true: case 'true': case 1: case '1': return true; case null: case false: case 'false': case 0: case '0': return false; default: return v; } } function evalCondition(condition, val1, val2) { switch (condition) { case '==': return checkBoolean(val1) == checkBoolean(val2); case '!=': return checkBoolean(val1) != checkBoolean(val2); case '>=': return _number(val2) >= _number(val1); case '<=': return _number(val2) <= _number(val1); case '>': return _number(val2) > _number(val1); case '<': return _number(val2) < _number(val1); case 'any': if (jQuery.isArray(val2)) { for (let i = val2.length - 1; i >= 0; i--) { if (jQuery.inArray(val2[i], val1.split(',')) !== -1) { return true; } } } else { if (jQuery.inArray(val2, val1.split(',')) !== -1) { return true; } } return false; case 'not-any': if (jQuery.isArray(val2)) { for (let i = val2.length - 1; i >= 0; i--) { if (jQuery.inArray(val2[i], val1.split(',')) == -1) { return true; } } } else { if (jQuery.inArray(val2, val1.split(',')) == -1) { return true; } } return false; default: return false; } } return this.each(function () { var $this = jQuery(this), $fields = $this.find('[data-controller]'); if ($fields.length) { var is_on = 'is-on'; $fields.each(function () { var $field = jQuery(this); if ($field.attr(is_on)) { return; } var controllers = $field.attr(is_on, true).data('controller').split('|'), conditions = $field.data('condition').split('|'), values = $field.data('value').toString().split('|'); jQuery.each(controllers, function (index, depend_id) { var value = values[index] || '', condition = conditions[index] || conditions[0] || '=='; $this.on('change', "[name='" + depend_id + "']", function () { var $elem = jQuery(this); var _type = $elem.attr('type'); var val2 = _type == 'checkbox' ? $elem.is(':checked') : $elem.val(); var is_show = evalCondition(condition, value, val2); $field.trigger('controller.change', is_show); if (is_show) { // $field.slideDown(300) $field.show(); } else { $field.hide(); // $field.slideUp(300) } }); }); }); } }); }; //搜索多选择 _win.bd.on('click', '[data-for]', function () { var _this = jQuery(this); var _tt = _this.html(); var _for = _this.attr('data-for'); var _form = _this.parents('form'); var _v = _this.attr('data-value'); var multiple = ~~_this.attr('data-multiple'); var _group = _this.closest('[for-group]'); var active_outerHTML = _this.prop('outerHTML'); if (!_group.length) { _group = _this.parent(); } if (multiple > 1) { //允许多选 _tt = ''; active_outerHTML = ''; var active_array = []; var _input = ''; var is_active = _this.hasClass('active'); if (is_active) { //已存在-删除 _group.find('[data-for="' + _for + '"][data-value="' + _v + '"]').removeClass('active'); } else { //添加前判断是否超过最大数量 var ii = {}; _group.find('[data-for="' + _for + '"].active').each(function () { ii[jQuery(this).attr('data-value')] = 1; }); if (Object.keys(ii).length >= multiple) { return notyf(aksrt_sprintf('select_max', multiple), 'danger'); } //不存在-添加 _group.find('[data-for="' + _for + '"][data-value="' + _v + '"]').addClass('active'); } //循环所有的active _group.find('[data-for="' + _for + '"].active').each(function () { var _this_value = jQuery(this).attr('data-value'); //不重复 if (active_array.indexOf(_this_value) == -1) { _tt += jQuery(this).html(); _input += ''; active_array.push(_this_value); active_outerHTML += jQuery(this).clone().addClass('outerhtml-copy').prop('outerHTML'); } }); //循环将所有的active_array添加active的calass jQuery.each(active_array, function (index, value) { _group.find('[data-for="' + _for + '"][data-value="' + value + '"]').addClass('active'); }); _form.find("input[name='" + _for + "[]']").remove(); _form.append(_input); } else { _group.find('[data-for="' + _for + '"]').removeClass('active'); _group.find('[data-for="' + _for + '"][data-value="' + _v + '"]').addClass('active'); _form .find("input[name='" + _for + "']") .val(_v) .trigger('change'); } _form.find("span[name='" + _for + "']").html(_tt); _form.find('input[name=s]').focus(); _form.find(".active-outerhtml[name='" + _for + "']").html(active_outerHTML); }); _win.bd.on( 'input', 'input[limit-min],input[limit-max]', debounce(function () { var _this = jQuery(this); var min = Number(_this.attr('limit-min')); var max = Number(_this.attr('limit-max')); var val = Number(_this.val()); var text; var warning_class = 'limit-warning'; _this.next('.' + warning_class).length || _this.after(''); var _warning = _this.next('.' + warning_class); if (_this.val().length < 1) { _warning.html('').hide(); } else if (val > max) { text = _this.attr('warning-max') || aksrt__('input_max'); _warning.html(text.replace('1$', max)).fadeIn(150); } else if (val < min) { text = _this.attr('warning-min') || aksrt__('input_min'); _warning.html(text.replace('1$', min)).fadeIn(150); } else { _warning.fadeOut(150); } }, 500) ); //自动搜索组件 jQuery.fn.AutoSearch = function () { return this.each(function () { var _this = jQuery(this); var ajax_url = _this.attr('ajax-url') || _win.ajax_url; var min_length = 2; var search = 'search-'; var d_search = '.' + search; var loading = search + 'loading'; var input = d_search + 'input'; var centent = search + 'centent'; var _container = _this.find(d_search + 'container'); var _remind = _this.find(d_search + 'remind'); var _icon = _this.find(d_search + 'icon'); var _icon_html = _icon.html(); var min_length_remind = aksrt_sprintf('search_min_chars', min_length); var loading_icon = ''; var loading_remind = loading_icon + '' + aksrt__('search_loading') + ''; var is_on = 'is-on'; if (_this.data(is_on)) return; function ajax() { var data = {}; var serializeObject = _this.serializeObject(); jQuery.each(serializeObject, function (key, val) { data[key] = val; }); //循环插入_POST内容 _this.find('input[name]').each(function () { var _th = jQuery(this); var v = _th.val() || ''; data[_th.attr('name')] = v; }); _this.addClass(loading); _remind.html(loading_remind); _icon.html(loading_icon); _container.css({ height: _container.outerHeight(), overflow: 'hidden', }); jQuery.post( ajax_url, data, function (result) { var data_html = result.data; if (data_html) { _container.html('
' + data_html + '
').animate( { height: _container.children('.' + centent).outerHeight(), }, 200, 'swing', function () { _container.css({ height: '', overflow: '', transition: '', }); } ); } _this.removeClass(loading); _remind.html(result.remind || ''); _icon.html(_icon_html); auto_fun(); }, 'json' ); } function submitted(_input) { if (_input.val().length >= min_length) { ajax(); } else { _remind.html(min_length_remind); } } _this .data(is_on, true) .find(input) .on( 'input', debounce(function () { submitted(jQuery(this)); }, 500) ) .on('keydown', function (event) { //禁止回车提交 if (event.keyCode == 13) { event.preventDefault(); submitted(jQuery(this)); } }); }); }; //搜索功能-恢复默认占位符 _win.bd.on('click', '.main-search [data-for]', function () { var _placeholder = jQuery('.main-search').find('.scale-placeholder'); if (_placeholder.length) { _placeholder.text(_placeholder.attr('default')); } }); //搜索功能->删除多余的input _win.bd.on('submit', '.main-search form', function () { var _this = jQuery(this); var inputs = _this.serializeObject(); jQuery.each(inputs, function (k, v) { if ((!v || v == 'null') && k != 's') { _this.find('input[name="' + k + '"]').remove(); } }); }); //搜索功能 _win.bd.on('click', '.main-search-btn', function () { var _this = jQuery(this); jQuery('.main-search').addClass('show'); var _remote_search = jQuery('.main-search [remote-box]').first(); if (_remote_search.length) { _remote_search.one('aksrt:remote-loaded', function () { _this.trigger('click'); }); _remote_search.trigger('click'); return; } var _search_form = jQuery('.main-search form'); if (_search_form.length) { var attr_ = 'search-'; var obj = { type: _this.attr(attr_ + 'type'), user: _this.attr(attr_ + 'user'), trem: _this.attr(attr_ + 'trem'), }; jQuery.each(obj, function (k, v) { if (v) { var _k = _search_form.find('input[name="' + k + '"]').val(v); var _data_for = _search_form.find('[data-for="' + k + '"][data-value="' + v + '"]').click(); if (!_data_for.length && k == 'trem') { var cat_name = _this.attr('trem-name'); var _cat_drop = _search_form.find('.cat-drop'); if (cat_name && _cat_drop.length) { _cat_drop.append('
  • ' + cat_name + '
  • '); _cat_drop.find('[data-value="' + v + '"]').click(); } } if (!_k.length) { _search_form.append(''); } } }); var placeholder = _this.attr(attr_ + 'placeholder') || _search_form.find('.scale-placeholder').attr('default'); _search_form.find('.scale-placeholder').text(placeholder); setTimeout(function () { _search_form.find('[name="s"]').focus(); }, 100); } }); //搜索页面关键词ajax if (jQuery('.search-page-ajaxpager').length) { _win.bd.on('click', '.page-search-box a.search_keywords', function () { var $this = jQuery(this).clone(); $this.addClass('ajax-next').attr('ajax-replace', 'true').attr('route', 'true'); jQuery('.search-page-ajaxpager').append($this); $this.click().remove(); return false; }); //搜索页面提交搜索ajax _win.bd.on('submit', '.page-search-box .search-form', function () { var $this = jQuery(this); var data = $this.serializeObject(); var url = new URL($this.attr('action')); url.search = new URLSearchParams(data).toString(); var $link = jQuery(''); jQuery('.search-page-ajaxpager').append($link); $link.click().remove(); return false; }); } function nav_folding() { var navbar_nav_t = '.navbar-nav'; var sub_menu_t = 'sub-menu'; var _collapse = jQuery('.navbar-collapse'); var surplus_width = _collapse.width(); _collapse.find('>:not(' + navbar_nav_t + ')').each(function () { surplus_width -= jQuery(this).outerWidth(); }); surplus_width -= jQuery('.navbar-header').outerWidth() + 40; var navs_width = 66; var _folding = jQuery(''); jQuery(navbar_nav_t + '>li').each(function () { navs_width += jQuery(this).outerWidth(); if (navs_width > surplus_width) { _folding.find('>.' + sub_menu_t).append(jQuery(this)); } }); if (_folding.find('>.' + sub_menu_t + ' li').length) { jQuery(navbar_nav_t).append(_folding); } } //系统通知 window.debounce_notyf = debounce(notyf, 100, true); function notyf(str, ys, time, id) { jQuery('.notyn').length || _win.bd.append('
    '); ys = ys || 'success'; if (ys == 'error') { ys = 'danger'; } time = time || 5000; time = time < 100 ? time * 1000 : time; var id_attr = id ? ' id="' + id + '"' : ''; var _html = jQuery('
    ' + str + '
    '); var is_close = !id; if (id && jQuery('#' + id).length) { jQuery('#' + id) .find('.notyf') .removeClass() .addClass('notyf ' + ys) .html(str); _html = jQuery('#' + id); is_close = true; } else { jQuery('.notyn').append(_html); } is_close && setTimeout(function () { notyf_close(_html); }, time); } function notyf_close(_e) { _e.addClass('notyn-out'); setTimeout(function () { _e.remove(); }, 1000); } _win.bd.on('click', '.noty1', function () { notyf_close(jQuery(this)); }); //切换密码显示 _win.passw = 1; _win.bd.on('click', '.passw', function () { var _this = jQuery(this); if (_win.passw == 1) { _this.find('.fa').addClass('fa-eye-slash'); _this.siblings('input').attr('type', 'text'); _win.passw = 2; } else { _this.find('.fa').removeClass('fa-eye-slash'); _this.siblings('input').attr('type', 'password'); _win.passw = 1; } }); //绑定placeholder_scale操作 _win.bd.on( 'input change focus', '.line-form-input', debounce(function () { placeholder_scale(jQuery(this)); }, 100) ); //执行placeholder_scale操作 function placeholder_scale(_this) { var val = _this.val(); var placeholder = _this.siblings('.scale-placeholder'); if (val.length > 0) { placeholder.addClass('is-focus'); } else { placeholder.removeClass('is-focus'); } } //判断是否是有效的URL function aksrt_is_url(str) { try { new URL(str); return true; } catch (e) { return false; } } function is_mail(str) { return /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/.test(str); } //表单验证 jQuery.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); jQuery.each(a, function () { if (o[this.name] !== undefined) { if (!o[this.name].push) { o[this.name] = [o[this.name]]; } o[this.name].push(this.value || ''); } else { o[this.name] = this.value || ''; } }); return o; }; //清空搜索关键词 _win.bd.on('click', '.trash-history-search', function () { if (confirm(aksrt__('confirm_clear_search')) == true) { jQuery('.history-search') .slideUp() .delay(1000, function () { jQuery(this).remove(); }); jQuery.cookie('history_search', ''); } }); //用户签到 _win.bd.on('click', '.initiate-checkin', function () { aksrt_ajax( jQuery(this), 0, function (data) { if (data.details_link) { jQuery('.initiate-checkin').each(function () { var $link = jQuery(data.details_link); var _this = jQuery(this); var _class = _this.attr('class'); var _text = _this.attr('ed-text'); $link.addClass(_class).removeClass('initiate-checkin').html(_text); _this.prop('outerHTML', $link.prop('outerHTML')); }); } }, aksrt__('checkin_loading') ); }); //底部tabbar,购买 _win.bd.on('click', '.single-pay-tabbar', function () { scrollTo('#posts-pay', -50); jQuery('#posts-pay .cashier-link').click(); }); /**wp-ajax-action */ _win.bd.on('submit', '[ajax-submit]', function () { var _this = jQuery(this); var but = _this.attr('ajax-submit') || '.wp-ajax-submit,[zibajax="submit"]'; return _this.find(but).click(), !1; }); _win.bd.on('click', '.wp-ajax-submit,[zibajax="submit"]', function () { var _this = jQuery(this); var confirm_text = _this.attr('data-confirm'); if (confirm_text && !confirm(confirm_text)) { return false; } return aksrt_ajax(jQuery(this)), !1; }); /** * @description: ajax请求封装 * @param {*} _this 按钮的jquery对象 * @param {*} data 传递的数据 * @param {*} success 成功后的回调函数 * @param {*} noty 提示信息:”stop“为不提示 * @param {*} no_loading 是否不显示加载动画 * @return {*} */ function aksrt_ajax(_this, data, success, noty, no_loading) { if (_this.attr('disabled')) { return !1; } if (!data) { var _data = _this.attr('form-data'); if (_data) { try { data = jQuery.parseJSON(_data); } catch (e) {} } if (!data) { var form = _this.parents('form'); data = form.serializeObject(); } } var _action = _this.attr('form-action'); if (_action) { data.action = _action; } var _text = _this.html(); var _loading = no_loading ? _text : '' + aksrt__('please_wait') + ''; noty != 'stop' && notyf(noty || aksrt__('processing'), 'load', '', 'wp_ajax'); _this.attr('disabled', true).html(_loading); var _url = _this.attr('ajax-href') || _win.ajax_url; jQuery.ajax({ type: 'POST', url: _url, data: data, dataType: 'json', error: function (n) { var _msg = aksrt_sprintf('ajax_error', n.status, n.statusText); if (aksrt_is_fatal_error_response(n.responseText)) { _msg = aksrt__('ajax_fatal_error'); } console.error('ajax请求错误,错误信息如下:', n); notyf(_msg, 'danger', '', noty != 'stop' ? 'wp_ajax' : ''); _this.attr('disabled', false).html(_text); }, success: function (n) { var ys = n.ys ? n.ys : n.error ? 'danger' : ''; if (noty != 'stop') { notyf(n.msg || aksrt__('done'), ys, '', 'wp_ajax'); } else if (n.msg) { notyf(n.msg, ys); } _this.attr('disabled', false).html(_text).trigger('zib_ajax.success', n); //完成 jQuery.isFunction(success) && success(n, _this, data); if (n.hide_modal) { _this.closest('.modal').modal('hide'); } if (n.reload) { if (n.goto) { window.location.href = n.goto; window.location.reload; } else { window.location.reload(); } } }, }); } //AJAX执行完成后自动切换到下一个tab _win.bd.on('zib_ajax.success', '[next-tab]', function (e, n) { var _next = jQuery(this).attr('next-tab'); if (_next && n && !n.error) { jQuery('a[href="#' + _next + '"]').tab('show'); } }); /* erphpdown 登录使用弹出登录框 * ========================================= */ jQuery('.erphp-login-must').each(function () { jQuery(this).addClass('signin-loader'); }); //浏览器窗口调整自动化 _win.window.resize( debounce(function () { _wid = _win.window.width(); auto_fun(); }, 500) ); jQuery('.collapse').on('shown.bs.collapse', function () { auto_fun(); }); //文章限制高度 _win.bd.on('click', '.read-more-open', function () { jQuery(this) .parents('.limit-height') .css({ height: '', 'max-height': '', }) .find('.read-more') .remove(); }); function posts_limit_height() { if (jQuery('.limit-height').length) { var r = jQuery('.limit-height'); if (r.data('posts-limit-ison')) { return; } var r_h = r.height(); var r_m = r.attr('data-maxheight'); if (~~r_h >= ~~r_m + 79) { var nn = '
    ' + aksrt__('read_more') + '
    '; r.append(nn).data('posts-limit-ison', true); } } } auto_fun(); thumb_dplayer(_wid > 640 ? '.posts-item .item-thumbnail,.forum-lists-cover' : '.posts-item,.forum-posts', '.video-thumb-box[video-url]'); //页面加载之后自动点击 jQuery('[load-click]').attr('no-scroll', true).click(); //图片延迟懒加载-ias自动加载 jQuery(document).on('lazybeforeunveil', function (e) { var _this = jQuery(e.target); var lazyload_action = _this.attr('lazyload-action'); setTimeout(function () { if (lazyload_action === 'ias') { if (_this.attr('remote-box')) { _this.click(); } else { var _a = _this.is('.ajax-next,.ias-btn') ? _this : _this.find('.ajax-next,.ias-btn'); _a.attr('no-scroll', true).click(); } } if (lazyload_action == 'animated') { var animated = _this.attr('data-animated'); animated && _this.addClass('animated ' + animated).css('visibility', 'unset'); } }, 200); var bg = _this.attr('data-bg'); if (bg) { _this.css('background-image', 'url(' + bg + ')'); } }); //性能检测,通过浏览器帧率 function fps_yh() { var lastTime = 0; var frames = 0; var fps = 0; var fps_average = 0; var currentTime; var stop = 0; function updateFPS() { currentTime = performance.now(); frames++; if (currentTime - lastTime >= 300) { fps = Math.round((frames * 1000) / (currentTime - lastTime)); frames = 0; lastTime = currentTime; if (fps > 5 && lastTime > 1600) { fps_average = fps_average || fps; fps_average = (fps_average + fps) / 2; if (fps_average < 20) { stop++; } if (stop > 5) { //执行函数 jQuery('body').addClass('fps-accelerat'); } } } if (stop <= 5 && lastTime < 15000) { requestAnimationFrame(updateFPS); } else { setCookie(); } } function setCookie() { jQuery.cookie('fps_accelerat', ~~fps_average, { path: '/', expires: 604800, }); } requestAnimationFrame(updateFPS); } //fps性能优化 if (!jQuery.cookie('fps_accelerat') && !jQuery('body').hasClass('fps-accelerat')) { fps_yh(); } /**------小工具:横向滚动合作伙伴模块--------**/ function partners_scroll_init() { /** * 初始化单个 widget 实例 * 核心思路:测量单组卡片真实宽度,按需克隆足够数量的 group, * 然后让 CSS 动画精确按照"一组宽度"进行位移,达成无缝无断层循环 */ function init(widget) { if (!widget || widget.dataset.zpsReady === '1') return; var speed = parseFloat(widget.style.getPropertyValue('--zps-speed')) || 3; var rows = widget.querySelectorAll('[data-zps-row]'); rows.forEach(function (row) { var track = row.querySelector('[data-zps-track]'); if (!track) return; var seed = track.querySelector('.zps-group'); if (!seed) return; /** * 按需克隆 group,确保 track 宽度 ≥ 视口宽度 + 单组宽度 * 这样动画位移 = 单组宽度时,视口仍被完全填满,不会露出空白 */ var setup = function () { //先移除之前克隆的额外 group,保留最原始的那一组作为基准 var extras = track.querySelectorAll('.zps-group.zps-clone'); extras.forEach(function (el) { el.remove(); }); var groupWidth = seed.scrollWidth; if (groupWidth < 10) return; var rowWidth = row.clientWidth || widget.clientWidth || window.innerWidth; //至少需要 2 份:1 份作为可见内容 + 1 份作为位移后补充 //若单组宽度小于视口,需要克隆更多份以避免空白 var needTotal = Math.max(groupWidth * 2, rowWidth + groupWidth); var copies = Math.ceil(needTotal / groupWidth); if (copies < 2) copies = 2; //克隆到目标数量(当前只有 1 份种子 group,需要再克隆 copies - 1 份) for (var i = 1; i < copies; i++) { var clone = seed.cloneNode(true); clone.classList.add('zps-clone'); clone.setAttribute('aria-hidden', 'true'); track.appendChild(clone); } //精确位移:每次循环移动"一组宽度",保证内容完美对齐 track.style.setProperty('--zps-shift', '-' + groupWidth + 'px'); //按"每 100px 所需秒数"计算动画时长,让视觉滚动速度与卡片数量无关 var duration = (groupWidth / 100) * speed; if (duration < 4) duration = 4; track.style.setProperty('--zps-duration', duration.toFixed(2) + 's'); //显示出来(避免闪烁) track.setAttribute('data-zps-ready', '1'); }; //初次执行 setup(); //图片异步加载会改变 group 宽度,加载完后重算 var imgs = seed.querySelectorAll('img'); var pending = 0; imgs.forEach(function (img) { if (img.complete && img.naturalWidth > 0) return; pending++; var done = function () { pending--; if (pending <= 0) setup(); }; img.addEventListener('load', done, { once: true }); img.addEventListener('error', done, { once: true }); }); //窗口尺寸变化时重算(节流) var resizeTimer; window.addEventListener('resize', function () { clearTimeout(resizeTimer); resizeTimer = setTimeout(setup, 200); }); }); widget.dataset.zpsReady = '1'; } function initAll() { document.querySelectorAll('.aksrt-partners-scroll').forEach(init); } initAll(); } /** 智能翻译 */ function translate_init() { var translate_config = _win.translate_config; if (translate_config.s) { tbquire(['translate'], function () { translate.selectLanguageTag.show = false; translate.language.setLocal(translate_config.local || 'chinese_simplified'); if (translate_config.service_url) { translate.request.setHost(translate_config.service_url); } if (translate_config.ignore_text) { translate.ignore.text = translate_config.ignore_text; } if (translate_config.nomenclature && translate_config.nomenclature.length > 0) { //循环添加自定义术语 jQuery.each(translate_config.nomenclature, function (index, item) { var from = item.from; var to = item.to; var value = item.value; if (from == 'auto') { from = ''; } if (value && to) { translate.nomenclature.append(from, to, value); } }); } if (translate_config.auto_discriminate_local) { translate.setAutoDiscriminateLocalLanguage(); } if (translate_config.range && translate_config.range.length > 0) { translate.language.translateLanguagesRange = translate_config.range; } if (translate_config.loading) { translate.progress.api.startUITip(); //开始翻译时显示提示 } var $language_dropdown = jQuery('.language-dropdown .dropdown-menu'); var translateStart = debounce( function () { jQuery('[data-language]').removeClass('active'); $language_dropdown.loading('show'); }, 400, true ); translate.lifecycle.changeLanguage.trigger.push(translateStart); //翻译结束后执行的函数 var renderFinish = debounce(function (uuid) { $language_dropdown.loading('hide'); jQuery("[data-language='" + uuid.to + "']").addClass('active'); }, 400); //翻译结束后执行的函数 translate.lifecycle.execute.finally.push(renderFinish); //开始之前执行的函数 if (_wid > 996) { jQuery('.navbar-top .nav>li>a>.menu-item-title').each(function () { var _this = jQuery(this); _this.css({ 'max-width': ~~_this.outerWidth(true) + 5 + 'px', }); }); } translate.ignore.class.push('translate-ignore'); translate.ignore.tag.push('svg'); translate.service.use(translate_config.service_use || 'client.edge'); translate.listener.start(); //开启页面元素动态监控,js改变的内容也会被翻译,参考文档: http://translate.zvo.cn/4067.html translate.execute(); //完成翻译初始化,进行翻译 }); } } _win.bd.on('click', '.translate-button', function () { var _this = jQuery(this); var language = _this.attr('data-language'); translate && translate.changeLanguage(language); }); /** * 模块出现动画 * 给带有 data-animation-in 属性的元素绑定"进入视口"动画 * * 用法:class带有obs-animate ani-fade的元素,当滚动到视口时,会自动触发此动画 * * class带有 obs-animate-repeat 的元素或者 data-animation-repeat="true" 的元素,当滚动到视口时,会重复触发此动画 */ (function () { var SELECTOR_class = 'obs-animate'; var SELECTOR = '.' + SELECTOR_class; var BASE_CLS = 'in-view'; var OBS_FLAG = '__zaniObserved'; var REPEAT_CLS = 'obs-animate-repeat'; //旧浏览器兜底 / 用户偏好减少动效:直接显示,不做动画 var noAnim = !('IntersectionObserver' in window) || (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches); if (noAnim) { removeAnimation(SELECTOR); return; } var rootMargin = '100px 0px 0px 0px'; //执行函数添加防抖 var c_i = 0; function execute(entries) { c_i = 0; var isIntersecting_count = 0; for (var j = 0; j < entries.length; j++) { if (entries[j].isIntersecting) { isIntersecting_count++; } } for (var i = 0; i < entries.length; i++) { var entry = entries[i]; var el = entry.target; var $el = jQuery(el); $el.css('transition-delay', ''); var is_repeat = el.hasAttribute('data-animation-repeat') || el.classList.contains(REPEAT_CLS); if (entry.isIntersecting) { var delay = c_i * 0.11; if (isIntersecting_count > 8) { delay = delay / (isIntersecting_count / 8); } $el.css('transition-delay', delay + 's'); $el.addClass(BASE_CLS); c_i++; //默认触发一次后停止观察;声明 data-animation-repeat 的保留循环 if (!is_repeat) { stop(el); } } else if (is_repeat) { //循环模式:离开视口时移除 class,下次进入再加回来 $el.removeClass(BASE_CLS); } } } //单例 observer,所有目标共用 var io = new IntersectionObserver(execute, { root: null, //稍微提前 10% 触发,视觉更自然 rootMargin: rootMargin, threshold: 0.01, }); //结束 //停止监控,移出class,移出属性 function stop(el) { if (!el || el.nodeType !== 1 || !el[OBS_FLAG]) { return; } el[OBS_FLAG] = false; io.unobserve(el); setTimeout(function () { removeAnimation(el); }, 50); } function removeAnimation(el) { var animation = jQuery(el).attr('data-animation'); var animation_class = 'ani-' + animation; jQuery(el) .removeClass(BASE_CLS + ' ' + SELECTOR_class + ' ' + animation_class + ' ' + REPEAT_CLS) .removeAttr('data-animation') .removeAttr('data-animation-repeat') .css('transition-delay', ''); } function register(el) { if (!el || el.nodeType !== 1 || el[OBS_FLAG]) { return; } el[OBS_FLAG] = true; io.observe(el); } function scan() { jQuery(SELECTOR).each(function () { register(this); }); } //首次扫描 scan(); })(); function number_stats_init() { function animateCount(el, duration) { var target = parseFloat(el.getAttribute('data-target')) || 0; if (target === 0) { el.textContent = '0'; return; } var raw = el.getAttribute('data-target') || '0'; var decimals = (raw.split('.')[1] || '').length; var _duration = ~~el.getAttribute('data-duration'); duration = _duration > 10 ? _duration : duration; var start = 0; var startTs = null; duration = duration || 1500; function step(ts) { if (!startTs) { startTs = ts; } var progress = Math.min((ts - startTs) / duration, 1); var eased = 1 - Math.pow(1 - progress, 1.5); var value = start + (target - start) * eased; el.textContent = decimals > 0 ? value.toFixed(decimals) : Math.floor(value).toString(); if (progress < 1) { requestAnimationFrame(step); } else { el.textContent = decimals > 0 ? target.toFixed(decimals) : target.toString(); } } requestAnimationFrame(step); } var wraps = document.querySelectorAll('.stat-number-wrap'); if (!wraps.length) { return; } // 不支持 IO 直接展示终值 if (!('IntersectionObserver' in window)) { wraps.forEach(function (wrap) { wrap.querySelectorAll('.stat-number').forEach(function (el) { el.textContent = el.getAttribute('data-target') || ''; }); }); return; } var io = new IntersectionObserver( function (entries) { entries.forEach(function (entry) { if (!entry.isIntersecting) { return; } var wrap = entry.target; if (wrap.dataset.counted === '1') { return; } wrap.dataset.counted = '1'; wrap.querySelectorAll('.stat-number').forEach(function (el) { animateCount(el, 1500); }); io.unobserve(wrap); }); }, { threshold: 0.3 } ); wraps.forEach(function (wrap) { io.observe(wrap); }); } _win.bd.on('click', '.produck-wid-feature-intro .fi-tab', function () { var _this = jQuery(this); if (_this.hasClass('is-active')) { return; } _this.addClass('is-active'); _this.siblings().removeClass('is-active'); var panels = _this.closest('.produck-wid-feature-intro').find('.fi-panel'); panels.removeClass('is-active'); panels.eq(_this.index()).addClass('is-active'); }); //3D交互展示 function tilt_cases_init() { function isTouchOrMobile() { var isTouch = 'ontouchstart' in window || (navigator.maxTouchPoints && navigator.maxTouchPoints > 0); var isSmall = window.matchMedia && window.matchMedia('(max-width: 768px)').matches; return isTouch || isSmall; } if (isTouchOrMobile()) { return; } var cases = jQuery('.vanilla-tilt:not(.is-initialized)'); if (!cases.length) { return; } function setTranslate3d(imgs, translate3d) { //先获取原有的transform var transform = imgs[0].style.transform; if (transform.includes('translate3d')) { //移出translate*()空格 transform = transform.replace(/translate3d\(.*?\)/g, '').trim(); } transform = transform + ' ' + translate3d; imgs.css('transform', transform); } tbquire(['tilt'], function () { cases.each(function () { var _this = jQuery(this); var imgs = _this.find('img'); var maxTilt = parseFloat(_this.attr('data-tilt-max')) || 10; var n = imgs.length; var gain = 1.22; var hoverZone = _this.closest('.tilt-cases-container') || _this; var mes = _this.data('tilt-mouse-event-element'); if (mes) { _this.removeAttr('data-tilt-mouse-event-element'); var elZone = _this.closest(mes); hoverZone = elZone.length ? elZone : hoverZone; } var opt = {}; if (hoverZone.length) { opt['mouse-event-element'] = hoverZone[0]; } _this.addClass('is-initialized'); VanillaTilt.init(this, opt); if (n <= 1) { return; } // 图片视差 this.addEventListener('tiltChange', function (e) { var detail = e.detail || {}; var tx = parseFloat(detail.tiltX) || 0; var ty = parseFloat(detail.tiltY) || 0; imgs.each(function (i) { var $img = jQuery(this); var base = parseFloat($img.attr('data-tilt-depth')); if (isNaN(base)) { base = 20; } if (base === 0) { setTranslate3d($img, 'translate3d(0,0,0)'); return; } // 单图:仅略加强;多图:从第一层到最后一层系数约 0.48x~1.62x,拉开前后景 var layerMul = 1; if (n > 1) { layerMul = 0.48 + (i / (n - 1)) * 1.14; } var effective = base * gain * layerMul; var dx = (tx / maxTilt) * effective * -1; var dy = (ty / maxTilt) * effective; setTranslate3d($img, 'translate3d(' + dx + 'px, ' + dy + 'px, 0)'); }); }); // 鼠标离开与 vanilla-tilt 相同热区时复位 if (hoverZone) { hoverZone.on('mouseleave', function () { imgs.each(function () { setTranslate3d(jQuery(this), 'translate3d(0,0,0)'); }); }); } }); }); } //小工具预览模式 _win.bd.on('click', '.customize-preview-widget-edit', function (e) { if (!wp || !wp.customize || !wp.customize.widgetsPreview) { return; } var _this = jQuery(this); var box = _this.closest('.customize-preview-widget-box'); e.preventDefault(); wp.customize.widgetsPreview.preview.send('focus-widget-control', box.prop('id')); }); //页面加载完毕之后加载的函数 jQuery(document).ready(function () { setTimeout(function () { //页面加载完毕之后再延迟两秒加载的函数 //检测placeholder_scale操作 jQuery('.line-form-input').each(function () { placeholder_scale(jQuery(this)); }); //文章阅读数量记录 if (_win.views) { jQuery.post(_win.ajax_url, { action: 'views_record', id: _win.views, }); } //内容高度限制 posts_limit_height(); //触发scroll _win.window.trigger('scroll'); }, 1000); number_stats_init(); //智能翻译 translate_init(); //横向滚动合作伙伴 partners_scroll_init(); //3D交互展示 tilt_cases_init(); /*菜单*/ jQuery('.navbar-top li.menu-item-has-children>a').each(function () { jQuery(this).append(''); }); //菜单栏目超宽后自动折叠 if (_wid > 996 && jQuery('.header').height() > 81) { nav_folding(); } //内容高度限制 posts_limit_height(); auto_maxHeight(); //文章亮点保持相同高度 if (jQuery('.feature').length) { var _feh = 0, _fehm = 0; jQuery('.feature').each(function () { var _th = jQuery(this); (_feh = _th.find('.feature-icon').innerHeight() + _th.find('.feature-title').innerHeight() + _th.find('.feature-note').innerHeight()) > _fehm && (_fehm = _feh); }); jQuery('.feature').css('height', _fehm); } //js二维码 jQuery('.qrcode').length && tbquire(['qrcode'], function () { jQuery('.qrcode').each(function () { var _this = jQuery(this), text = _this.attr('data-qrcode'), size = _this.attr('data-size') || 160; _this.qrcode({ width: size, height: size, correctLevel: 0, text: text || document.URL, background: '#fff', foreground: '#333', }); }); }); //图片延迟懒加载-ias自动加载 jQuery(document).on('lazyloaded', function (e) { var _this = jQuery(e.target); swiper_tab_AutoHeight(_this); }); jQuery(document).on('lazyloaded', '.gradient-bg img', function (e) { var _this = jQuery(e.target); var _parent = _this.closest('.gradient-bg'); var opacity = _parent.attr('data-opacity'); var c_11 = opacity ? 'a' : ''; var c_12 = opacity ? ',' + opacity : ''; tbquire(['grade'], function () { Grade(_parent[0], null, function (gradientData) { gradientData = gradientData[0]; var rgba = gradientData.gradientData; var c_1 = 'rgb' + c_11 + '(' + rgba[0].rgba.slice(0, 3).join(',') + c_12 + ') 10%'; var c_2 = 'rgb' + c_11 + '(' + rgba[1].rgba.slice(0, 3).join(',') + c_12 + ') 80%'; jQuery(gradientData.element) .addClass('gradient-bg-loaded') .css('background-image', 'linear-gradient(135deg, ' + c_1 + ', ' + c_2 + ')'); }); }); }); _win.qj_loading && jQuery('.qj_loading') .fadeOut(500) .delay(1e3, function () { jQuery(this).remove(), jQuery('#qj_dh_css').remove(); }); /*一言功能*/ function yiyan_nr(n) { var yylink = _win.uri + '/yiyan/qv-yiyan.php', y_nr; jQuery.ajax({ type: 'POST', url: yylink, }).done(function (i) { var lines = i .replace(/\r\n|\r/g, '/&/') .trim() .split('/&/'); if (lines) { var type = n.attr('type'); if (type) { y_nr = type === 'en' ? lines[0] : lines[1]; } else { y_nr = '
    ' + lines[0] + '
    ' + lines[1] + '
    '; } n.html(y_nr); } }); } jQuery('.yiyan').each(function () { yiyan_nr(jQuery(this)); }), setInterval(function () { jQuery('.yiyan').each(function () { yiyan_nr(jQuery(this)); }); }, 3e4); jQuery('.yiyan').on('click', function () { yiyan_nr(jQuery(this)); }); /*文章目录由 AKSRT section-navs 按需入队,legacy 不再重复加载。*/ //手势控制 jQuery('[mini-touch]').each(function () { var _this = jQuery(this); var fx = _this.attr('touch-direction'); _this.minitouch({ direction: fx, onEnd: function (e) { //移动端菜单 if (_this.attr('mini-touch') === 'mobile-nav') { jQuery('body').removeClass('mobile-navbar-show'); } else { e.removeClass('show'); } }, }); }); });