aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwxiaoguang <wxiaoguang@gmail.com>2024-02-25 12:17:11 +0800
committerGitHub <noreply@github.com>2024-02-25 04:17:11 +0000
commit736c98be5c2bed26cef9f7f679c49a95af8161ef (patch)
treec795193352e0676a52d319508817702f82ee1105
parentb616f666b89f57f3c285b70c11693f50ba38bcaa (diff)
downloadgitea-736c98be5c2bed26cef9f7f679c49a95af8161ef.tar.gz
gitea-736c98be5c2bed26cef9f7f679c49a95af8161ef.zip
Refactor `copy` button event handler (#29379)
Use "closest" instead of "for-loop"
-rw-r--r--web_src/js/features/clipboard.js41
1 files changed, 17 insertions, 24 deletions
diff --git a/web_src/js/features/clipboard.js b/web_src/js/features/clipboard.js
index 224628658e..8be5505c8b 100644
--- a/web_src/js/features/clipboard.js
+++ b/web_src/js/features/clipboard.js
@@ -5,37 +5,30 @@ import {clippie} from 'clippie';
const {copy_success, copy_error} = window.config.i18n;
// Enable clipboard copy from HTML attributes. These properties are supported:
-// - data-clipboard-text: Direct text to copy, has highest precedence
+// - data-clipboard-text: Direct text to copy
// - data-clipboard-target: Holds a selector for a <input> or <textarea> whose content is copied
// - data-clipboard-text-type: When set to 'url' will convert relative to absolute urls
export function initGlobalCopyToClipboardListener() {
- document.addEventListener('click', (e) => {
- let target = e.target;
- // In case <button data-clipboard-text><svg></button>, so we just search
- // up to 3 levels for performance
- for (let i = 0; i < 3 && target; i++) {
- let text = target.getAttribute('data-clipboard-text');
+ document.addEventListener('click', async (e) => {
+ const target = e.target.closest('[data-clipboard-text], [data-clipboard-target]');
+ if (!target) return;
- if (!text && target.getAttribute('data-clipboard-target')) {
- text = document.querySelector(target.getAttribute('data-clipboard-target'))?.value;
- }
+ e.preventDefault();
- if (text && target.getAttribute('data-clipboard-text-type') === 'url') {
- text = toAbsoluteUrl(text);
- }
-
- if (text) {
- e.preventDefault();
-
- (async() => {
- const success = await clippie(text);
- showTemporaryTooltip(target, success ? copy_success : copy_error);
- })();
+ let text;
+ if (target.hasAttribute('data-clipboard-text')) {
+ text = target.getAttribute('data-clipboard-text');
+ } else {
+ text = document.querySelector(target.getAttribute('data-clipboard-target'))?.value;
+ }
- break;
- }
+ if (text && target.getAttribute('data-clipboard-text-type') === 'url') {
+ text = toAbsoluteUrl(text);
+ }
- target = target.parentElement;
+ if (text) {
+ const success = await clippie(text);
+ showTemporaryTooltip(target, success ? copy_success : copy_error);
}
});
}