为什么不IE7副本 blocks to the clipboard correctly?(Why

2019-08-03 09:23发布

我们注意到,IE7有张贴在堆栈溢出代码块奇数behavor。 例如,这个小的代码块:

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

复制并粘贴到IE7,最终是这样的:

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

不正是我们在脑海里,底层的HTML源其实看起来不错; 如果您查看源代码,你会看到这一点:

<pre><code>public PageSizer(string href, int index)
{
    HRef = href;
    PageIndex = index;
}
</code></pre>

那么,我们做错了什么? 为什么不能IE7复制并以理性的方式粘贴HTML?

更新: 这个具体有做<pre> <code>正在运行时通过JavaScript修改的块。 本机的HTML渲染不正确复印件; 它是HTML预期不行为的JavaScript的修改版本。 请注意,复制和粘贴到写字板或Word的作品,因为IE是相对于纯文本剪贴板是记事本,从获取数据放入不同内容的富文本剪贴板。

Answer 1:

看来,这是一个已知的bug对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”的空间,否则,修复更简单。



Answer 2:

这里的问题:

您的代码着色脚本替换换行符与<br />标记。 当复制/粘贴,IE7显然不会在<br />标签像它的屏幕转换成一个换行符。

换句话说,你的代码变得这样的:

public PageSizer(string href, int index)<br />{<br />    HRef = href;<br />    PageIndex = index;<br />    }

但是,你想让它变成这样:


public PageSizer(string href, int index)<br />
{<br />
    HRef = href;<br />
    PageIndex = index;<br />
}<br />

在谷歌代码prettify.js的最新版本,负责该线是线1001(recombineTagsAndDecorations的一部分):


html.push(htmlChunk.replace(newlineRe, '<br />'));

编辑的基础上,评论:
对于IE7,这是该行可能应改为:


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

(假设newlineRe是一个占位符)。

此修复程序在Chrome还持有了,FFX3 ......我不知道它(如果有的话)的浏览器需要<br />标记。

更新:在我的第二个响应的详细信息:
为什么不IE7复制<前> <代码>块正确剪贴板?



Answer 3:

这看起来像在IE浏览器中的错误,PRE代码BR标签没有被转换成纯文本复制缓冲区换行。 丰富的文本复制缓冲区是好的,所以粘贴按预期工作像写字板应用。

在美化脚本,即颜色代码,删除所有的空格和与空间和新线路的HTML标签替换它。 生成的代码看起来是这样的:

<pre><code>code<br/>&nbsp;&nbsp;code<br/>&nbsp;&nbsp;code<br/>code</code></pre>

代码标记通过与{:前期空白}的CSS样式默认渲染。 在这种情况下,IE未能打开BR标签成新行。 它会在你原来的HTML工作,因为IE将成功地把实际换行到新行。

为了解决这个问题,你有3种选择。 (我假设你想要很好的HTML, 有和没有在客户端上启动Javascript以及工作能力):

  1. 你可以将代码放在一个正常的股利和使用CSS里面使用,以使其{空白:前}。 这是一个简单的解决方案,虽然可能不讨好的HTML标记纯粹。

  2. 你可以有适当的使用PRE / 代码标记,另一个在一个正常的div代码的两个副本,一个。 在你的CSS隐藏正常的股利。 使用JavaScript你美化正常的股利和隐藏的前/代码版本。

  3. 修改美化脚本承认,它是作用在PRE代码元素,并不能取代在该事件的空白。


笔记:

  • 最重要的是不来源中的HTML,但那是美化脚本后生成的HTML已经跑就可以了。

  • 此错误仍然存在,即使PRE的白色空间模式更改为正常使用CSS。



Answer 4:

此网站已解决的问题: http://www.developerfusion.com/tools/convert/csharp-to-vb/

我建议“复制到剪贴板”按钮的代码显示框的一部分。 此按钮将复制的信息显示为纯文本版本。 纯文本可以存储为一个内部页面属性。



Answer 5:

坏消息:所有提议修复工作。 修改左右线1000 prettify.js

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

这将导致双间距在其他浏览器, 仍然没有解决IE7复制到记事本的问题! 所以,即使我选择IE7发现,这个“修复”不能解决任何事情。

我想也许它只是在IE7中有使用JavaScript重建做了错误<pre>元素-无论有多少\ n换行符我摆在那里,没有什么变化W / R / T到粘贴到记事本的行为。



Answer 6:

@Jeff阿特伍德这是正确的想法,但实现仍然需要工作。 我想我的空气的代码只是不剪:)

我怀疑我前面提到的修复不起作用,因为美化正在做行后的文本〜1000被称为一些额外的处理。

试图跟踪时,它添加到页面向后内容,我碰到周围行1227此评论:


// Replace <br>s with line-feeds so that copying and pasting works
// on IE 6.
// Doing this on other browsers breaks lots of stuff since \r\n is
// treated as two newlines on Firefox, and doing this also slows
// down rendering.

当我把isIE6条件掉的代码,它主要是在IE7的工作(有在顶部和底部的一个额外的换行符),和Firefox 3 ...但我认为它会导致问题与旧版本的FFX 。

最起码,似乎IE7将需要的,而不是仅仅的\ n \ r \ n。 搞清楚到底是什么将工作与浏览器将采取更广泛的测试设置比我目前所面对的得心应手。

总之,对于插入的IE7 \ r \ n似乎基本上需要做些什么。 我会继续关注着美化,看看我是否能进一步缩小它。

更新:IE7出现剥离换行符(\ R或\ n)的从分配给一个文字属性字符串。 它看起来像他们需要被加回,周围线1227。

正确的解决方案可能意味着插入一个占位符标记周围线1000后,将取代它周围行1227。



Answer 7:

取出内<code> 。 IE浏览器的复制/粘贴的行为可以看出,作为一个内联标记和忘记可见空白。



文章来源: Why doesn't IE7 copy
 blocks to the clipboard correctly?