-

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

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

MediaWiki:Mobile.js:修订间差异

来自炼石百科
跳转到导航 跳转到搜索
无编辑摘要
标签已被回退 移动版编辑 移动版网页编辑
无编辑摘要
标签手工回退 移动版编辑 移动版网页编辑
第1行: 第1行:
// 移动端公告滚动效果
// 调试版本的 Mobile.js
// 兼容 MobileFrontend 和桌面端
// 如果正常版本不工作,可以使用这个版本查看调试信息


(function() {
(function() {
     'use strict';
     'use strict';
   
    function log(message) {
        if (typeof console !== 'undefined' && console.log) {
            console.log('[SiteNotice] ' + message);
        }
    }
   
    // 初始化用户提示
    function initUserPrompt() {
        log('开始初始化用户提示');
       
        var siteNoticeScroll = $('#siteNoticeScroll');
        log('siteNoticeScroll 元素数量: ' + siteNoticeScroll.length);
       
        if (siteNoticeScroll.length === 0) {
            log('未找到 siteNoticeScroll 元素');
            return false;
        }
       
        var ul = siteNoticeScroll.find('ul:first');
        log('ul 元素数量: ' + ul.length);
       
        if (ul.length === 0) {
            log('未找到 ul 元素');
            return false;
        }
       
        var existingLis = ul.find('li');
        log('现有 li 元素数量: ' + existingLis.length);
       
        var currentUser = null;
        try {
            if (typeof mw !== 'undefined' && mw.config && mw.config.get) {
                currentUser = mw.config.get('wgUserName');
                log('当前用户: ' + (currentUser || '未登录'));
            }
        } catch (e) {
            log('获取用户信息失败: ' + e.message);
        }
       
        var promptElement = $('#userPrompt');
        log('现有 userPrompt 元素数量: ' + promptElement.length);
       
        // 如果页面没有 userPrompt 元素,创建一个
        if (promptElement.length === 0) {
            log('创建新的 userPrompt 元素');
            promptElement = $('<li id="userPrompt"></li>');
            ul.append(promptElement);
            log('userPrompt 元素已添加到 DOM');
        }
       
        // 设置内容
        var content = '';
        if (currentUser && currentUser !== null && currentUser !== '') {
            content = '<strong>欢迎回来,' + currentUser + '!感谢您对炼石百科的贡献!</strong>';
            log('设置已登录用户内容');
        } else {
            content = '<strong>欢迎加入炼石百科<a href="/wiki/Special:用户登录"><font color="#3862AE">注册一个账号</font></a>,一起参与编写吧!</strong>';
            log('设置未登录用户内容');
        }
       
        promptElement.html(content);
        log('userPrompt 内容已设置');
       
        // 验证元素是否存在
        var finalLis = ul.find('li');
        log('最终 li 元素数量: ' + finalLis.length);
       
        return true;
    }
      
      
     // 初始化公告滚动
     // 初始化公告滚动
     function initSiteNoticeScroll() {
     function initSiteNoticeScroll() {
        log('开始初始化滚动效果');
       
         var self = $('#siteNoticeScroll');
         var self = $('#siteNoticeScroll');
         if (!self.length || !self[0]) return;
         if (!self.length || !self[0]) {
            log('未找到 siteNoticeScroll 元素');
            return;
        }
          
          
         var ul = self.find('ul:first');
         var ul = self.find('ul:first');
         if (!ul.length) return;
         if (!ul.length) {
            log('未找到 ul 元素');
            return;
        }
          
          
         var lis = ul.find('li');
         var lis = ul.find('li');
         if (lis.length <= 1) return; // 如果只有一个或没有项目,不需要滚动
        log('找到 ' + lis.length + ' 个 li 元素');
       
         if (lis.length <= 1) {
            log('li 元素数量不足,不需要滚动');
            return;
        }
          
          
         var containerWidth = self.width();
         var containerWidth = self.width();
        log('容器宽度: ' + containerWidth);
       
         if (containerWidth === 0) {
         if (containerWidth === 0) {
             // 如果宽度为0,可能是DOM还未完全加载,延迟重试
             log('容器宽度为0,延迟重试');
             setTimeout(initSiteNoticeScroll, 100);
             setTimeout(initSiteNoticeScroll, 100);
             return;
             return;
         }
         }
          
          
        // 设置 ul 和 li 的宽度
         ul.width(containerWidth * lis.length).attr({
         ul.css({
            'width': (containerWidth * lis.length) + 'px',
            '-webkit-transform': 'translateX(0px)',
            '-moz-transform': 'translateX(0px)',
            '-ms-transform': 'translateX(0px)',
            '-o-transform': 'translateX(0px)',
            'transform': 'translateX(0px)',
            '-webkit-transition': 'transform 0.73s ease-in-out',
            '-moz-transition': 'transform 0.73s ease-in-out',
            '-o-transition': 'transform 0.73s ease-in-out',
            'transition': 'transform 0.73s ease-in-out'
        }).attr({
             'data-left': 0,
             'data-left': 0,
             'data-length': lis.length
             'data-length': lis.length
         });
         });
          
          
         lis.css('width', containerWidth + 'px');
         lis.width(containerWidth);
        log('设置 ul 宽度: ' + (containerWidth * lis.length) + ', 每个 li 宽度: ' + containerWidth);
          
          
         // 强制重绘
         // 设置初始位置和过渡效果
         ul[0].offsetHeight;
         ul.css({
            'margin-left': '0px',
            'transition': 'margin-left 0.73s ease-in-out'
        });
          
          
         // 开始滚动
         // 开始滚动
         var scrollInterval = window.setInterval(function() {
         var scrollInterval = window.setInterval(function() {
             var dataset = ul[0].dataset;
             var dataset = ul[0].dataset;
             if (!dataset) return;
             if (!dataset) {
                log('无法获取 dataset');
                return;
            }
              
              
             var currentLeft = parseInt(dataset.left) || 0;
             var currentLeft = parseInt(dataset.left) || 0;
             var totalLength = parseInt(dataset.length) || lis.length;
             var totalLength = parseInt(dataset.length) || lis.length;
             var newLeft = currentLeft + 1;
             var newLeft = currentLeft + 1;
           
            log('当前索引: ' + currentLeft + ', 总长度: ' + totalLength + ', 新索引: ' + newLeft);
              
              
             // 如果到达最后一个,重置到第一个(索引0)
             // 如果到达最后一个,重置到第一个(索引0)
             if (newLeft >= totalLength) {
             if (newLeft >= totalLength) {
                 newLeft = 0;
                 newLeft = 0;
                log('重置到开始位置');
             }
             }
              
              
             var translateX = -(newLeft * containerWidth);
             var marginLeft = -(newLeft * containerWidth);
              
             ul.css({
            // 重置时先移除 transition,立即跳转,然后恢复
                'margin-left': marginLeft + 'px',
            if (newLeft === 0) {
                 'transition': 'margin-left 0.73s ease-in-out'
                ul.css({
             });
                    '-webkit-transition': 'none',
                    '-moz-transition': 'none',
                    '-o-transition': 'none',
                    'transition': 'none',
                    '-webkit-transform': 'translateX(0px)',
                    '-moz-transform': 'translateX(0px)',
                    '-ms-transform': 'translateX(0px)',
                    '-o-transform': 'translateX(0px)',
                    'transform': 'translateX(0px)'
                });
                // 强制重绘
                ul[0].offsetHeight;
                // 恢复 transition
                 setTimeout(function() {
                    ul.css({
                        '-webkit-transition': 'transform 0.73s ease-in-out',
                        '-moz-transition': 'transform 0.73s ease-in-out',
                        '-o-transition': 'transform 0.73s ease-in-out',
                        'transition': 'transform 0.73s ease-in-out'
                    });
                }, 50);
             } else {
                ul.css({
                    '-webkit-transition': 'transform 0.73s ease-in-out',
                    '-moz-transition': 'transform 0.73s ease-in-out',
                    '-o-transition': 'transform 0.73s ease-in-out',
                    'transition': 'transform 0.73s ease-in-out',
                    '-webkit-transform': 'translateX(' + translateX + 'px)',
                    '-moz-transform': 'translateX(' + translateX + 'px)',
                    '-ms-transform': 'translateX(' + translateX + 'px)',
                    '-o-transform': 'translateX(' + translateX + 'px)',
                    'transform': 'translateX(' + translateX + 'px)'
                });
            }
           
             dataset.left = newLeft;
             dataset.left = newLeft;
            log('设置 margin-left: ' + marginLeft + 'px');
         }, 5000);
         }, 5000);
       
        log('滚动定时器已启动,间隔: 5000ms');
          
          
         // 窗口大小改变时重新计算
         // 窗口大小改变时重新计算
         $(window).on('resize', function() {
         $(window).on('resize', function() {
            log('窗口大小改变');
             containerWidth = self.width();
             containerWidth = self.width();
             if (containerWidth === 0) return;
             if (containerWidth === 0) return;
              
              
             ul.css('width', (containerWidth * lis.length) + 'px');
             ul.width(containerWidth * lis.length);
             lis.css('width', containerWidth + 'px');
             lis.width(containerWidth);
              
              
             var currentLeft = parseInt(ul[0].dataset.left) || 0;
             var currentLeft = parseInt(ul[0].dataset.left) || 0;
             if (currentLeft < 0) currentLeft = 0;
             if (currentLeft < 0) currentLeft = 0;
            var translateX = -(currentLeft * containerWidth);
             ul.css({
             ul.css({
                 '-webkit-transition': 'transform 0.37s ease-in-out',
                 'margin-left': -(currentLeft * containerWidth) + 'px',
                '-moz-transition': 'transform 0.37s ease-in-out',
                 'transition': 'margin-left 0.37s ease-in-out'
                 '-o-transition': 'transform 0.37s ease-in-out',
                'transition': 'transform 0.37s ease-in-out',
                '-webkit-transform': 'translateX(' + translateX + 'px)',
                '-moz-transform': 'translateX(' + translateX + 'px)',
                '-ms-transform': 'translateX(' + translateX + 'px)',
                '-o-transform': 'translateX(' + translateX + 'px)',
                'transform': 'translateX(' + translateX + 'px)'
             });
             });
         });
         });
          
          
         // 保存 interval ID,以便后续清理
         // 保存 interval ID
         self.data('scrollInterval', scrollInterval);
         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 加载完成
     // 等待 DOM 和 MediaWiki 加载完成
     function init() {
     function init() {
        log('开始初始化');
        log('jQuery 版本: ' + (typeof $ !== 'undefined' ? $.fn.jquery : '未加载'));
        log('MediaWiki 版本: ' + (typeof mw !== 'undefined' ? '已加载' : '未加载'));
       
         // 先初始化用户提示(必须在滚动初始化之前)
         // 先初始化用户提示(必须在滚动初始化之前)
         var promptAdded = initUserPrompt();
         var promptAdded = initUserPrompt();
        log('用户提示初始化结果: ' + promptAdded);
          
          
         // 延迟初始化滚动效果,确保 DOM 完全更新
         // 延迟初始化滚动效果,确保 DOM 完全更新
第182行: 第190行:
     }
     }
      
      
     // 多种初始化方式,确保在移动端和桌面端都能工作
     // 多种初始化方式
     if (typeof $ !== 'undefined') {
     if (typeof $ !== 'undefined') {
         // jQuery 已加载
         log('jQuery 已加载,使用 jQuery ready');
         $(document).ready(function() {
         $(document).ready(function() {
            log('jQuery ready 触发');
             init();
             init();
         });
         });
          
          
        // 如果已经在 ready 状态,立即执行
         if (document.readyState === 'complete' || document.readyState === 'interactive') {
         if (document.readyState === 'complete' || document.readyState === 'interactive') {
            log('文档已加载,立即执行');
             setTimeout(init, 100);
             setTimeout(init, 100);
         }
         }
     } else {
     } else {
         // 等待 jQuery 加载
         log('jQuery 未加载,等待加载');
         if (document.readyState === 'loading') {
         if (document.readyState === 'loading') {
             document.addEventListener('DOMContentLoaded', function() {
             document.addEventListener('DOMContentLoaded', function() {
                log('DOMContentLoaded 触发');
                 if (typeof $ !== 'undefined') {
                 if (typeof $ !== 'undefined') {
                     setTimeout(init, 100);
                     setTimeout(init, 100);
第202行: 第212行:
             });
             });
         } else {
         } else {
            // 如果 DOM 已加载,等待 jQuery
             var checkJQuery = setInterval(function() {
             var checkJQuery = setInterval(function() {
                 if (typeof $ !== 'undefined') {
                 if (typeof $ !== 'undefined') {
                    log('jQuery 已加载');
                     clearInterval(checkJQuery);
                     clearInterval(checkJQuery);
                     init();
                     init();
第210行: 第220行:
             }, 100);
             }, 100);
              
              
            // 10秒后停止检查
             setTimeout(function() {
             setTimeout(function() {
                 clearInterval(checkJQuery);
                 clearInterval(checkJQuery);
第217行: 第226行:
     }
     }
      
      
     // 使用 MediaWiki 的 hook(如果可用)
     // 使用 MediaWiki 的 hook
     if (typeof mw !== 'undefined' && mw.hook) {
     if (typeof mw !== 'undefined' && mw.hook) {
        log('注册 mobile.init hook');
         mw.hook('mobile.init').add(function() {
         mw.hook('mobile.init').add(function() {
            log('mobile.init hook 触发');
             setTimeout(init, 200);
             setTimeout(init, 200);
         });
         });
     }
     }
   
    log('脚本加载完成');
})();
})();

2025年12月19日 (五) 08:02的版本

// 调试版本的 Mobile.js
// 如果正常版本不工作,可以使用这个版本查看调试信息

(function() {
    'use strict';
    
    function log(message) {
        if (typeof console !== 'undefined' && console.log) {
            console.log('[SiteNotice] ' + message);
        }
    }
    
    // 初始化用户提示
    function initUserPrompt() {
        log('开始初始化用户提示');
        
        var siteNoticeScroll = $('#siteNoticeScroll');
        log('siteNoticeScroll 元素数量: ' + siteNoticeScroll.length);
        
        if (siteNoticeScroll.length === 0) {
            log('未找到 siteNoticeScroll 元素');
            return false;
        }
        
        var ul = siteNoticeScroll.find('ul:first');
        log('ul 元素数量: ' + ul.length);
        
        if (ul.length === 0) {
            log('未找到 ul 元素');
            return false;
        }
        
        var existingLis = ul.find('li');
        log('现有 li 元素数量: ' + existingLis.length);
        
        var currentUser = null;
        try {
            if (typeof mw !== 'undefined' && mw.config && mw.config.get) {
                currentUser = mw.config.get('wgUserName');
                log('当前用户: ' + (currentUser || '未登录'));
            }
        } catch (e) {
            log('获取用户信息失败: ' + e.message);
        }
        
        var promptElement = $('#userPrompt');
        log('现有 userPrompt 元素数量: ' + promptElement.length);
        
        // 如果页面没有 userPrompt 元素,创建一个
        if (promptElement.length === 0) {
            log('创建新的 userPrompt 元素');
            promptElement = $('<li id="userPrompt"></li>');
            ul.append(promptElement);
            log('userPrompt 元素已添加到 DOM');
        }
        
        // 设置内容
        var content = '';
        if (currentUser && currentUser !== null && currentUser !== '') {
            content = '<strong>欢迎回来,' + currentUser + '!感谢您对炼石百科的贡献!</strong>';
            log('设置已登录用户内容');
        } else {
            content = '<strong>欢迎加入炼石百科<a href="/wiki/Special:用户登录"><font color="#3862AE">注册一个账号</font></a>,一起参与编写吧!</strong>';
            log('设置未登录用户内容');
        }
        
        promptElement.html(content);
        log('userPrompt 内容已设置');
        
        // 验证元素是否存在
        var finalLis = ul.find('li');
        log('最终 li 元素数量: ' + finalLis.length);
        
        return true;
    }
    
    // 初始化公告滚动
    function initSiteNoticeScroll() {
        log('开始初始化滚动效果');
        
        var self = $('#siteNoticeScroll');
        if (!self.length || !self[0]) {
            log('未找到 siteNoticeScroll 元素');
            return;
        }
        
        var ul = self.find('ul:first');
        if (!ul.length) {
            log('未找到 ul 元素');
            return;
        }
        
        var lis = ul.find('li');
        log('找到 ' + lis.length + ' 个 li 元素');
        
        if (lis.length <= 1) {
            log('li 元素数量不足,不需要滚动');
            return;
        }
        
        var containerWidth = self.width();
        log('容器宽度: ' + containerWidth);
        
        if (containerWidth === 0) {
            log('容器宽度为0,延迟重试');
            setTimeout(initSiteNoticeScroll, 100);
            return;
        }
        
        ul.width(containerWidth * lis.length).attr({
            'data-left': 0,
            'data-length': lis.length
        });
        
        lis.width(containerWidth);
        log('设置 ul 宽度: ' + (containerWidth * lis.length) + ', 每个 li 宽度: ' + 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) {
                log('无法获取 dataset');
                return;
            }
            
            var currentLeft = parseInt(dataset.left) || 0;
            var totalLength = parseInt(dataset.length) || lis.length;
            var newLeft = currentLeft + 1;
            
            log('当前索引: ' + currentLeft + ', 总长度: ' + totalLength + ', 新索引: ' + newLeft);
            
            // 如果到达最后一个,重置到第一个(索引0)
            if (newLeft >= totalLength) {
                newLeft = 0;
                log('重置到开始位置');
            }
            
            var marginLeft = -(newLeft * containerWidth);
            ul.css({
                'margin-left': marginLeft + 'px',
                'transition': 'margin-left 0.73s ease-in-out'
            });
            dataset.left = newLeft;
            log('设置 margin-left: ' + marginLeft + 'px');
        }, 5000);
        
        log('滚动定时器已启动,间隔: 5000ms');
        
        // 窗口大小改变时重新计算
        $(window).on('resize', function() {
            log('窗口大小改变');
            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);
    }
    
    // 等待 DOM 和 MediaWiki 加载完成
    function init() {
        log('开始初始化');
        log('jQuery 版本: ' + (typeof $ !== 'undefined' ? $.fn.jquery : '未加载'));
        log('MediaWiki 版本: ' + (typeof mw !== 'undefined' ? '已加载' : '未加载'));
        
        // 先初始化用户提示(必须在滚动初始化之前)
        var promptAdded = initUserPrompt();
        log('用户提示初始化结果: ' + promptAdded);
        
        // 延迟初始化滚动效果,确保 DOM 完全更新
        setTimeout(function() {
            initSiteNoticeScroll();
        }, promptAdded ? 100 : 0);
    }
    
    // 多种初始化方式
    if (typeof $ !== 'undefined') {
        log('jQuery 已加载,使用 jQuery ready');
        $(document).ready(function() {
            log('jQuery ready 触发');
            init();
        });
        
        if (document.readyState === 'complete' || document.readyState === 'interactive') {
            log('文档已加载,立即执行');
            setTimeout(init, 100);
        }
    } else {
        log('jQuery 未加载,等待加载');
        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', function() {
                log('DOMContentLoaded 触发');
                if (typeof $ !== 'undefined') {
                    setTimeout(init, 100);
                }
            });
        } else {
            var checkJQuery = setInterval(function() {
                if (typeof $ !== 'undefined') {
                    log('jQuery 已加载');
                    clearInterval(checkJQuery);
                    init();
                }
            }, 100);
            
            setTimeout(function() {
                clearInterval(checkJQuery);
            }, 10000);
        }
    }
    
    // 使用 MediaWiki 的 hook
    if (typeof mw !== 'undefined' && mw.hook) {
        log('注册 mobile.init hook');
        mw.hook('mobile.init').add(function() {
            log('mobile.init hook 触发');
            setTimeout(init, 200);
        });
    }
    
    log('脚本加载完成');
})();