给pre标签写了一个“复制代码”的功能,但是复制的代码好多空格?

作者站长头像
站长
· 阅读数 3

原理是把内容放进<textarea>里然后复制出来,但问题是放进textarea里会把pre中的格式转成很多空格,这个怎么处理下但又不影响之前的格式。给pre标签写了一个“复制代码”的功能,但是复制的代码好多空格?给pre标签写了一个“复制代码”的功能,但是复制的代码好多空格?

jQuery( document).ready(function($){
    var copyid = 0;
    $('pre').each(function(){
        copyid++;
        $(this).attr( 'data-copyid', copyid).wrap( '<div class="pre-wrapper"/>');
        $(this).parent().css( 'margin', $(this).css( 'margin') );
        $('<button class="copy-snippet">复制代码</button>').insertAfter( $(this) ).data( 'copytarget',copyid );
    });

    $('body').on( 'click', '.copy-snippet', function(ev){
        ev.preventDefault();

        var $copyButton = $(this);

        $pre = $(document).find('pre[data-copyid=' + $copyButton.data('copytarget' ) + ']');
        if ( $pre.length ) {
            var textArea = document.createElement("textarea");

            // Place in top-left corner of screen regardless of scroll position.
            textArea.style.position = 'fixed';
            textArea.style.top = 0;
            textArea.style.left = 0;

            // Ensure it has a small width and height. Setting to 1px / 1em
            // doesn't work as this gives a negative w/h on some browsers.
            textArea.style.width = '2em';
            textArea.style.height = '2em';

            // We don't need padding, reducing the size if it does flash render.
            textArea.style.padding = 0;

            // Clean up any borders.
            textArea.style.border = 'none';
            textArea.style.outline = 'none';
            textArea.style.boxShadow = 'none';
            textArea.style.width='1px'
            textArea.style.height='1px'

            // Avoid flash of white box if rendered for any reason.
            //textArea.style.background = 'transparent';
            textArea.style.display='block'

            //Set value to text to be copied
            textArea.value = $pre.html();

            document.body.appendChild(textArea);
            textArea.select();

            try {
                document.execCommand('copy');
                $copyButton.text( '已经复制').prop('disabled', true);;
            } catch (err) {
                $copyButton.text( 'FAILED: Could not copy').prop('disabled', true);;
            }
            setTimeout(function(){
                $copyButton.text( '复制代码').prop('disabled', false);;
            }, 3000);
        }
    });
});
回复
1个回答
avatar
test
2024-06-29

$pre.html() 获取的是 html 内容,应该使用 text方法获取文本内容。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容