|
|
/**
|
|
|
* 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); |