MediaWiki:Common.js
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:按 Ctrl-F5。
/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
function templateResourceLoader() {
$('.resourceLoader').each(function() {
var $x = $(this);
var text = $.trim($x.text());
if (!text) return;
//加载模块
if ($x.data('isModule') == true)
return mw.loader.load(text);
//自动补充MediaWiki命名空间
var ns = text.match('^.*?:');
if (!ns) text = 'MediaWiki:' + text;
//加载CSS样式表
var mime = ($x.data('mime') || "text/javascript").toLowerCase();
if (mime == "text/css") {
if (text.slice(-4).toLowerCase() !== '.css') text = text + '.css';
//if ($x.data('debug') !== true) text = text + '&debug=false';
return mw.loader.load("//wiki.17173.com/zzz/index.php?title="+text+"&action=raw&ctype=text/css", "text/css");
}
//加载JS脚本
if (ns && ns[0].toLowerCase() !== 'mediawiki:') {
return console.log('ResourceLoader: 不允许加载MediaWiki以外的js脚本');
}
if (text.slice(-3).toLowerCase() !== '.js') text = text + '.js';
//加载ES6模块
if ($x.data('isModuleEs6') == true)
return loadModuleES6("//wiki.17173.com/zzz/index.php?title="+text+"&action=raw&ctype=text/javascript", function() {
console.log("ResourceLoader: 加载ES6模块 => " + text);
});
//加载React模块
if ($x.data('isModuleReact')) {
if ($x.data('isModuleReact')[0]) {
$.getScript("//wiki.17173.com/zzz/index.php?title=MediaWiki:React.development.min.js&action=raw&ctype=text/javascript", function() {
$.getScript("//wiki.17173.com/zzz/index.php?title=MediaWiki:React-dom.development.min.js&action=raw&ctype=text/javascript", function() {
console.log("ReactENV => React/ReactDOM Loaded! React is Available For This Page!");
console.log("%c React开发提示 %c 请务必在JS编辑界面右下角使用React同步器同步编译你的JSX代码,否则它将不起任何作用", "color: #fff; padding: 5px 0; background: blue;", "padding: 5px 5px 5px 0; background: #e5e5ff; color:blue");
$('.resourceLoader').each(function() {
var $xr = $(this);
var textr = $.trim($xr.text());
if (!textr) return;
//自动为React模块补充MediaWiki命名空间与-babel后缀
var nsr = textr.match('^.*?:');
if (!nsr) textr = 'MediaWiki:' + textr.slice(0, -3);
textr += '-babel.js';
if ($xr.data('isModuleReact') && $xr.data('isModuleReact')[1]) {
loadModuleES6("//wiki.17173.com/zzz/index.php?title="+textr+"&action=raw&ctype=text/javascript", function() {
console.log("ResourceLoader: 加载React模块 => " + textr);
});
}
});
});
});
return;
}
}
//加载普通脚本
console.log('ResourceLoader: 加载JS => ' + text);
//if ($x.data('debug') !== true) text = text + '&debug=false';
return mw.loader.load("//wiki.17173.com/zzz/index.php?title="+text+"&action=raw&ctype=text/javascript", "text/javascript");
});
}
if (document.readyState == 'loading') {
document.addEventListener('DOMContentLoaded', templateResourceLoader);
} else {
templateResourceLoader();
}
//加载ES6模块
function loadModuleES6(src, callback) {
var script = document.createElement('script'),
head = document.getElementsByTagName('head')[0];
script.type = 'module';
script.charset = 'UTF-8';
script.src = src;
if (script.addEventListener) {
script.addEventListener('load', function () {
callback();
}, false);
} else if (script.attachEvent) {
script.attachEvent('onreadystatechange', function () {
var target = window.event.srcElement;
if (target.readyState == 'loaded') {
callback();
}
});
}
head.appendChild(script);
}
$(function InitCardSelect() {
var self = {};
var selectOptions; //所有筛选按钮
var filters = {}; //当前筛选规则
var filterKeys = []; //所有筛选Key
var showAll = true; //不筛选,显示全部
var tableRows; //所有要被筛选的行
var computedRows; //筛选后的行
var $sorter; //当前进行排序的表头
var sortDesent = false; //反向排序
function isNil(s) {
return s === "" || s === undefined || s === null || s === false;
}
//点击筛选按钮时
function OnSelectOptionClick(e) {
var $x = e.data;
e.preventDefault();
var label = "[" + $.trim($x.text()) + "] 筛选";
console.time(label);
//显示全部
if ($x.FilterKey == 0) {
for (var i in selectOptions) {
selectOptions[i].Select = false;
selectOptions[i].removeClass("selected");
}
filters = {};
showAll = true;
//更新表格
self.FilterRows();
console.timeEnd(label);
return;
}
showAll = false;
var select = !$x.Select;
$x.Select = select;
//变更筛选状态
var key = $x.FilterKey;
filters[key] = filters[key] || {};
var opt = $x.FilterOpt == "AND" ? "AND" : "OR";
filters[key][opt] = filters[key][opt] || [];
if (select) {
filters[key][opt].push($x.FilterValue);
} else {
filters[key][opt] = filters[key][opt].filter(function (x) {
return x !== $x.FilterValue;
});
if (filters[key][opt].length < 1) delete filters[key][opt];
}
select ? $x.addClass("selected") : $x.removeClass("selected");
self.FilterRows();
console.timeEnd(label);
}
function OnHeaderSortClick(e) {
var $x = e.data;
e.preventDefault();
var label = "[" + $.trim($x.text()) + "] 排序";
console.time(label);
if ($sorter !== $x) {
//第一次:新的排序
$sorter = $x;
sortDesent = false;
} else if (!sortDesent) {
//第二次:切换排序
sortDesent = true;
} else {
//第三次:不进行排序
$sorter = null;
}
self.SortRows();
console.timeEnd(label);
}
//初始化
self.Init = function () {
selectOptions = $(".cardSelectOption")
.toArray()
.map(function (x) {
var $x = $(x);
var dataOption = $.trim($x.data("option"));
var dataGroup = $.trim($x.data("group"));
if (isNil(dataOption) || isNil(dataGroup)) return $x;
var splt = dataOption.split("|");
$x.FilterKey = dataGroup;
$x.FilterValue = $.trim(splt[1]);
$x.FilterOpt = $.trim($x.data("opt") || "OR").toUpperCase();
if (filterKeys.indexOf(dataGroup) < 0) filterKeys.push(dataGroup);
$x.click($x, OnSelectOptionClick);
return $x;
});
//$head = $('#CardSelectTabHeader');
tableRows = $("#CardSelectTr>tbody>tr,#CardSelectCard .trcard")
.toArray()
.map(function (x) {
var $x = $(x);
//if (x == $head[0]) continue;
for (var i in filterKeys) {
var key = filterKeys[i];
var val = $x.data("param" + key);
if (val === undefined) continue;
if (typeof val == "number") {
val = val.toString(10);
}
var splt = val.split(",");
for (var j in splt) {
var s = $.trim(splt[j]);
if (!isNil(s)) {
$x.FilterData = $x.FilterData || {};
$x.FilterData[key] = $x.FilterData[key] || [];
$x.FilterData[key].push(s);
}
}
}
return $x;
});
//computedRows = tableRows.concat([]);
$("#CardSelectTr>thead>tr>th").each(function (index, x) {
var $x = $(x);
$x.off("click").off("mousedown");
if ($x.hasClass("headerSort")) {
$x.Index = index;
//$x.SortKey = $x.data('group');
$x.click($x, OnHeaderSortClick);
}
});
};
//t1中包含t2中所有项
function includeAll(t1, t2) {
for (var i in t2) {
if (t1.indexOf(t2[i]) < 0) return false;
}
return true;
}
//t1中包含t2中的任一项
function includeAny(t1, t2) {
if (t2.length == 0) return true;
for (var i in t2) {
if (t1.indexOf(t2[i]) > -1) return true;
}
return false;
}
//使用show/hide来显示表格行
self.FilterRows = function () {
if (showAll) {
filters = {};
}
$("#CardSelectTr>tbody,#CardSelectCard").hide();
for (var idx in tableRows) {
var $x = tableRows[idx];
var data = $x.FilterData;
var hide = false;
for (var key in filters) {
hide = !data || !data[key];
if (!hide && filters[key]["AND"]) {
hide = !includeAll(data[key], filters[key]["AND"]);
}
if (!hide && filters[key]["OR"]) {
hide = !includeAny(data[key], filters[key]["OR"]);
}
if (hide) break;
}
if (!hide != !$x.Hide) {
$x.Hide = hide;
hide ? $x.hide() : $x.show();
}
}
$("#CardSelectTr .headerSort").removeClass("headerSortDown headerSortUp");
$("#CardSelectTr>tbody,#CardSelectCard").show();
$sorter = null;
};
function grabSortData($tr, index) {
$tr.SortData = $tr.SortData || [];
if ($tr.SortData[index] !== undefined) return $tr.SortData[index];
var td = $tr.children("td")[index];
if (!td) {
$tr.SortData[index] = -1;
return -1;
}
var text = $.trim(td.textContent);
$tr.SortData[index] = text;
return text;
}
//对行排序,不显示的行会被移除
self.SortRows = function () {
//var residues = [];
if (!$sorter) {
computedRows = tableRows.filter(function ($x) {
return !$x.Hide;
});
$("#CardSelectTr .headerSort").removeClass("headerSortDown headerSortUp");
} else if (!sortDesent) {
var index = $sorter.Index;
computedRows = tableRows.filter(function ($x) {
return !$x.Hide;
});
computedRows.sort(function compareFunction($x, $y) {
var x = grabSortData($x, index);
var y = grabSortData($y, index);
var nx = +x;
var ny = +y;
return isNaN(nx) || isNaN(ny)
? isNaN(nx) && isNaN(ny)
? x < y
? -1
: 1
: isNaN(nx)
? 1
: -1 //字符串排后
: nx === ny
? 0
: nx < ny
? -1
: 1; //数值小的排前
//console.log (`${x} ~ ${y} => ${ret}`);
//return ret;
});
$("#CardSelectTr .headerSort").removeClass("headerSortDown headerSortUp");
$sorter.addClass("headerSortDown");
} else {
computedRows.reverse();
$("#CardSelectTr .headerSort").removeClass("headerSortDown headerSortUp");
$sorter.addClass("headerSortUp");
}
$("#CardSelectTr>tbody").hide().prepend(computedRows).show();
};
$(".cardSelectOption").off("click").off("mousedown");
if ($("#CardSelectTabHeader").parent().is("tbody")) {
$("#CardSelectTr").prepend($("<thead/>").append($("#CardSelectTabHeader")));
}
self.Init();
console.log("Common.js CardSelectTr Initialized.");
return self;
});
function fIsMobile() {
return /Android|iPhone|iPad|iPod|BlackBerry|webOS|Windows Phone|SymbianOS|IEMobile|Opera Mini/i.test(navigator.userAgent);
}
$(".show-more").click(function () {
var $description = $(this).find(".more-description");
if ($description.css("display") === "block") {
$description.css("display", "none");
} else {
$description.css("display", "block");
}
});
function isMiniProgram() {
return /miniProgram/i.test(navigator.userAgent);
}
// 导航定位到指定位置
$(function(){
location.hash && $('#toc').find('a:contains('+decodeURIComponent(location.hash).replace(/[<>&'"#]/g,'')+')').click()
// 小程序webview
if (isMiniProgram()) {
$('.bvideo').hide()
$('body').addClass('miniapp')
$('body').append('<div class="modal fade show" id="modal" tabindex="-1" aria-labelledby="modal" aria-modal="true" role="dialog"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><div class="modal-header"><h1 class="modal-title fs-5" id="exampleModalLiveLabel">复制链接到浏览器打开</h1><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body"></div></div></div></div>')
$('a').on('click', function (event) {
if (!this.href.includes('wiki.17173.com')) {
event.preventDefault()
$('.modal-body').html('<p class="text-break">' + this.href + '</p>')
$('#modal').show()
}
})
$('#modal .btn-close').on('click', function (params) {
$('#modal').hide()
})
}
})
/* 角色数值部分 */
function updates(level) {
var url = mw.util.wikiScript('api') + '?action=cargoquery&tables=CharactersData&fields=HP,ATK,DEF,Impact,CRIT Rate,CRIT DMG,PEN Ratio,PEN,Attribute Mastery,Energy Regen&where=Level=' + encodeURIComponent(level) + '&format=json';
fetch(url)
.then(function(response) {
return response.json();
})
.then(function(data) {
if (data && data.cargoquery && data.cargoquery.length > 0) {
var record = data.cargoquery[0].title;
document.getElementById('hpValue').textContent = record.HP || '-';
document.getElementById('defValue').textContent = record.DEF || '-';
document.getElementById('atkValue').textContent = record.ATK || '-';
document.getElementById('critRateValue').textContent = record['CRIT Rate'] + '%' || '-';
document.getElementById('critDmgValue').textContent = record['CRIT DMG'] + '%' || '-';
document.getElementById('impactValue').textContent = record.Impact || '-';
document.getElementById('attributeMasteryValue').textContent = record.Attribute Mastery || '-';
document.getElementById('penRatioValue').textContent = record['PEN Ratio'] + '%' || '-';
document.getElementById('penValue').textContent = record.PEN || '-';
document.getElementById('energyRegenValue').textContent = record['Energy Regen'] || '-';
}
})
.catch(function(error) {
console.error('Error fetching data: ', error);
});
}