2024.7.30

This commit is contained in:
小赵同学 committed 2024-07-30 09:35:12 +08:00
1 parent afcdc60f7e
commit 62a9ef2b21
212 files changed
+1929 -1438

No files matched your search

+1
View File
@@ -0,0 +1 @@
var Barrage=function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});e.default=class{constructor(t){if(this.el="",this.info=[],this.defaultHeader="",this.url="",this.close=!1,this.speed=10,this.color="#ffff",this.backColor="#69696980",this.height="40px",this.fontSize="20px",this.parentName="barrage",this.isLeft=!1,!t||void 0===t.el)throw new Error("el is necessary params");if(t)for(const[e,n]of Object.entries(t))""!==n&&void 0!==this[e]&&"info"!==e&&(this[e]=n);(function t(){this._getElDom();let e=this.mainDom;e.style.position="relative";let n=document.getElementById(this.parentName);n?(this.parentName+=1,t.apply(this)):((n=document.createElement("div")).setAttribute("id",this.parentName),n.setAttribute("style","position:absolute;\n width:100%;\n height:100%;\n top:0;\n left:0;\n z-index:1000;\n pointer-events: none;\n overflow:hidden;\n "),e.appendChild(n))}).apply(this)}start(t,e){t?(this.info.push(t),this.info.length>0&&function(t={}){let e,{headImg:n=this.defaultHeader,url:r=this.url,speed:i=this.speed}=t,s=0,o=document.getElementById(this.parentName),a=document.createElement("div"),l=parseInt(this.height.replace(/px|rem|em/,""));if(isNaN(l))throw new Error("height is ");e=(this.mainDom.clientHeight-l)*Math.random();const u=this.mainDom.clientWidth;n&&function(t,e){let n=document.createElement("img");n.setAttribute("class","header"),n.setAttribute("src",e),t.appendChild(n)}(a,n),a.style.opacity="0",a.setAttribute("class","barrage"),function(t,e,n){let r=document.createElement("a");r.setAttribute("class","text"),r.style.color=this.color,n&&(r.setAttribute("href",n),r.setAttribute("target","_blank"));let i=document.createTextNode(e);r.appendChild(i),t.appendChild(r)}.call(this,a,this.info.shift(),r),o.appendChild(a);let c=a.clientWidth+100,h=u,d=-c;!0===this.isLeft&&(h=-c,d=u);const f=`\n height: ${this.height};\n background: ${this.backColor}; \n line-height: ${this.height}; \n font-size: ${this.fontSize};\n color:${this.color}; \n top:${e+10}px; \n transition:transform ${i}s linear 0s;\n transform:translateX(${d}px);\n opacity:1;\n `;a.style.transform="translateX("+h+"px)",a.addEventListener("mouseover",function(t){const e=t.currentTarget;let n=document.defaultView.getComputedStyle(e,null).getPropertyValue("transform").replace("matrix","").slice(1,-1).split(",")[4];e.style.transform=`translateX(${n}px)`,clearTimeout(m),clearInterval(p)}),a.addEventListener("mouseout",function(t){const e=t.currentTarget;e.style.transition=`transform ${i-s}s linear 0s`,e.style.transform=`translateX(${d}px)`,p=setInterval(()=>{s++},1e3),m=setTimeout(()=>{clearInterval(p),o.removeChild(a)},1e3*(i-s+1))}),setTimeout(()=>{a.setAttribute("style",f)},1e3);let m=setTimeout(()=>{clearInterval(p),o.removeChild(a)},1e3*(i+1)),p=setInterval(()=>{s++},1e3)}.call(this,e)):console.warn("message is necessary,you must set message on function start")}_getElDom(){let t=document.querySelector(this.el);if(!t)throw new Error(`'${this.el}'is not a element`);this.mainDom=t}destroy(){let t=document.getElementById(this.parentName);this.mainDom.removeChild(t)}}}]);
+446
View File
@@ -0,0 +1,446 @@
/*! instant.page v5.2.0 - (C) 2019-2024 Alexandre Dieulot - https://instant.page/license */
let _chromiumMajorVersionInUserAgent = null
, _speculationRulesType
, _allowQueryString
, _allowExternalLinks
, _useWhitelist
, _delayOnHover = 65
, _lastTouchstartEvent
, _mouseoverTimer
, _preloadedList = new Set()
init()
function init() {
const supportCheckRelList = document.createElement('link').relList
const isSupported = supportCheckRelList.supports('prefetch')
&& supportCheckRelList.supports('modulepreload')
// instant.page is meant to be loaded with <script type=module>
// (though sometimes webmasters load it as a regular script).
// So it’s normally executed (and must not cause JavaScript errors) in:
// - Chromium 61+
// - Gecko in Firefox 60+
// - WebKit in Safari 10.1+ (iOS 10.3+, macOS 10.10+)
//
// The check above used to check for IntersectionObserverEntry.isIntersecting
// but module scripts support implies this compatibility — except in Safari
// 10.1–12.0, but this prefetch check takes care of it.
//
// The modulepreload check is used to drop support for Firefox < 115 in order
// to lessen maintenance.
// This implies Safari 17+ (if it supported prefetch), if we ever support
// fetch()-based preloading for Safari we might want to OR that check with
// something that Safari 15.4 or 16.4 supports.
// Also implies Chromium 66+.
if (!isSupported) {
return
}
const handleVaryAcceptHeader = 'instantVaryAccept' in document.body.dataset || 'Shopify' in window
// The `Vary: Accept` header when received in Chromium 79–109 makes prefetches
// unusable, as Chromium used to send a different `Accept` header.
// It’s applied on all Shopify sites by default, as Shopify is very popular
// and is the main source of this problem.
// `window.Shopify` only exists on “classic” Shopify sites. Those using
// Hydrogen (Remix SPA) aren’t concerned.
const chromiumUserAgentIndex = navigator.userAgent.indexOf('Chrome/')
if (chromiumUserAgentIndex > -1) {
_chromiumMajorVersionInUserAgent = parseInt(navigator.userAgent.substring(chromiumUserAgentIndex + 'Chrome/'.length))
}
// The user agent client hints API is a theoretically more reliable way to
// get Chromium’s version… but it’s not available in Samsung Internet 20.
// It also requires a secure context, which would make debugging harder,
// and is only available in recent Chromium versions.
// In practice, Chromium browsers never shy from announcing "Chrome" in
// their regular user agent string, as that maximizes their compatibility.
if (handleVaryAcceptHeader && _chromiumMajorVersionInUserAgent && _chromiumMajorVersionInUserAgent < 110) {
return
}
_speculationRulesType = 'none'
if (HTMLScriptElement.supports && HTMLScriptElement.supports('speculationrules')) {
const speculationRulesConfig = document.body.dataset.instantSpecrules
if (speculationRulesConfig == 'prerender') {
_speculationRulesType = 'prerender'
} else if (speculationRulesConfig != 'no') {
_speculationRulesType = 'prefetch'
}
}
const useMousedownShortcut = 'instantMousedownShortcut' in document.body.dataset
_allowQueryString = 'instantAllowQueryString' in document.body.dataset
_allowExternalLinks = 'instantAllowExternalLinks' in document.body.dataset
_useWhitelist = 'instantWhitelist' in document.body.dataset
let preloadOnMousedown = false
let preloadOnlyOnMousedown = false
let preloadWhenVisible = false
if ('instantIntensity' in document.body.dataset) {
const intensityParameter = document.body.dataset.instantIntensity
if (intensityParameter == 'mousedown' && !useMousedownShortcut) {
preloadOnMousedown = true
}
if (intensityParameter == 'mousedown-only' && !useMousedownShortcut) {
preloadOnMousedown = true
preloadOnlyOnMousedown = true
}
if (intensityParameter == 'viewport') {
const isOnSmallScreen = document.documentElement.clientWidth * document.documentElement.clientHeight < 450000
// Smartphones are the most likely to have a slow connection, and
// their small screen size limits the number of links (and thus
// server load).
//
// Foldable phones (being expensive as of 2023), tablets and PCs
// generally have a decent connection, and a big screen displaying
// more links that would put more load on the server.
//
// iPhone 14 Pro Max (want): 430×932 = 400 760
// Samsung Galaxy S22 Ultra with display size set to 80% (want):
// 450×965 = 434 250
// Small tablet (don’t want): 600×960 = 576 000
// Those number are virtual screen size, the viewport (used for
// the check above) will be smaller with the browser’s interface.
const isNavigatorConnectionSaveDataEnabled = navigator.connection && navigator.connection.saveData
const isNavigatorConnectionLike2g = navigator.connection && navigator.connection.effectiveType && navigator.connection.effectiveType.includes('2g')
const isNavigatorConnectionAdequate = !isNavigatorConnectionSaveDataEnabled && !isNavigatorConnectionLike2g
if (isOnSmallScreen && isNavigatorConnectionAdequate) {
preloadWhenVisible = true
}
}
if (intensityParameter == 'viewport-all') {
preloadWhenVisible = true
}
const intensityAsInteger = parseInt(intensityParameter)
if (!isNaN(intensityAsInteger)) {
_delayOnHover = intensityAsInteger
}
}
const eventListenersOptions = {
capture: true,
passive: true,
}
if (preloadOnlyOnMousedown) {
document.addEventListener('touchstart', touchstartEmptyListener, eventListenersOptions)
}
else {
document.addEventListener('touchstart', touchstartListener, eventListenersOptions)
}
if (!preloadOnMousedown) {
document.addEventListener('mouseover', mouseoverListener, eventListenersOptions)
}
if (preloadOnMousedown) {
document.addEventListener('mousedown', mousedownListener, eventListenersOptions)
}
if (useMousedownShortcut) {
document.addEventListener('mousedown', mousedownShortcutListener, eventListenersOptions)
}
if (preloadWhenVisible) {
let requestIdleCallbackOrFallback = window.requestIdleCallback
// Safari has no support as of 16.3: https://webkit.org/b/164193
if (!requestIdleCallbackOrFallback) {
requestIdleCallbackOrFallback = (callback) => {
callback()
// A smarter fallback like setTimeout is not used because devices that
// may eventually be eligible to a Safari version supporting prefetch
// will be very powerful.
// The weakest devices that could be eligible are the 2017 iPad and
// the 2016 MacBook.
}
}
requestIdleCallbackOrFallback(function observeIntersection() {
const intersectionObserver = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
const anchorElement = entry.target
intersectionObserver.unobserve(anchorElement)
preload(anchorElement.href)
}
})
})
document.querySelectorAll('a').forEach((anchorElement) => {
if (isPreloadable(anchorElement)) {
intersectionObserver.observe(anchorElement)
}
})
}, {
timeout: 1500,
})
}
}
function touchstartListener(event) {
_lastTouchstartEvent = event
const anchorElement = event.target.closest('a')
if (!isPreloadable(anchorElement)) {
return
}
preload(anchorElement.href, 'high')
}
function touchstartEmptyListener(event) {
_lastTouchstartEvent = event
}
function mouseoverListener(event) {
if (isEventLikelyTriggeredByTouch(event)) {
// This avoids uselessly adding a mouseout event listener and setting a timer.
return
}
if (!('closest' in event.target)) {
return
// Without this check sometimes an error “event.target.closest is not a function” is thrown, for unknown reasons
// That error denotes that `event.target` isn’t undefined. My best guess is that it’s the Document.
//
// Details could be gleaned from throwing such an error:
//throw new TypeError(`instant.page non-element event target: timeStamp=${~~event.timeStamp}, type=${event.type}, typeof=${typeof event.target}, nodeType=${event.target.nodeType}, nodeName=${event.target.nodeName}, viewport=${innerWidth}x${innerHeight}, coords=${event.clientX}x${event.clientY}, scroll=${scrollX}x${scrollY}`)
}
const anchorElement = event.target.closest('a')
if (!isPreloadable(anchorElement)) {
return
}
anchorElement.addEventListener('mouseout', mouseoutListener, {passive: true})
_mouseoverTimer = setTimeout(() => {
preload(anchorElement.href, 'high')
_mouseoverTimer = null
}, _delayOnHover)
}
function mousedownListener(event) {
if (isEventLikelyTriggeredByTouch(event)) {
// When preloading only on mousedown, not touch, we need to stop there
// because touches send compatibility mouse events including mousedown.
//
// (When preloading on touchstart, instructions below this block would
// have no effect.)
return
}
const anchorElement = event.target.closest('a')
if (!isPreloadable(anchorElement)) {
return
}
preload(anchorElement.href, 'high')
}
function mouseoutListener(event) {
if (event.relatedTarget && event.target.closest('a') == event.relatedTarget.closest('a')) {
return
}
if (_mouseoverTimer) {
clearTimeout(_mouseoverTimer)
_mouseoverTimer = null
}
}
function mousedownShortcutListener(event) {
if (isEventLikelyTriggeredByTouch(event)) {
// Due to a high potential for complications with this mousedown shortcut
// combined with other parties’ JavaScript code, we don’t want it to run
// at all on touch devices, even though mousedown and click are triggered
// at almost the same time on touch.
return
}
const anchorElement = event.target.closest('a')
if (event.which > 1 || event.metaKey || event.ctrlKey) {
return
}
if (!anchorElement) {
return
}
anchorElement.addEventListener('click', function (event) {
if (event.detail == 1337) {
return
}
event.preventDefault()
}, {capture: true, passive: false, once: true})
const customEvent = new MouseEvent('click', {view: window, bubbles: true, cancelable: false, detail: 1337})
anchorElement.dispatchEvent(customEvent)
}
function isEventLikelyTriggeredByTouch(event) {
// Touch devices fire “mouseover” and “mousedown” (and other) events after
// a touch for compatibility reasons.
// This function checks if it’s likely that we’re dealing with such an event.
if (!_lastTouchstartEvent || !event) {
return false
}
if (event.target != _lastTouchstartEvent.target) {
return false
}
const now = event.timeStamp
// Chromium (tested Chrome 95 and 122 on Android) sometimes uses the same
// event.timeStamp value in touchstart, mouseover, and mousedown.
// Testable in test/extras/delay-not-considered-touch.html
// This is okay for our purpose: two equivalent timestamps will be less
// than the max duration, which means they’re related events.
// TODO: fill/find Chromium bug
const durationBetweenLastTouchstartAndNow = now - _lastTouchstartEvent.timeStamp
const MAX_DURATION_TO_BE_CONSIDERED_TRIGGERED_BY_TOUCHSTART = 2500
// How long after a touchstart event can a simulated mouseover/mousedown event fire?
// /test/extras/delay-not-considered-touch.html tries to answer that question.
// I saw up to 1450 ms on an overwhelmed Samsung Galaxy S2.
// On the other hand, how soon can an unrelated mouseover event happen after an unrelated touchstart?
// Meaning the user taps a link, then grabs their pointing device and clicks another/the same link.
// That scenario could occur if a user taps a link, thinks it hasn’t worked, and thus fall back to their pointing device.
// I do that in about 1200 ms on a Chromebook. In which case this function returns a false positive.
// False positives are okay, as this function is only used to decide to abort handling mouseover/mousedown/mousedownShortcut.
// False negatives could lead to unforeseen state, particularly in mousedownShortcutListener.
return durationBetweenLastTouchstartAndNow < MAX_DURATION_TO_BE_CONSIDERED_TRIGGERED_BY_TOUCHSTART
// TODO: Investigate if pointer events could be used.
// https://developer.mozilla.org/en-US/docs/Web/API/PointerEvent/pointerType
// TODO: Investigate if InputDeviceCapabilities could be used to make it
// less hacky on Chromium browsers.
// https://developer.mozilla.org/en-US/docs/Web/API/InputDeviceCapabilities_API
// https://wicg.github.io/input-device-capabilities/
// Needs careful reading of the spec and tests (notably, what happens with a
// mouse connected to an Android or iOS smartphone?) to make sure it’s solid.
// Also need to judge if WebKit could implement it differently, as they
// don’t mind doing when a spec gives room to interpretation.
// It seems to work well on Chrome on ChromeOS.
// TODO: Consider using event screen position as another heuristic.
}
function isPreloadable(anchorElement) {
if (!anchorElement || !anchorElement.href) {
return
}
if (_useWhitelist && !('instant' in anchorElement.dataset)) {
return
}
if (anchorElement.origin != location.origin) {
let allowed = _allowExternalLinks || 'instant' in anchorElement.dataset
if (!allowed || !_chromiumMajorVersionInUserAgent) {
// Chromium-only: see comment on “restrictive prefetch” and “cross-site speculation rules prefetch”
return
}
}
if (!['http:', 'https:'].includes(anchorElement.protocol)) {
return
}
if (anchorElement.protocol == 'http:' && location.protocol == 'https:') {
return
}
if (!_allowQueryString && anchorElement.search && !('instant' in anchorElement.dataset)) {
return
}
if (anchorElement.hash && anchorElement.pathname + anchorElement.search == location.pathname + location.search) {
return
}
if ('noInstant' in anchorElement.dataset) {
return
}
return true
}
function preload(url, fetchPriority = 'auto') {
if (_preloadedList.has(url)) {
return
}
if (_speculationRulesType != 'none') {
preloadUsingSpeculationRules(url)
} else {
preloadUsingLinkElement(url, fetchPriority)
}
_preloadedList.add(url)
}
function preloadUsingSpeculationRules(url) {
const scriptElement = document.createElement('script')
scriptElement.type = 'speculationrules'
scriptElement.textContent = JSON.stringify({
[_speculationRulesType]: [{
source: 'list',
urls: [url]
}]
})
// When using speculation rules, cross-site prefetch is supported, but will
// only work if the user has no cookies for the destination site. The
// prefetch will not be sent, if the user does have such cookies.
document.head.appendChild(scriptElement)
}
function preloadUsingLinkElement(url, fetchPriority = 'auto') {
const linkElement = document.createElement('link')
linkElement.rel = 'prefetch'
linkElement.href = url
linkElement.fetchPriority = fetchPriority
// By default, a prefetch is loaded with a low priority.
// When there’s a fair chance that this prefetch is going to be used in the
// near term (= after a touch/mouse event), giving it a high priority helps
// make the page load faster in case there are other resources loading.
// Prioritizing it implicitly means deprioritizing every other resource
// that’s loading on the page. Due to HTML documents usually being much
// smaller than other resources (notably images and JavaScript), and
// prefetches happening once the initial page is sufficiently loaded,
// this theft of bandwidth should rarely be detrimental.
linkElement.as = 'document'
// as=document is Chromium-only and allows cross-origin prefetches to be
// usable for navigation. They call it “restrictive prefetch” and intend
// to remove it: https://crbug.com/1352371
//
// This document from the Chrome team dated 2022-08-10
// https://docs.google.com/document/d/1x232KJUIwIf-k08vpNfV85sVCRHkAxldfuIA5KOqi6M
// claims (I haven’t tested) that data- and battery-saver modes as well as
// the setting to disable preloading do not disable restrictive prefetch,
// unlike regular prefetch. That’s good for prefetching on a touch/mouse
// event, but might be bad when prefetching every link in the viewport.
document.head.appendChild(linkElement)
}
-95
View File
@@ -1,95 +0,0 @@
/*!
*@name jquery.barrager.js
*@author yaseng@uauc.net
*@url https://github.com/yaseng/jquery.barrager.js
*/
(function($) {
$.fn.barrager = function(barrage) {
barrage = $.extend({
close:true,
bottom: 0,
max: 10,
speed: 6,
color: '#fff',
old_ie_color : '#000000'
}, barrage || {});
var time = new Date().getTime();
var barrager_id = 'barrage_' + time;
var id = '#' + barrager_id;
var div_barrager = $("<div class='barrage' id='" + barrager_id + "'></div>").appendTo($(this));
var window_height = $(window).height() - 100;
var bottom = (barrage.bottom == 0) ? Math.floor(Math.random() * window_height + 40) : barrage.bottom;
div_barrager.css("bottom", bottom + "px");
div_barrager_box = $("<div class='barrage_box cl'></div>").appendTo(div_barrager);
if(barrage.img){
div_barrager_box.append("<a class='portrait z' href='javascript:;'></a>");
var img = $("<img src='' >").appendTo(id + " .barrage_box .portrait");
img.attr('src', barrage.img);
}
div_barrager_box.append(" <div class='z p'></div>");
if(barrage.close){
div_barrager_box.append(" <div class='close z'></div>");
}
var content = $("<a class='text-overflow'></a>").appendTo(id + " .barrage_box .p");
content.attr({
'id': barrage.id
}).empty().append(barrage.info);
if(navigator.userAgent.indexOf("MSIE 6.0")>0 || navigator.userAgent.indexOf("MSIE 7.0")>0 || navigator.userAgent.indexOf("MSIE 8.0")>0 ){
content.css('color', barrage.old_ie_color);
}else{
content.css('color', barrage.color);
}
var i = 0;
div_barrager.css('margin-right', i);
var looper = setInterval(barrager, barrage.speed);
function barrager() {
var window_width = $(window).width() + 500;
if (i < window_width) {
i += 1;
$(id).css('margin-right', i);
} else {
$(id).remove();
return false;
}
}
div_barrager_box.mouseover(function() {
clearInterval(looper);
});
div_barrager_box.mouseout(function() {
looper = setInterval(barrager, barrage.speed);
});
$(id+'.barrage .barrage_box .close').click(function(){
$(id).remove();
})
}
$.fn.barrager.removeAll=function(){
$('.barrage').remove();
}
})(jQuery);
+51 -33
View File
@@ -45,52 +45,67 @@ lazyLoadInit({
});
function fetchCommentsAndCreateBarrager(path, options) {
$.getJSON('https://waline.usj.cc/api/comment?path=' + encodeURIComponent(path), function(response) {
var data = response.data.data;
// 每条弹幕发送间隔
var looper_time = options.looper_time || 3000; // 默认间隔3秒
var items = flattenComments(data);
// 弹幕总数
var total = items.length;
// 弹幕索引
var index = 0;
// 先执行一次
if (total != 0) {
async function fetchCommentsAndCreateBarrager(path, options) {
try {
const response = await fetch('https://waline.usj.cc/api/comment?path=' + encodeURIComponent(path));
const data = await response.json();
if (!data.data || !data.data.data) {
console.error('评论数据获取失败');
return;
}
const commentsData = data.data.data;
const looperTime = options.looper_time || 3000;
const flattenedComments = flattenComments(commentsData);
const totalComments = flattenedComments.length;
let currentIndex = 0;
// 初始化弹幕插件
let barrage = new Barrage.default({
el: 'body',
backColor:"#000000b5",
fontSize:"14px",
isLeft:true,
speed:0,
height:"35px"
});
if (totalComments !== 0) {
createBarrager();
}
function createBarrager() {
// 转换数据为弹幕所需的格式
var item = {
img: items[index].avatar || options.defaultAvatar || 'static/default-avatar.png', // 头像
info: stripHTML(items[index].orig) || options.defaultInfo || 'No comment', // 过滤后的评论内容
href: items[index].link || options.defaultLink || '#', // 用户链接
close: options.close || true, // 显示关闭按钮
speed: options.speed || 6, // 延迟,单位秒,默认6
color: options.color || '#fff', // 颜色,默认白色
old_ie_color: options.old_ie_color || '#000000' // ie低版兼容色,不能与网页背景相同,默认黑色
const currentComment = flattenedComments[currentIndex];
const barragerItem = {
headImg: currentComment.avatar + "?s=24" || options.defaultAvatar,
content: stripHTML(currentComment.orig) || options.defaultInfo,
href: currentComment.link || options.defaultLink,
speed: options.speed || 10
};
// 发布一个弹幕
$('body').barrager(item);
// 索引自增
index++;
// 所有弹幕发布完毕,清除计时器
if (index < total) {
setTimeout(createBarrager, looper_time);
console.log(barragerItem.content);
// 发送弹幕
barrage.start(barragerItem.content, {
speed: barragerItem.speed,
headImg: barragerItem.headImg,
speed:25
});
currentIndex++;
if (currentIndex < totalComments) {
setTimeout(createBarrager, looperTime);
}
}
// 过滤HTML标签的函数
function stripHTML(html) {
return html.replace(/<\/?[^>]+(>|$)/g, "");
}
// 展平评论和子评论
function flattenComments(comments) {
var result = [];
let result = [];
comments.forEach(function(comment) {
result.push(comment);
if (comment.children && comment.children.length > 0) {
@@ -99,5 +114,8 @@ function fetchCommentsAndCreateBarrager(path, options) {
});
return result;
}
});
} catch (error) {
console.error('无法获取评论数据', error);
}
}