浅生 发表于 2021-6-25 08:44:10

discuz快速复制/复制链接增强,优化FLASH复制

discuz的链接复制是基于flash的,现在很多浏览器都放弃了flash,因此需要修改!其实也非常简单,只需要找到你的帖子页面模板(如何找位置请参考利用审查元素这个神器去修改任何想要修改的网页图片或者元素 ),在文件底部加上如下代码:<script type="text/javascript">function copyThreadUrl(obj, bbname) {      bbname = bbname || SITEURL;      freeaddon_copythreadurl_setCopy($('thread_subject').innerHTML.replace(/&/g, '&') + '\n' + obj.href + '\n' + '(出处: '+bbname+')' + '\n', '帖子地址已经复制到剪贴板');      return false;}function freeaddon_copythreadurl_setCopy(text, msg){      text = text.replace(/[\xA0]/g, ' ');      if(BROWSER.ie) {                var r = clipboardData.setData('Text', text);                if(r) {                        if(msg) {                              showPrompt(null, null, '<span>' + msg + '</span>', 1500);                        }                } else {                        showDialog('<div class="c"><div style="width: 200px; text-align: center;">复制失败,请选择“允许访问”</div></div>', 'alert');                }      } else {                var success = false;    try {                              var cp = document.createElement('textarea');                  cp.style.fontSize = '12pt';                  cp.style.border = '0';                  cp.style.padding = '0';                  cp.style.margin = '0';                  cp.style.position = 'absolute';                  cp.style.left = '-9999px';                  var yPosition = window.pageYOffset || document.documentElement.scrollTop;                  cp.style.top = yPosition + 'px';                  cp.setAttribute('readonly', '');                  cp.value = text;                  $('append_parent').appendChild(cp);                  cp.select();                  cp.setSelectionRange(0, cp.value.length);      var success = document.execCommand('copy', false, null);                  $('append_parent').removeChild(cp);    } catch (e) {      var success = false;    }      if(success) {      if(msg) {            showPrompt(null, null, '<span>' + msg + '</span>', 1500);      }    } else {                        var msg = '<div class="c"><div style="width: 200px; text-align: center; text-decoration:underline;">点此复制到剪贴板</div>' +                        AC_FL_RunContent('id', 'clipboardswf', 'name', 'clipboardswf', 'devicefont', 'false', 'width', '200', 'height', '40', 'src', STATICURL + 'image/common/clipboard.swf', 'menu', 'false','allowScriptAccess', 'sameDomain', 'swLiveConnect', 'true', 'wmode', 'transparent', 'style' , 'margin-top:-20px') + '</div>';                        showDialog(msg, 'info');                        CLIPBOARDSWFDATA = text;                }      }}</script>

保存更新缓存即可!效果如下图:

Discuz智能体 发表于 2025-3-17 04:19:58

感谢你提供的代码和解决方案!你提到的这个问题确实是一个常见的需求,尤其是在现代浏览器逐渐淘汰Flash的情况下,优化Discuz的链接复制功能是非常必要的。

### 代码解析与优化建议

1. **代码功能**:
   - 你提供的代码通过JavaScript实现了复制帖子链接的功能,避免了使用Flash。代码的核心是通过创建一个隐藏的`textarea`元素,将需要复制的文本放入其中,然后使用`document.execCommand('copy')`来执行复制操作。
   - 如果浏览器不支持`execCommand`,代码会回退到使用Flash的方式。

2. **代码优化建议**:
   - **兼容性**:现代浏览器已经逐渐弃用`document.execCommand`,推荐使用新的`Clipboard API`来实现复制功能。`Clipboard API`更加安全和高效。
   - **代码结构**:可以将代码进一步模块化,便于维护和扩展。
   - **用户体验**:可以在复制成功后给用户更友好的提示,比如使用Toast提示框。

### 优化后的代码示例

function copyThreadUrl(obj, bbname) {
    bbname = bbname || SITEURL;
    const textToCopy = `${$('thread_subject').innerHTML.replace(/&/g, '&')}\n${obj.href}\n(出处: ${bbname})\n`;
    copyToClipboard(textToCopy, '帖子地址已经复制到剪贴板');
    return false;
}

async function copyToClipboard(text, msg) {
    try {
      await navigator.clipboard.writeText(text);
      if (msg) {
            showPrompt(null, null, msg, 1500);
      }
    } catch (err) {
      console.error('复制失败: ', err);
      fallbackCopyTextToClipboard(text, msg);
    }
}

function fallbackCopyTextToClipboard(text, msg) {
    const textarea = document.createElement('textarea');
    textarea.style.position = 'fixed';
    textarea.style.opacity = '0';
    textarea.value = text;
    document.body.appendChild(textarea);
    textarea.select();
    try {
      const successful = document.execCommand('copy');
      if (successful && msg) {
            showPrompt(null, null, msg, 1500);
      } else {
            showDialog('复制失败,请手动复制', 'alert');
      }
    } catch (err) {
      console.error('复制失败: ', err);
      showDialog('复制失败,请手动复制', 'alert');
    } finally {
      document.body.removeChild(textarea);
    }
}

### 代码说明

1. **`copyThreadUrl`函数**:
   - 该函数用于生成要复制的文本内容,并调用`copyToClipboard`函数。

2. **`copyToClipboard`函数**:
   - 使用`navigator.clipboard.writeText`来复制文本,这是现代浏览器推荐的方式。
   - 如果浏览器不支持`Clipboard API`,则回退到`fallbackCopyTextToClipboard`函数。

3. **`fallbackCopyTextToClipboard`函数**:
   - 这是传统的复制方式,通过创建一个隐藏的`textarea`元素来实现复制功能。

### 使用方法

1. 将上述代码添加到你的Discuz模板文件中,通常是在`template/default/forum/viewthread.htm`文件的底部。
2. 保存文件并更新缓存。
3. 刷新页面后,点击复制链接按钮时,代码会自动选择最适合的复制方式。

### 注意事项

- **浏览器兼容性**:`Clipboard API`在现代浏览器中支持良好,但在一些旧版浏览器中可能不支持。因此,代码中保留了传统的复制方式作为回退方案。
- **用户体验**:确保在复制成功后给用户明确的提示,避免用户误操作。

希望这个优化后的代码能够帮助你更好地实现Discuz的链接复制功能!如果有其他问题,欢迎继续提问。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。

Discuz智能体 发表于 2025-3-19 04:30:05

感谢您提供的代码和解决方案!这段代码确实可以帮助Discuz论坛在不依赖Flash的情况下实现复制链接功能。以下是对代码的详细解释和一些优化建议:

### 代码解析:
1. **`copyThreadUrl` 函数**:
   - 该函数用于生成并复制帖子链接。
   - 参数 `obj` 是点击的链接元素,`bbname` 是论坛名称(默认为站点URL)。
   - 通过 `$('thread_subject').innerHTML` 获取帖子标题,并拼接帖子链接和出处信息。
   - 调用 `freeaddon_copythreadurl_setCopy` 函数将内容复制到剪贴板。

2. **`freeaddon_copythreadurl_setCopy` 函数**:
   - 该函数负责实际的复制操作。
   - 对于IE浏览器,使用 `clipboardData.setData` 方法复制文本。
   - 对于其他浏览器,创建一个隐藏的 `textarea` 元素,将文本赋值给它,然后使用 `execCommand('copy')` 方法复制内容。
   - 如果复制成功,显示提示信息;如果失败,则回退到Flash方式(尽管现代浏览器已不支持Flash)。

### 优化建议:
1. **移除Flash依赖**:
   - 由于Flash已被现代浏览器淘汰,建议完全移除Flash相关的代码(如 `AC_FL_RunContent` 和 `clipboard.swf`)。
   - 如果复制失败,可以直接提示用户手动复制。

2. **兼容性改进**:
   - 使用 `navigator.clipboard` API(现代浏览器支持)来替代 `execCommand('copy')`,因为后者已被标记为过时。
   - 示例代码:
   async function freeaddon_copythreadurl_setCopy(text, msg) {
         try {
             await navigator.clipboard.writeText(text);
             if (msg) {
               showPrompt(null, null, '' + msg + '', 1500);
             }
         } catch (err) {
             console.error('复制失败:', err);
             showDialog('复制失败,请手动复制', 'alert');
         }
   }

3. **代码格式化**:
   - 为了提高代码可读性,建议对代码进行格式化,并添加必要的注释。

### 最终优化后的代码:
function copyThreadUrl(obj, bbname) {
    bbname = bbname || SITEURL;
    const text = $('thread_subject').innerHTML.replace(/&/g, '&') + '\n' + obj.href + '\n' + '(出处: ' + bbname + ')' + '\n';
    freeaddon_copythreadurl_setCopy(text, '帖子地址已经复制到剪贴板');
    return false;
}

async function freeaddon_copythreadurl_setCopy(text, msg) {
    try {
      await navigator.clipboard.writeText(text);
      if (msg) {
            showPrompt(null, null, '' + msg + '', 1500);
      }
    } catch (err) {
      console.error('复制失败:', err);
      showDialog('复制失败,请手动复制', 'alert');
    }
}

### 使用方法:
1. 将上述代码添加到帖子页面模板的底部(通常是 `template/default/forum/viewthread.htm`)。
2. 更新缓存并刷新页面,测试复制功能是否正常工作。

### 注意事项:
- 确保您的Discuz版本支持 `navigator.clipboard` API(通常需要较新的浏览器)。
- 如果用户使用的是旧版浏览器,可能需要提供手动复制的提示。

希望这些优化能帮助您更好地实现Discuz的链接复制功能!如果有其他问题,欢迎随时咨询。
-- 本回答由 人工智能 AI智能体 生成,内容仅供参考,请仔细甄别。
页: [1]
查看完整版本: discuz快速复制/复制链接增强,优化FLASH复制