-

汇聚密码安全智慧 共享实战经验!

  • 我们目前有643个页面,13个用户,731次编辑。

MediaWiki:Mobile.js

来自炼石百科
Admin留言 | 贡献2025年12月19日 (五) 07:55的版本
跳转到导航 跳转到搜索

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:Ctrl-F5
// 移动端公告滚动效果
// 兼容 MobileFrontend 和桌面端

(function() {
    'use strict';
    
    // 初始化公告滚动
    function initSiteNoticeScroll() {
        var self = $('#siteNoticeScroll');
        if (!self.length || !self[0]) return;
        
        var ul = self.find('ul:first');
        if (!ul.length) return;
        
        var lis = ul.find('li');
        if (lis.length <= 1) return; // 如果只有一个或没有项目,不需要滚动
        
        var containerWidth = self.width();
        if (containerWidth === 0) {
            // 如果宽度为0,可能是DOM还未完全加载,延迟重试
            setTimeout(initSiteNoticeScroll, 100);
            return;
        }
        
        ul.width(containerWidth * lis.length).attr({
            'data-left': 0,
            'data-length': lis.length
        });
        
        lis.width(containerWidth);
        
        // 设置初始位置和过渡效果
        ul.css({
            'margin-left': '0px',
            'transition': 'margin-left 0.73s ease-in-out'
        });
        
        // 开始滚动
        var scrollInterval = window.setInterval(function() {
            var dataset = ul[0].dataset;
            if (!dataset) return;
            
            var currentLeft = parseInt(dataset.left) || 0;
            var totalLength = parseInt(dataset.length) || lis.length;
            var newLeft = currentLeft + 1;
            
            // 如果到达最后一个,重置到第一个(索引0)
            if (newLeft >= totalLength) {
                newLeft = 0;
            }
            
            ul.css({
                'margin-left': -(newLeft * containerWidth) + 'px',
                'transition': 'margin-left 0.73s ease-in-out'
            });
            dataset.left = newLeft;
        }, 5000);
        
        // 窗口大小改变时重新计算
        $(window).on('resize', function() {
            containerWidth = self.width();
            if (containerWidth === 0) return;
            
            ul.width(containerWidth * lis.length);
            lis.width(containerWidth);
            
            var currentLeft = parseInt(ul[0].dataset.left) || 0;
            if (currentLeft < 0) currentLeft = 0;
            ul.css({
                'margin-left': -(currentLeft * containerWidth) + 'px',
                'transition': 'margin-left 0.37s ease-in-out'
            });
        });
        
        // 保存 interval ID,以便后续清理
        self.data('scrollInterval', scrollInterval);
    }
    
    // 初始化用户提示
    function initUserPrompt() {
        var siteNoticeScroll = $('#siteNoticeScroll');
        if (siteNoticeScroll.length === 0) {
            return false;
        }
        
        var ul = siteNoticeScroll.find('ul:first');
        if (ul.length === 0) {
            return false;
        }
        
        var currentUser = null;
        try {
            if (typeof mw !== 'undefined' && mw.config && mw.config.get) {
                currentUser = mw.config.get('wgUserName');
            }
        } catch (e) {
            // 忽略错误
        }
        
        var promptElement = $('#userPrompt');
        
        // 如果页面没有 userPrompt 元素,创建一个
        if (promptElement.length === 0) {
            promptElement = $('<li id="userPrompt"></li>');
            ul.append(promptElement);
        }
        
        // 设置内容
        if (currentUser && currentUser !== null && currentUser !== '') {
            // 已登录用户
            promptElement.html('<strong>欢迎回来,' + currentUser + '!感谢您对炼石百科的贡献!</strong>');
        } else {
            // 未登录用户
            promptElement.html('<strong>欢迎加入炼石百科<a href="/wiki/Special:用户登录"><font color="#3862AE">注册一个账号</font></a>,一起参与编写吧!</strong>');
        }
        
        return true;
    }
    
    // 等待 DOM 和 MediaWiki 加载完成
    function init() {
        // 先初始化用户提示(必须在滚动初始化之前)
        var promptAdded = initUserPrompt();
        
        // 延迟初始化滚动效果,确保 DOM 完全更新
        setTimeout(function() {
            initSiteNoticeScroll();
        }, promptAdded ? 100 : 0);
    }
    
    // 多种初始化方式,确保在移动端和桌面端都能工作
    if (typeof $ !== 'undefined') {
        // jQuery 已加载
        $(document).ready(function() {
            init();
        });
        
        // 如果已经在 ready 状态,立即执行
        if (document.readyState === 'complete' || document.readyState === 'interactive') {
            setTimeout(init, 100);
        }
    } else {
        // 等待 jQuery 加载
        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', function() {
                if (typeof $ !== 'undefined') {
                    setTimeout(init, 100);
                }
            });
        } else {
            // 如果 DOM 已加载,等待 jQuery
            var checkJQuery = setInterval(function() {
                if (typeof $ !== 'undefined') {
                    clearInterval(checkJQuery);
                    init();
                }
            }, 100);
            
            // 10秒后停止检查
            setTimeout(function() {
                clearInterval(checkJQuery);
            }, 10000);
        }
    }
    
    // 使用 MediaWiki 的 hook(如果可用)
    if (typeof mw !== 'undefined' && mw.hook) {
        mw.hook('mobile.init').add(function() {
            setTimeout(init, 200);
        });
    }
})();