<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://test.zybkcn.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-ConfirmLogout.js</id>
	<title>MediaWiki:Gadget-ConfirmLogout.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://test.zybkcn.com/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-ConfirmLogout.js"/>
	<link rel="alternate" type="text/html" href="https://test.zybkcn.com/w/index.php?title=MediaWiki:Gadget-ConfirmLogout.js&amp;action=history"/>
	<updated>2026-07-18T06:17:03Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://test.zybkcn.com/w/index.php?title=MediaWiki:Gadget-ConfirmLogout.js&amp;diff=252&amp;oldid=prev</id>
		<title>鹿野耕云：​创建页面，内容为“/**  * SPDX-License-Identifier: GPL-3.0-or-later  * _addText: &#039;{{Gadget Header|license=GPL-3.0-or-later}}&#039;  *  * @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/ConfirmLogout}  * @author 安忆 &lt;i@anyi.in&gt;  * @license GPL-3.0-or-later {@link https://www.qiuwenbaike.cn/wiki/H:GPL-3.0}  */  /**  * Copyright (C)  安忆  *  * This program is free software: you can redistribute it and/or modify  * it under the terms of th…”</title>
		<link rel="alternate" type="text/html" href="https://test.zybkcn.com/w/index.php?title=MediaWiki:Gadget-ConfirmLogout.js&amp;diff=252&amp;oldid=prev"/>
		<updated>2026-06-14T03:47:06Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&lt;span class=&quot;autocomment&quot;&gt;*  * SPDX-License-Identifier: GPL-3.0-or-later  * _addText: &amp;#039;{{Gadget Header|license=GPL-3.0-or-later}}&amp;#039;  *  * @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/ConfirmLogout}  * @author 安忆 &amp;lt;i@anyi.in&amp;gt;  * @license GPL-3.0-or-later {@link https://www.qiuwenbaike.cn/wiki/H:GPL-3.0}：​&lt;/span&gt;  /**  * Copyright (C)  安忆  *  * This program is free software: you can redistribute it and/or modify  * it under the terms of th…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/**&lt;br /&gt;
 * SPDX-License-Identifier: GPL-3.0-or-later&lt;br /&gt;
 * _addText: &amp;#039;{{Gadget Header|license=GPL-3.0-or-later}}&amp;#039;&lt;br /&gt;
 *&lt;br /&gt;
 * @source {@link https://git.qiuwen.net.cn/InterfaceAdmin/QiuwenGadgets/src/branch/master/src/ConfirmLogout}&lt;br /&gt;
 * @author 安忆 &amp;lt;i@anyi.in&amp;gt;&lt;br /&gt;
 * @license GPL-3.0-or-later {@link https://www.qiuwenbaike.cn/wiki/H:GPL-3.0}&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Copyright (C)  安忆&lt;br /&gt;
 *&lt;br /&gt;
 * This program is free software: you can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License as published by&lt;br /&gt;
 * the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
 * (at your option) any later version.&lt;br /&gt;
 *&lt;br /&gt;
 * This program is distributed in the hope that it will be useful,&lt;br /&gt;
 * but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 * GNU General Public License for more details.&lt;br /&gt;
 *&lt;br /&gt;
 * You should have received a copy of the GNU General Public License&lt;br /&gt;
 * along with this program.  If not, see &amp;lt;https://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
 */&lt;br /&gt;
/**&lt;br /&gt;
 * +------------------------------------------------------------+&lt;br /&gt;
 * |            === WARNING: GLOBAL GADGET FILE ===             |&lt;br /&gt;
 * +------------------------------------------------------------+&lt;br /&gt;
 * |       All changes should be made in the repository,        |&lt;br /&gt;
 * |                otherwise they will be lost.                |&lt;br /&gt;
 * +------------------------------------------------------------+&lt;br /&gt;
 * |        Changes to this page may affect many users.         |&lt;br /&gt;
 * | Please discuss changes by opening an issue before editing. |&lt;br /&gt;
 * +------------------------------------------------------------+&lt;br /&gt;
 */&lt;br /&gt;
/* &amp;lt;nowiki&amp;gt; */&lt;br /&gt;
&lt;br /&gt;
(() =&amp;gt; {&lt;br /&gt;
&lt;br /&gt;
&amp;quot;use strict&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
// dist/ConfirmLogout/ConfirmLogout.js&lt;br /&gt;
//! src/ConfirmLogout/options.json&lt;br /&gt;
function asyncGeneratorStep(n, t, e, r, o, a, c) {&lt;br /&gt;
  try {&lt;br /&gt;
    var i = n[a](c), u = i.value;&lt;br /&gt;
  } catch (n2) {&lt;br /&gt;
    return void e(n2);&lt;br /&gt;
  }&lt;br /&gt;
  i.done ? t(u) : Promise.resolve(u).then(r, o);&lt;br /&gt;
}&lt;br /&gt;
function _asyncToGenerator(n) {&lt;br /&gt;
  return function() {&lt;br /&gt;
    var t = this, e = arguments;&lt;br /&gt;
    return new Promise(function(r, o) {&lt;br /&gt;
      var a = n.apply(t, e);&lt;br /&gt;
      function _next(n2) {&lt;br /&gt;
        asyncGeneratorStep(a, r, o, _next, _throw, &amp;quot;next&amp;quot;, n2);&lt;br /&gt;
      }&lt;br /&gt;
      function _throw(n2) {&lt;br /&gt;
        asyncGeneratorStep(a, r, o, _next, _throw, &amp;quot;throw&amp;quot;, n2);&lt;br /&gt;
      }&lt;br /&gt;
      _next(void 0);&lt;br /&gt;
    });&lt;br /&gt;
  };&lt;br /&gt;
}&lt;br /&gt;
var logoutElementSelector = &amp;#039;#ca-cb-logout&amp;gt;a,#topbar&amp;gt;a[href*=&amp;quot;UserLogout&amp;quot;],#pt-logout&amp;gt;a&amp;#039;;&lt;br /&gt;
var logoutElementSelectorOfVector2022StickyHeader = &amp;quot;#pt-logout-sticky-header&amp;gt;a&amp;quot;;&lt;br /&gt;
var version = &amp;quot;3.0&amp;quot;;&lt;br /&gt;
//! src/ConfirmLogout/modules/i18n.ts&lt;br /&gt;
var import_ext_gadget = require(&amp;quot;ext.gadget.i18n&amp;quot;);&lt;br /&gt;
var getI18nMessages = () =&amp;gt; {&lt;br /&gt;
  return {&lt;br /&gt;
    &amp;quot;Network error&amp;quot;: (0, import_ext_gadget.localize)({&lt;br /&gt;
      en: &amp;quot;Network error&amp;quot;,&lt;br /&gt;
      ja: &amp;quot;ネットワークエラー&amp;quot;,&lt;br /&gt;
      &amp;quot;zh-hans&amp;quot;: &amp;quot;网络异常&amp;quot;,&lt;br /&gt;
      &amp;quot;zh-hant&amp;quot;: &amp;quot;網路異常&amp;quot;&lt;br /&gt;
    }),&lt;br /&gt;
    Confirm: (0, import_ext_gadget.localize)({&lt;br /&gt;
      en: &amp;quot;Confirm logout?&amp;quot;,&lt;br /&gt;
      ja: &amp;quot;ログアウトしますか？&amp;quot;,&lt;br /&gt;
      &amp;quot;zh-hans&amp;quot;: &amp;quot;您确定要退出吗？&amp;quot;,&lt;br /&gt;
      &amp;quot;zh-hant&amp;quot;: &amp;quot;您確定要登出嗎？&amp;quot;&lt;br /&gt;
    }),&lt;br /&gt;
    Succeed: (0, import_ext_gadget.localize)({&lt;br /&gt;
      en: &amp;quot;Logout succeed. Refreshing...&amp;quot;,&lt;br /&gt;
      ja: &amp;quot;ログアウトに成功しました。再読み込みします...&amp;quot;,&lt;br /&gt;
      &amp;quot;zh-hans&amp;quot;: &amp;quot;退出成功，即将刷新页面……&amp;quot;,&lt;br /&gt;
      &amp;quot;zh-hant&amp;quot;: &amp;quot;登出成功，即將重新載入……&amp;quot;&lt;br /&gt;
    })&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
var i18nMessages = getI18nMessages();&lt;br /&gt;
var getMessage = (key) =&amp;gt; {&lt;br /&gt;
  return i18nMessages[key] || key;&lt;br /&gt;
};&lt;br /&gt;
//! src/ConfirmLogout/modules/addListener.ts&lt;br /&gt;
var import_ext_gadget6 = require(&amp;quot;ext.gadget.Util&amp;quot;);&lt;br /&gt;
//! src/ConfirmLogout/modules/util/refreshEventListener.ts&lt;br /&gt;
var import_ext_gadget2 = require(&amp;quot;ext.gadget.FilterAlteredClicks&amp;quot;);&lt;br /&gt;
var refreshEventListener = ($element, clickListener2) =&amp;gt; {&lt;br /&gt;
  const hoverListener = () =&amp;gt; {&lt;br /&gt;
    $element.off(&amp;quot;click&amp;quot;);&lt;br /&gt;
    $element.on(&amp;quot;click&amp;quot;, (0, import_ext_gadget2.filterAlteredClicks)(clickListener2));&lt;br /&gt;
  };&lt;br /&gt;
  const hoverListenerWithDebounce = mw.util.debounce(hoverListener, 200, true);&lt;br /&gt;
  $element.on(&amp;quot;mouseover touchstart&amp;quot;, {&lt;br /&gt;
    passive: true&lt;br /&gt;
  }, hoverListenerWithDebounce);&lt;br /&gt;
};&lt;br /&gt;
//! src/ConfirmLogout/modules/addListener.ts&lt;br /&gt;
var import_ext_gadget7 = require(&amp;quot;ext.gadget.Toastify&amp;quot;);&lt;br /&gt;
//! src/ConfirmLogout/modules/api.ts&lt;br /&gt;
var import_ext_gadget3 = require(&amp;quot;ext.gadget.Util&amp;quot;);&lt;br /&gt;
var api = (0, import_ext_gadget3.initMwApi)(&amp;quot;ConfirmLogout/&amp;quot;.concat(version));&lt;br /&gt;
//! src/ConfirmLogout/modules/util/logout.ts&lt;br /&gt;
var import_ext_gadget4 = require(&amp;quot;ext.gadget.Toastify&amp;quot;);&lt;br /&gt;
var logout = /* @__PURE__ */ (function() {&lt;br /&gt;
  var _ref = _asyncToGenerator(function* (toastifyInstance) {&lt;br /&gt;
    yield api.postWithEditToken({&lt;br /&gt;
      action: &amp;quot;logout&amp;quot;&lt;br /&gt;
    });&lt;br /&gt;
    toastifyInstance.hideToast();&lt;br /&gt;
    (0, import_ext_gadget4.toastify)({&lt;br /&gt;
      text: getMessage(&amp;quot;Succeed&amp;quot;)&lt;br /&gt;
    }, &amp;quot;success&amp;quot;);&lt;br /&gt;
    location.reload();&lt;br /&gt;
  });&lt;br /&gt;
  return function logout2(_x) {&lt;br /&gt;
    return _ref.apply(this, arguments);&lt;br /&gt;
  };&lt;br /&gt;
})();&lt;br /&gt;
//! src/ConfirmLogout/modules/util/showError.ts&lt;br /&gt;
var import_ext_gadget5 = require(&amp;quot;ext.gadget.Toastify&amp;quot;);&lt;br /&gt;
var showError = (error, toastifyInstance) =&amp;gt; {&lt;br /&gt;
  console.error(&amp;quot;[ConfirmLogout] Ajax error:&amp;quot;, error);&lt;br /&gt;
  toastifyInstance.hideToast();&lt;br /&gt;
  (0, import_ext_gadget5.toastify)({&lt;br /&gt;
    text: getMessage(&amp;quot;Network error&amp;quot;)&lt;br /&gt;
  }, &amp;quot;error&amp;quot;);&lt;br /&gt;
};&lt;br /&gt;
//! src/ConfirmLogout/modules/tryLogout.ts&lt;br /&gt;
var tryLogout = /* @__PURE__ */ (function() {&lt;br /&gt;
  var _ref2 = _asyncToGenerator(function* (toastifyInstance) {&lt;br /&gt;
    try {&lt;br /&gt;
      yield logout(toastifyInstance);&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      showError(error, toastifyInstance);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  return function tryLogout2(_x2) {&lt;br /&gt;
    return _ref2.apply(this, arguments);&lt;br /&gt;
  };&lt;br /&gt;
})();&lt;br /&gt;
//! src/ConfirmLogout/modules/addListener.ts&lt;br /&gt;
var {&lt;br /&gt;
  skin&lt;br /&gt;
} = mw.config.get();&lt;br /&gt;
var clickListener = /* @__PURE__ */ (function() {&lt;br /&gt;
  var _ref3 = _asyncToGenerator(function* (event) {&lt;br /&gt;
    event.preventDefault();&lt;br /&gt;
    const isConfirm = yield (0, import_ext_gadget6.oouiConfirmWithStyle)(getMessage(&amp;quot;Confirm&amp;quot;));&lt;br /&gt;
    if (!isConfirm) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    const toastifyInstance = (0, import_ext_gadget7.toastify)({&lt;br /&gt;
      text: mw.message(&amp;quot;logging-out-notify&amp;quot;).parse(),&lt;br /&gt;
      duration: -1&lt;br /&gt;
    }, &amp;quot;info&amp;quot;);&lt;br /&gt;
    void tryLogout(toastifyInstance);&lt;br /&gt;
  });&lt;br /&gt;
  return function clickListener2(_x3) {&lt;br /&gt;
    return _ref3.apply(this, arguments);&lt;br /&gt;
  };&lt;br /&gt;
})();&lt;br /&gt;
var addListener = ($element) =&amp;gt; {&lt;br /&gt;
  var _$body$get;&lt;br /&gt;
  refreshEventListener($element, (event) =&amp;gt; {&lt;br /&gt;
    void clickListener(event);&lt;br /&gt;
  });&lt;br /&gt;
  if (skin !== &amp;quot;vector-2022&amp;quot;) {&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  const $body = $element.parents(&amp;quot;body&amp;quot;);&lt;br /&gt;
  const observerCallback = (_mutations, observer) =&amp;gt; {&lt;br /&gt;
    if (!$body.hasClass(&amp;quot;vector-sticky-header-visible&amp;quot;)) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    const SELECTOR = logoutElementSelectorOfVector2022StickyHeader;&lt;br /&gt;
    const element = document.querySelector(SELECTOR);&lt;br /&gt;
    if (!element) {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
    const elementClone = element.cloneNode(true);&lt;br /&gt;
    element.replaceWith(elementClone);&lt;br /&gt;
    refreshEventListener($body.find(SELECTOR), (event) =&amp;gt; {&lt;br /&gt;
      void clickListener(event);&lt;br /&gt;
    });&lt;br /&gt;
    observer.disconnect();&lt;br /&gt;
  };&lt;br /&gt;
  const mutationObserver = new MutationObserver(observerCallback);&lt;br /&gt;
  mutationObserver.observe((_$body$get = $body.get(0)) !== null &amp;amp;&amp;amp; _$body$get !== void 0 ? _$body$get : document.documentElement, {&lt;br /&gt;
    attributes: true,&lt;br /&gt;
    attributeFilter: [&amp;quot;class&amp;quot;]&lt;br /&gt;
  });&lt;br /&gt;
};&lt;br /&gt;
//! src/ConfirmLogout/ConfirmLogout.ts&lt;br /&gt;
var import_ext_gadget8 = require(&amp;quot;ext.gadget.Util&amp;quot;);&lt;br /&gt;
var {&lt;br /&gt;
  wgUserName&lt;br /&gt;
} = mw.config.get();&lt;br /&gt;
void (0, import_ext_gadget8.getBody)().then(function confirmLogout($body) {&lt;br /&gt;
  if (!wgUserName) {&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  const $element = $body.find(logoutElementSelector);&lt;br /&gt;
  if (!$element.length) {&lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
  addListener($element);&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/* &amp;lt;/nowiki&amp;gt; */&lt;/div&gt;</summary>
		<author><name>鹿野耕云</name></author>
	</entry>
</feed>