You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

202 lines
6.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* Social Activities Carousel JavaScript
* 社会活动轮播功能脚本
*
* @package Nenghui Energy Theme
* @since 1.0.0
*/
(function($) {
'use strict';
class SocialActivitiesCarousel {
constructor() {
this.carousels = [];
this.init();
}
init() {
// 等待DOM加载完成
$(document).ready(() => {
this.initCarousels();
});
}
initCarousels() {
$('.social-activities-carousel').each((index, element) => {
const $carousel = $(element);
const slidesPerView = parseInt($carousel.data('slides-per-view')) || 3;
// 检查是否已经初始化
if ($carousel.data('carousel-initialized')) {
return;
}
// 标记为已初始化
$carousel.data('carousel-initialized', true);
// 创建轮播实例
const carousel = new SimpleCarousel(element, {
autoplay: true,
autoplayDelay: 5000,
loop: true,
navigation: true,
pagination: true,
touchEnabled: true,
slidesPerView: slidesPerView,
spaceBetween: 30,
onSlideChange: (activeIndex) => {
this.onSlideChange($carousel, activeIndex);
},
onInit: () => {
this.onCarouselInit($carousel);
}
});
this.carousels.push({
element: $carousel,
instance: carousel
});
// 绑定自定义事件
this.bindEvents($carousel, carousel);
console.log('Social Activities Carousel initialized:', {
slidesPerView: slidesPerView,
totalSlides: $carousel.find('.carousel-slide').length
});
});
}
bindEvents($carousel, carouselInstance) {
// 鼠标悬停暂停自动播放
$carousel.on('mouseenter', () => {
carouselInstance.pauseAutoplay();
});
$carousel.on('mouseleave', () => {
carouselInstance.resumeAutoplay();
});
// 分页器点击事件已在SimpleCarousel中处理这里不需要重复绑定
// 卡片点击统计(可选)
$carousel.find('.social-activity-card').on('click', function(e) {
// 如果点击的不是链接,则跳转到文章页面
if (!$(e.target).closest('a').length) {
const $link = $(this).find('h3 a, .view-details-btn').first();
if ($link.length) {
window.location.href = $link.attr('href');
}
}
});
// 键盘导航支持
$carousel.on('keydown', (e) => {
switch(e.keyCode) {
case 37: // 左箭头
e.preventDefault();
carouselInstance.prev();
break;
case 39: // 右箭头
e.preventDefault();
carouselInstance.next();
break;
}
});
// 使轮播容器可聚焦以支持键盘导航
$carousel.attr('tabindex', '0');
}
onSlideChange($carousel, activeIndex) {
// 更新分页器状态
$carousel.find('.carousel-pagination-bullet').removeClass('active');
$carousel.find('.carousel-pagination-bullet').eq(activeIndex).addClass('active');
// 添加切换动画效果
$carousel.find('.carousel-slide').removeClass('slide-active');
$carousel.find('.carousel-slide').eq(activeIndex).addClass('slide-active');
// 触发自定义事件
$carousel.trigger('socialActivitiesSlideChange', [activeIndex]);
}
onCarouselInit($carousel) {
// 轮播初始化完成后的处理
$carousel.addClass('carousel-ready');
// 设置初始活动状态
$carousel.find('.carousel-slide').first().addClass('slide-active');
// 触发自定义事件
$carousel.trigger('socialActivitiesCarouselReady');
}
// 公共方法:获取轮播实例
getCarouselInstance(selector) {
const carousel = this.carousels.find(item =>
item.element.is(selector) || item.element.find(selector).length
);
return carousel ? carousel.instance : null;
}
// 公共方法:销毁所有轮播
destroy() {
this.carousels.forEach(carousel => {
if (carousel.instance && typeof carousel.instance.destroy === 'function') {
carousel.instance.destroy();
}
carousel.element.removeData('carousel-initialized');
});
this.carousels = [];
}
// 公共方法:重新初始化
reinit() {
this.destroy();
this.initCarousels();
}
}
// 创建全局实例
window.SocialActivitiesCarousel = SocialActivitiesCarousel;
// 自动初始化
const socialActivitiesCarousel = new SocialActivitiesCarousel();
// 暴露到全局作用域以便外部调用
window.socialActivitiesCarouselInstance = socialActivitiesCarousel;
// 支持动态内容加载后重新初始化
$(document).on('contentUpdated socialActivitiesContentLoaded', function() {
socialActivitiesCarousel.reinit();
});
// 窗口大小改变时重新计算
let resizeTimer;
$(window).on('resize', function() {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(() => {
socialActivitiesCarousel.carousels.forEach(carousel => {
if (carousel.instance && typeof carousel.instance.updateSlides === 'function') {
carousel.instance.updateSlides();
}
});
}, 250);
});
// 页面可见性变化时处理自动播放
document.addEventListener('visibilitychange', function() {
socialActivitiesCarousel.carousels.forEach(carousel => {
if (carousel.instance) {
if (document.hidden) {
carousel.instance.pauseAutoplay();
} else {
carousel.instance.resumeAutoplay();
}
}
});
});
})(jQuery);