当前位置:  开发笔记 > 编程语言 > 正文

为什么IE7没有正确地将<pre> <code>块复制到剪贴板?

如何解决《为什么IE7没有正确地将<pre><code>块复制到剪贴板?》经验,为你挑选了2个好方法。

我们注意到IE7有一个奇怪的行为,在Stack Overflow上发布了代码块.例如,这个小代码块:

public PageSizer(string href, int index)
{
    HRef = href;
    PageIndex = index;
}

从IE7复制并粘贴,最终结果如下:

public PageSizer(string href, int index){    HRef = href;    PageIndex = index;    }

不完全是我们想到的..基础HTML源实际上看起来很好; 如果您查看源代码,您会看到:

public PageSizer(string href, int index)
{
    HRef = href;
    PageIndex = index;
}

那么我们做错了什么?为什么IE7不能以合理的方式复制和粘贴这个HTML?

更新:这特别与

 通过JavaScript在运行时修改的块有关.本机HTML确实可以正确呈现和复制; 它是该HTML的JavaScript修改版本,其行为不符合预期.请注意,复制和粘贴到写字板或Word中是有效的,因为IE与富文本剪贴板中的不同内容相比,记事本从中获取其数据.

Andrew Johns.. 35

似乎这是IE6的已知错误,而prettify.js有一个解决方法.具体来说,它用'\ r \n'替换BR标签.

通过修改检查允许IE6或7然后剪切和粘贴将IE7正常工作,但它会与一个渲染换行符后跟一个空格.通过检查IE7并仅提供'\ r'而不是'\ r \n',它将继续剪切和粘贴并正确渲染.

将此代码添加到prettify.js:

function _pr_isIE7() {
  var isIE7 = navigator && navigator.userAgent &&
       /\bMSIE 7\./.test(navigator.userAgent);
  _pr_isIE7 = function () { return isIE7; };
  return isIE7;
}

然后修改prettyPrint函数,如下所示:

   function prettyPrint(opt_whenDone) {
     var isIE6 = _pr_isIE6();
+    var isIE7 = _pr_isIE7();

...

-        if (isIE6 && cs.tagName === 'PRE') {
+        if ((isIE6 || isIE7) && cs.tagName === 'PRE') {
          var lineBreaks = cs.getElementsByTagName('br');
+         var newline;
+         if (isIE6) {
+           newline = '\r\n';
+         } else {
+           newline = '\r';
+         }
          for (var j = lineBreaks.length; --j >= 0;) {
            var lineBreak = lineBreaks[j];
            lineBreak.parentNode.replaceChild(
-               document.createTextNode('\r\n'), lineBreak);
+               document.createTextNode(newline), lineBreak);
          }

你可以在这里看到一个有效的例子.

注意:我还没有在IE6中测试过原来的解决方法,所以我猜它是在没有IE7中看到的'\n'引起的空间的情况下渲染的,否则修复就更简单了.



1> Andrew Johns..:

似乎这是IE6的已知错误,而prettify.js有一个解决方法.具体来说,它用'\ r \n'替换BR标签.

通过修改检查允许IE6或7然后剪切和粘贴将IE7正常工作,但它会与一个渲染换行符后跟一个空格.通过检查IE7并仅提供'\ r'而不是'\ r \n',它将继续剪切和粘贴并正确渲染.

将此代码添加到prettify.js:

function _pr_isIE7() {
  var isIE7 = navigator && navigator.userAgent &&
       /\bMSIE 7\./.test(navigator.userAgent);
  _pr_isIE7 = function () { return isIE7; };
  return isIE7;
}

然后修改prettyPrint函数,如下所示:

   function prettyPrint(opt_whenDone) {
     var isIE6 = _pr_isIE6();
+    var isIE7 = _pr_isIE7();

...

-        if (isIE6 && cs.tagName === 'PRE') {
+        if ((isIE6 || isIE7) && cs.tagName === 'PRE') {
          var lineBreaks = cs.getElementsByTagName('br');
+         var newline;
+         if (isIE6) {
+           newline = '\r\n';
+         } else {
+           newline = '\r';
+         }
          for (var j = lineBreaks.length; --j >= 0;) {
            var lineBreak = lineBreaks[j];
            lineBreak.parentNode.replaceChild(
-               document.createTextNode('\r\n'), lineBreak);
+               document.createTextNode(newline), lineBreak);
          }

你可以在这里看到一个有效的例子.

注意:我还没有在IE6中测试过原来的解决方法,所以我猜它是在没有IE7中看到的'\n'引起的空间的情况下渲染的,否则修复就更简单了.


我注意到你还没有修复生产.让我知道当你绕过它时测试是如何进行的.
非常感谢你的修复.这是在美化的第89版实施的.请在http://code.google.com/p/google-code-prettify/issues/detail?id=71上​​报告更多问题

2> AaronSieb..:

这是问题所在:

您的代码着色脚本使用
标记替换换行符.在复制/粘贴时,IE7显然没有将
标记转换为与屏幕一样的换行符.

换句话说,您的代码变为:

public PageSizer(string href, int index)
{
HRef = href;
PageIndex = index;
}

但是你希望它变成这样:

public PageSizer(string href, int index)
{
HRef = href;
PageIndex = index;
}

在Google Code上的最新版本的prettify.js中,负责的行是1001行(recombineTagsAndDecorations的一部分):

html.push(htmlChunk.replace(newlineRe, '
'));

编辑,根据评论:
对于IE7,这可能是该行应该改为:

html.push(htmlChunk.replace(newlineRe, '\n'));

(假设newlineRe是占位符).

此修复程序也适用于Chrome和FFX3 ......我不确定哪些(如果有的话)浏览器需要
标记.

更新: 我的第二个响应中的更多信息:
为什么IE7没有正确地将

 块复制到剪贴板?

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有