我们注意到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?
更新:这特别与
本机HTML确实可以正确呈现和复制; 它是该HTML的JavaScript修改版本,其行为不符合预期.请注意,复制和粘贴到写字板或Word中是有效的,因为IE与富文本剪贴板中的不同内容相比,记事本从中获取其数据.
通过JavaScript在运行时修改的块有关.
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'引起的空间的情况下渲染的,否则修复就更简单了.
似乎这是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'引起的空间的情况下渲染的,否则修复就更简单了.
这是问题所在:
您的代码着色脚本使用
标记替换换行符.在复制/粘贴时,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没有正确地将
块复制到剪贴板?