Stackoverflow 添加复制按钮

Stackoverflow 添加复制按钮以复制原始码到剪贴簿。

  1. // ==UserScript==
  2.  
  3. // @name Stackoverflow Add Button For Copy to clipboard
  4. // @name:zh-TW Stackoverflow 增加複製按鈕
  5. // @name:zh-CN Stackoverflow 添加复制按钮
  6. // @name:ja Stackoverflow はコピーボタンを追加します
  7. // @namespace https://greasyfork.org/zh-TW/users/142344-jasn-hr
  8. // @description Stackoverflow add button for copy to clipboard.
  9. // @description:zh-TW Stackoverflow 增加複製按鈕以複製原始碼到剪貼簿。
  10. // @description:zh-CN Stackoverflow 添加复制按钮以复制原始码到剪贴簿。
  11. // @description:ja ソースコードをクリップボードにコピーするためのコピーボタンをStackoverflowに追加しました。
  12. // @copyright 2022, HrJasn (https://greasyfork.org/zh-TW/users/142344-jasn-hr)
  13. // @license GPL-3.0-or-later
  14. // @version 1.6
  15. // @icon https://www.google.com/s2/favicons?domain=stackoverflow.com
  16. // @match /^http[s]?://stackoverflow\.com/questions/[0-9]+/.*/
  17. // @grant none
  18. // ==/UserScript==
  19.  
  20. (() => {
  21. window.addEventListener('load',() => {
  22. const precodeObjs = document.querySelectorAll('pre code');
  23. const scrollbarChange = function(){
  24. let copyBtn = this.querySelector('input[value="Copy"]');
  25. copyBtn.style.right = (5-this.scrollLeft) + 'px';
  26. copyBtn.style.bottom = (5-this.scrollTop) + 'px';
  27. };
  28. precodeObjs.forEach(function(precodeObj){
  29. let copyBtn = document.createElement('input');
  30. copyBtn.type='button';
  31. copyBtn.value='Copy';
  32. copyBtn.style='cursor:pointer;opacity:0;position:absolute;right:5px;bottom:5px;font-size:15px;padding:10px;background-color:#888888;border:0px;border-style:solid;color: #ffffff;text-shadow: 0px 0px 2px #ffffff;border-radius:5px;';
  33. precodeObj.parentNode.style.position = 'relative';
  34. precodeObj.parentNode.appendChild(copyBtn);
  35. precodeObj.parentNode.addEventListener("wheel",scrollbarChange,false);
  36. precodeObj.parentNode.addEventListener("scroll",scrollbarChange,false);
  37. precodeObj.parentNode.addEventListener("keydown",scrollbarChange,false);
  38. copyBtn.addEventListener('click', function(){
  39. let targetObj = this.parentNode;
  40. let srcText = targetObj.textContent || targetObj.innerText || targetObj.nodeValue || '';
  41. navigator.clipboard.writeText(srcText);
  42. //let clipText = navigator.clipboard.readText();
  43. console.log(srcText);
  44. if(srcText !== undefined){
  45. this.value='Copied';
  46. };
  47. });
  48. copyBtn.addEventListener('mouseenter', function(){
  49. this.style.opacity = 1;
  50. });
  51. copyBtn.addEventListener('mouseleave', function(){
  52. this.style.opacity = 0;
  53. });
  54. });
  55. });
  56. })();