MediaWiki:Gadget-ScrollUpButton.js:修订间差异

删除的内容 添加的内容
重构:节流优化、移除 dead code、修复动画堆积
鹿野耕云移动页面MediaWiki:Gadget-scrollUpButton.jsMediaWiki:Gadget-ScrollUpButton.js,不留重定向
 
(未显示2个用户的7个中间版本)
第1行:
/**
* SPDX-License-Identifier: GPL-3.0-or-later
* Copyright (c) 2021-present, 安忆.
* _addText: '{{Gadget Header|license=GPL-3.0-or-later}}'
*
* @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/ScrollUpButton}
* @author 安忆 [[zh:U:安忆]]
* @fileauthor scrollUpButton安忆 <i@anyi.jsin>
* @license GPL-3.0-or-later v3{@link https://www.qiuwenbaike.cn/wiki/H:GPL-3.0}
*/
$(function scrollUpButton() {
var $window = $(window);
var icon = mw.config.get('wgServer') + '/w/images/5/59/Font_Awesome_5_regular_arrow-circle-up_blue.svg';
var visible = false;
 
/**
function scrollTo(h) {
* Copyright (C) 安忆
$('html, body').stop(true, true).animate({ scrollTop: h }, 500);
*
}
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/**
* +------------------------------------------------------------+
* | === WARNING: GLOBAL GADGET FILE === |
* +------------------------------------------------------------+
* | All changes should be made in the repository, |
* | otherwise they will be lost. |
* +------------------------------------------------------------+
* | Changes to this page may affect many users. |
* | Please discuss changes by opening an issue before editing. |
* +------------------------------------------------------------+
*/
/* <nowiki> */
 
(() => {
function makeBtn(id, onClick, extraCss) {
return $('<img>')
.addClass('noprint')
.attr({ id: id, src: icon, draggable: 'false' })
.css({
display: 'none',
position: 'fixed',
right: '18px',
cursor: 'pointer',
opacity: '0.7',
width: '40px',
zIndex: 9999,
'-moz-user-select': 'none',
'-webkit-user-select': 'none',
'user-select': 'none',
transition: 'opacity 0.2s',
...extraCss
})
.on('mouseenter', function () { this.style.opacity = '1'; })
.on('mouseleave', function () { this.style.opacity = '0.7'; })
.on('click', onClick)
.appendTo(document.body);
}
 
"use strict";
var $up = makeBtn('scrollUpBtn', function () { scrollTo(0); }, { bottom: '85px' });
var $down = makeBtn('scrollDownBtn', function () {
scrollTo(($(document).height() || 0) - ($window.height() || 0));
}, { bottom: '45px', transform: 'rotate(180deg)' });
 
// dist/ScrollUpButton/ScrollUpButton.js
var $elements = $up.add($down);
function _createForOfIteratorHelper(r, e) {
 
var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"];
function setLeft(px) {
if (!t) {
$elements.css('left', px ? px + 'px' : 'unset');
if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) {
t && (r = t);
var n = 0, F = function() {
};
return { s: F, n: function() {
return n >= r.length ? { done: true } : { done: false, value: r[n++] };
}, e: function(r2) {
throw r2;
}, f: F };
}
throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
var o, a = true, u = false;
 
functionreturn setRight{ s: function(px) {
t = t.call(r);
$elements.css('right', px ? px + 'px' : 'unset');
}, n: function() {
}
var r2 = t.next();
 
return a = r2.done, r2;
var isVector2022 = mw.config.get('skin') === 'vector-2022';
}, e: function(r2) {
var mql = window.matchMedia('(min-width: 1400px)');
u = true, o = r2;
 
function}, onWidthChangef: function(e) {
if (isVector2022)try {
setRight(e.matchesa ?|| 8null :== 18t.return || t.return();
} finally {
if (u) throw o;
}
} };
}
function _unsupportedIterableToArray(r, a) {
if (r) {
if ("string" == typeof r) return _arrayLikeToArray(r, a);
var t = {}.toString.call(r).slice(8, -1);
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
}
}
 
function _arrayLikeToArray(r, a) {
if (isVector2022) {
(null == a || a > r.length) && (a = r.length);
for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];
return n;
}
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
var _iterator = _createForOfIteratorHelper(__getOwnPropNames(from)), _step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done; ) {
mql.addEventListener('change', onWidthChange);
let key = _step.value;
} catch (_) {
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
mql.addListener(onWidthChange);
get: () => from[key],
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
});
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
onWidthChange(mql);
}
return to;
 
};
function onScroll() {
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
var y = $window.scrollTop() || 0;
// If the importer is in node compatibility mode or this is not an ESM
 
// file that has been converted to a CommonJS file using a Babel-
if (y > 200 && !visible) {
// compatible transform (i.e. "__esModule" has not been set), then set
visible = true;
// "default" to the CommonJS "module.exports" for node compatibility.
$elements.fadeIn(300);
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
} else if (y <= 200 && visible) {
value: mod,
visible = false;
enumerable: true
$elements.fadeOut(300);
}) : }target,
mod
 
));
if (
//! src/ScrollUpButton/ScrollUpButton.ts
(mw.config.get('wgGEHelpPanelEnabled') && $('#mw-ge-help-panel-cta-button').length) ||
var import_ext_gadget6 = require("ext.gadget.Util");
$('#cat_a_lot').length ||
//! src/ScrollUpButton/modules/constant.ts
$('#proveit').length ||
var CLASS_NAME = "gadget-scroll_up_button";
$('.wordcount').length
var CLASS_NAME_DOWN = "".concat(CLASS_NAME, "-down");
) {
var CLASS_NAME_UP = "".concat(CLASS_NAME, "-up");
setLeft(10);
//! src/ScrollUpButton/components/scrollButton.tsx
var import_ext_gadget2 = __toESM(require("ext.gadget.JSX"), 1);
//! src/ScrollUpButton/modules/i18n.ts
var import_ext_gadget = require("ext.gadget.i18n");
var getI18nMessages = () => {
return {
ToBottom: (0, import_ext_gadget.localize)({
en: "Scroll to the bottom",
"zh-hans": "滚动至页底",
"zh-hant": "滾動至頁底"
}),
ToTop: (0, import_ext_gadget.localize)({
en: "Go back to the top",
"zh-hans": "滚动至页顶",
"zh-hant": "滾動至頁頂"
})
};
};
var i18nMessages = getI18nMessages();
var getMessage = (key) => {
return i18nMessages[key] || key;
};
//! src/ScrollUpButton/components/scrollButton.tsx
var import_ext_gadget3 = require("ext.gadget.Util");
function ScrollButton(props) {
const {
additionalClassName,
alt,
ariaLabel,
onClick,
onMouseEnter,
onMouseLeave
} = props;
return /* @__PURE__ */ import_ext_gadget2.default.createElement("img", {
className: [CLASS_NAME, additionalClassName, "noprint"],
src: "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='1' height='1'%3E%3C/svg%3E",
width: "32",
height: "32",
draggable: false,
alt,
"aria-label": ariaLabel,
onClick,
onMouseEnter,
onMouseLeave
});
}
var TO_BOTTOM = getMessage("ToBottom");
var TO_TOP = getMessage("ToTop");
var ScrollDownButton = (onMouseEnterMouseLeave) => /* @__PURE__ */ import_ext_gadget2.default.createElement(ScrollButton, {
additionalClassName: CLASS_NAME_DOWN,
alt: TO_BOTTOM,
ariaLabel: TO_BOTTOM,
onClick: () => {
var _$$height, _$$height2;
(0, import_ext_gadget3.scrollTop)(((_$$height = $(document).height()) !== null && _$$height !== void 0 ? _$$height : 0) - ((_$$height2 = $(window).height()) !== null && _$$height2 !== void 0 ? _$$height2 : 0));
},
onMouseEnter: onMouseEnterMouseLeave,
onMouseLeave: onMouseEnterMouseLeave
});
var ScrollUpButton = (onMouseEnterMouseLeave) => /* @__PURE__ */ import_ext_gadget2.default.createElement(ScrollButton, {
additionalClassName: CLASS_NAME_UP,
alt: TO_TOP,
ariaLabel: TO_TOP,
onClick: () => {
(0, import_ext_gadget3.scrollTop)(0);
},
onMouseEnter: onMouseEnterMouseLeave,
onMouseLeave: onMouseEnterMouseLeave
});
//! src/ScrollUpButton/modules/insertElementAndListener.ts
var import_ext_gadget4 = require("ext.gadget.Util");
var import_ext_gadget5 = require("ext.gadget.Tippy");
var insertElementandListener = ($body) => {
const onMouseEnterMouseLeave = (event) => {
(0, import_ext_gadget4.changeOpacityWhenMouseEnterOrLeave)(event);
};
const scrollDownButton = ScrollDownButton(onMouseEnterMouseLeave);
const scrollUpButton2 = ScrollUpButton(onMouseEnterMouseLeave);
for (var _i = 0, _arr = [scrollDownButton, scrollUpButton2]; _i < _arr.length; _i++) {
const element = _arr[_i];
$body.append(element);
(0, import_ext_gadget5.tippy)(element, {
arrow: true,
content: element.getAttribute("alt"),
placement: "left"
});
}
const scrollListener = () => {
let downButtonButtom;
let upButtonButtom;
if (document.querySelector("#proveit") || document.querySelector(".gadget-cat_a_lot-container") || document.querySelector("#gadget-word_count-tip")) {
downButtonButtom = "85px";
upButtonButtom = "127px";
} else {
setLeft()downButtonButtom = "45px";
upButtonButtom = "85px";
}
scrollDownButton.style.bottom = downButtonButtom;
}
scrollUpButton2.style.bottom = upButtonButtom;
};
const scrollListenerWithThrottle = mw.util.throttle(scrollListener, 200);
$(window).on("scroll selectionchange", scrollListenerWithThrottle);
};
//! src/ScrollUpButton/ScrollUpButton.ts
void (0, import_ext_gadget6.getBody)().then(function scrollUpButton($body) {
insertElementandListener($body);
});
 
})();
var ticking = false;
$window.on('scroll', function () {
if (!ticking) {
requestAnimationFrame(function () {
onScroll();
ticking = false;
});
ticking = true;
}
});
 
/* </nowiki> */
onScroll();
});