36
个编辑
-
汇聚密码安全智慧 共享实战经验!
无编辑摘要 标签:已被回退 移动版编辑 移动版网页编辑 |
无编辑摘要 标签:手工回退 移动版编辑 移动版网页编辑 |
||
| 第1行: | 第1行: | ||
// | // 调试版本的 Mobile.js | ||
// | // 如果正常版本不工作,可以使用这个版本查看调试信息 | ||
(function() { | (function() { | ||
'use strict'; | 'use strict'; | ||
// | function log(message) { | ||
var | 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]) { | if (!self.length || !self[0]) { | ||
log('未找到 siteNoticeScroll 元素'); | |||
return; | return; | ||
} | } | ||
| 第18行: | 第87行: | ||
var ul = self.find('ul:first'); | var ul = self.find('ul:first'); | ||
if (!ul.length) { | if (!ul.length) { | ||
log('未找到 ul 元素'); | |||
return; | return; | ||
} | } | ||
var lis = ul.find('li'); | var lis = ul.find('li'); | ||
log('找到 ' + lis.length + ' 个 li 元素'); | |||
if (lis.length <= 1) { | if (lis.length <= 1) { | ||
return; | log('li 元素数量不足,不需要滚动'); | ||
return; | |||
} | } | ||
var containerWidth = self.width(); | |||
var containerWidth = self.width() | log('容器宽度: ' + containerWidth); | ||
if (containerWidth === 0) { | if (containerWidth === 0) { | ||
log('容器宽度为0,延迟重试'); | |||
setTimeout(initSiteNoticeScroll, 100); | setTimeout(initSiteNoticeScroll, 100); | ||
return; | return; | ||
} | } | ||
// 设置 ul | // 设置 ul 和 li 的宽度 | ||
ul.css({ | ul.css({ | ||
'width': | '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-transform': ' | |||
'-moz-transform': ' | |||
'-ms-transform': ' | |||
'-o-transform': ' | |||
'transform': ' | |||
'-webkit-transition': 'transform 0.73s ease-in-out', | '-webkit-transition': 'transform 0.73s ease-in-out', | ||
'-moz-transition': 'transform 0.73s ease-in-out', | '-moz-transition': 'transform 0.73s ease-in-out', | ||
'-o-transition': 'transform 0.73s ease-in-out', | '-o-transition': 'transform 0.73s ease-in-out', | ||
'transition': 'transform 0.73s ease-in-out | 'transition': 'transform 0.73s ease-in-out' | ||
}).attr({ | }).attr({ | ||
'data-left': 0, | 'data-left': 0, | ||
| 第60行: | 第125行: | ||
}); | }); | ||
lis.css('width', containerWidth + 'px'); | |||
lis.css( | log('设置 ul 宽度: ' + (containerWidth * lis.length) + ', 每个 li 宽度: ' + containerWidth); | ||
// 强制重绘 | // 强制重绘 | ||
ul[0].offsetHeight; | ul[0].offsetHeight; | ||
// 开始滚动 | // 开始滚动 | ||
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('重置到开始位置'); | |||
} | } | ||
| 第100行: | 第155行: | ||
// 重置时先移除 transition,立即跳转,然后恢复 | // 重置时先移除 transition,立即跳转,然后恢复 | ||
if (newLeft === 0) { | if (newLeft === 0) { | ||
ul.css({ | ul.css({ | ||
'-webkit-transition': 'none', | '-webkit-transition': 'none', | ||
| 第106行: | 第160行: | ||
'-o-transition': 'none', | '-o-transition': 'none', | ||
'transition': 'none', | 'transition': 'none', | ||
'-webkit-transform': ' | '-webkit-transform': 'translateX(0px)', | ||
'-moz-transform': ' | '-moz-transform': 'translateX(0px)', | ||
'-ms-transform': ' | '-ms-transform': 'translateX(0px)', | ||
'-o-transform': ' | '-o-transform': 'translateX(0px)', | ||
'transform': ' | 'transform': 'translateX(0px)' | ||
}); | }); | ||
ul[0].offsetHeight; // 强制重绘 | |||
ul[0].offsetHeight; | |||
setTimeout(function() { | setTimeout(function() { | ||
ul.css({ | ul.css({ | ||
| 第123行: | 第175行: | ||
}); | }); | ||
}, 50); | }, 50); | ||
log('设置 transform: translateX(0px)'); | |||
} else { | } else { | ||
ul.css({ | ul.css({ | ||
'-webkit-transition': 'transform 0.73s ease-in-out', | '-webkit-transition': 'transform 0.73s ease-in-out', | ||
| 第130行: | 第182行: | ||
'-o-transition': 'transform 0.73s ease-in-out', | '-o-transition': 'transform 0.73s ease-in-out', | ||
'transition': 'transform 0.73s ease-in-out', | 'transition': 'transform 0.73s ease-in-out', | ||
'-webkit-transform': ' | '-webkit-transform': 'translateX(' + translateX + 'px)', | ||
'-moz-transform': ' | '-moz-transform': 'translateX(' + translateX + 'px)', | ||
'-ms-transform': 'translateX(' + translateX + 'px)', | '-ms-transform': 'translateX(' + translateX + 'px)', | ||
'-o-transform': ' | '-o-transform': 'translateX(' + translateX + 'px)', | ||
'transform': ' | 'transform': 'translateX(' + translateX + 'px)' | ||
}); | }); | ||
log('设置 transform: translateX(' + translateX + 'px)'); | |||
} | } | ||
dataset.left = newLeft; | dataset.left = newLeft; | ||
}, 5000); | }, 5000); | ||
log('滚动定时器已启动,间隔: 5000ms'); | |||
// 窗口大小改变时重新计算 | // 窗口大小改变时重新计算 | ||
$(window).on('resize | $(window).on('resize', function() { | ||
containerWidth = self.width() | log('窗口大小改变'); | ||
containerWidth = self.width(); | |||
if (containerWidth === 0) return; | if (containerWidth === 0) return; | ||
ul.css('width', (containerWidth * lis.length) + 'px'); | |||
ul.css('width', | |||
lis.css('width', containerWidth + 'px'); | lis.css('width', containerWidth + 'px'); | ||
| 第154行: | 第209行: | ||
var translateX = -(currentLeft * containerWidth); | var translateX = -(currentLeft * containerWidth); | ||
ul.css({ | ul.css({ | ||
'-webkit-transition': 'transform 0.37s ease-in-out', | '-webkit-transition': 'transform 0.37s ease-in-out', | ||
'-moz-transition': 'transform 0.37s ease-in-out', | '-moz-transition': 'transform 0.37s ease-in-out', | ||
'-o-transition': 'transform 0.37s ease-in-out', | '-o-transition': 'transform 0.37s ease-in-out', | ||
'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)' | |||
}); | }); | ||
}); | }); | ||
| 第168行: | 第223行: | ||
// 保存 interval ID | // 保存 interval ID | ||
self.data('scrollInterval', scrollInterval); | self.data('scrollInterval', scrollInterval); | ||
} | } | ||
// 等待 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 完全更新 | ||
setTimeout(function() { | setTimeout(function() { | ||
initSiteNoticeScroll(); | initSiteNoticeScroll(); | ||
}, promptAdded ? | }, promptAdded ? 100 : 0); | ||
} | } | ||
// | // 多种初始化方式 | ||
if (typeof $ !== 'undefined') { | if (typeof $ !== 'undefined') { | ||
log('jQuery 已加载,使用 jQuery ready'); | |||
$(document).ready(function() { | $(document).ready(function() { | ||
log('jQuery ready 触发'); | |||
init(); | init(); | ||
}); | }); | ||
if (document.readyState === 'complete' || document.readyState === 'interactive') { | if (document.readyState === 'complete' || document.readyState === 'interactive') { | ||
log('文档已加载,立即执行'); | |||
setTimeout(init, 100); | |||
} | } | ||
} else { | } else { | ||
log('jQuery 未加载,等待加载'); | |||
if (document.readyState === 'loading') { | if (document.readyState === 'loading') { | ||
document.addEventListener('DOMContentLoaded', function() { | document.addEventListener('DOMContentLoaded', function() { | ||
if (typeof $ !== 'undefined' | log('DOMContentLoaded 触发'); | ||
setTimeout(init, | if (typeof $ !== 'undefined') { | ||
setTimeout(init, 100); | |||
} | } | ||
}); | }); | ||
} else { | } else { | ||
var checkJQuery = setInterval(function() { | var checkJQuery = setInterval(function() { | ||
if (typeof $ !== 'undefined' | if (typeof $ !== 'undefined') { | ||
log('jQuery 已加载'); | |||
clearInterval(checkJQuery); | clearInterval(checkJQuery); | ||
init(); | init(); | ||
| 第259行: | 第271行: | ||
}, 100); | }, 100); | ||
setTimeout(function() { | setTimeout(function() { | ||
clearInterval(checkJQuery); | clearInterval(checkJQuery); | ||
| 第266行: | 第277行: | ||
} | } | ||
// 使用 MediaWiki 的 | // 使用 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); | |||
}); | }); | ||
} | } | ||
log('脚本加载完成'); | |||
})(); | })(); | ||