First we try, then we trust

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  183 随笔 :: 111 文章 :: 2983 评论 :: 339 引用

为了今后随笔中所带的代码更具特色一些,特给代码格式来个“Copy Code”功能,允许直接将代码内容拷贝到剪贴板上。

测试用程序:

程序1
using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Please Input Some Words:");
            string inputData = Console.ReadLine();
            Console.WriteLine(inputData);
            Console.Read();
        }
    }
}

测试用XML:

XML
<?xml version="1.0" encoding="gb2312"?>
<root >
    <!-- 这是一段注释 -->
    <elements >
        <name id="Component" >
            Zhenyulu
        </name>
        <url >
            http://www.cnblogs.com/zhenyulu
        </url>
    </elements>
</root>

感谢大家的帮助,我对CopyCode功能又改进了一番,终于可以在IE和FireFox下都可以拷贝代码到剪贴板上了。将文中用到的JavaScrip代码贴上来供大家参考:

程序
<script type="text/javascript">/*<![CDATA[*/
if(typeof(HTMLElement)!="undefined" && !window.opera)
{
  HTMLElement.prototype.__defineGetter__("parentElement", function () 
  {
    if (this.parentNode == this.ownerDocument) return null;
    return this.parentNode;
  });
}

HTMLElement.prototype.innerHTML getter = function(){
   return getInnerHTML(this);
}
/*]]>*/
</script>
<script language="javascript">
function CopyCode(key)
{
  var divElements = document.getElementsByTagName("div");
  var i;
  occur = 0;  
  for(i = 0; i < divElements.length; ++i)
  {
    if(key.parentElement.parentElement.parentElement == divElements[i].parentElement)
    {
      if(occur == 1)
      {
        if(navigator.appName.indexOf('Microsoft') != -1)
          copyToClipboard(divElements[i].innerText);
        else
          copyToClipboard(Html2Txt(divElements[i].innerHTML));
      }
      occur++;
    }
  }
}
function Html2Txt(htmlText)
{
  str = htmlText.replace(/\r\n/g, " ");
  str = str.replace(/\r/g, " "); 
  str = str.replace(/\n/g, " "); 
  str = str.replace(/\t/g, "");
  str = str.replace(/<BR>/gi,"\r\n");
  str = str.replace(/<[^>]+?>/g,"");
  str = str.replace(/&nbsp;/g, " ");
  str = str.replace(/&gt;/g, ">");
  str = str.replace(/&lt;/g, "<");
  str = str.replace(/&amp;/g, "&");
  return str;
}


function copyToClipboard(txt)
{
 if(window.clipboardData) 
  {
    window.clipboardData.clearData();
    window.clipboardData.setData("Text", txt);
  }
  else if(navigator.userAgent.indexOf("Opera") != -1) 
  {
    window.location = txt;
  } 
  else if (window.netscape) 
  {
    try 
    {
      netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
    } 
    catch (e) 
    {
      alert("您的firefox安全限制限制您进行剪贴板操作,请在地址栏中输入“about:config”将“signed.applets.codebase_principal_support”设置为“true”之后重试");
      return false;
    }
    var clip = Components.classes['@mozilla.org/widget/clipboard;1'].createInstance(Components.interfaces.nsIClipboard);
    if (!clip)
      return;
    var trans = Components.classes['@mozilla.org/widget/transferable;1'].createInstance(Components.interfaces.nsITransferable);
    if (!trans)
      return;
    trans.addDataFlavor('text/unicode');
    var str = new Object();
    var len = new Object();
    var str = Components.classes["@mozilla.org/supports-string;1"].createInstance(Components.interfaces.nsISupportsString);
    var copytext = txt;
    str.data = copytext;
    trans.setTransferData("text/unicode",str,copytext.length*2);
    var clipid = Components.interfaces.nsIClipboard;
    if (!clip)
      return false;
    clip.setData(trans,null,clipid.kGlobalClipboard);
  }

</script>

注意:在FireFox中我们可以使用“innerContent”属性读取文本内容,它同IE浏览器中的innerText属性是相对应的。但是实际出来的效果非常差劲,所以我干脆自己给FireFox实现innerText功能。在上面代码中分两步走:1)扩展HTMLElement属性,提供innerHTML属性。2)根据innerHTML读取到的信息去掉不必要标记内容,整理成文本信息。(就是Html2Txt函数)

由于本人对JavaScript并不是很在行,所以上面代码如果有什么问题还望不吝赐教。

在此,感谢asdf[未登录]、Jeffrey Zhao、luaiping、高海东对完善本文代码的帮助!

posted on 2007-02-08 10:09 吕震宇 阅读(4891) 评论(14)  编辑 收藏

评论

习惯性的查看源文件
  回复  引用    

#2楼  2007-02-08 10:18 asdf [未注册用户]
<script language="javascript">
function CopyCode(key)
{
var divElements = document.all.tags("div");
var i;
for(i = 0; i < divElements.length; ++i)
{
if(key.parentElement.parentElement.parentElement == divElements[i].parentElement)
{
window.clipboardData.setData("Text", divElements[i].innerText);
}
}
}
</script>

document.all.tags("div");
key.parentElement.parentElement.parentElement
这2个属性在firefox怎么改才能兼容.???

高手 可以改一下


  回复  引用    

#3楼  2007-02-08 10:28 Jeffrey Zhao      
@asdf
document.getElementsByTag('div');
还有试试看parentNode?
  回复  引用  查看    

#4楼 [楼主] 2007-02-08 10:43 吕震宇      
@asdf
本人对JavaScript并不在行,赶紧google了一番,改了一下:
<script language="javascript">
function CopyCode(key)
{
var divElements = document.getElementsByTagName("div");
var i;
for(i = 0; i < divElements.length; ++i)
{
if(key.parentElement.parentElement.parentElement == divElements[i].parentElement)
{
window.clipboardData.setData("Text", divElements[i].innerText);
}
}
}
</script>
<script type="text/javascript">/*<![CDATA[*/
if(typeof(HTMLElement)!="undefined" && !window.opera)
{
HTMLElement.prototype.__defineGetter__("parentElement", function ()
{
if (this.parentNode == this.ownerDocument) return null;
return this.parentNode;
});
}
/*]]>*/</script>

不过FireFox仍然报错,不支持window.clipboardData
:-(
  回复  引用  查看    

#5楼  2007-02-08 10:49 luaiping [未注册用户]
网上收到的,吕老师可以参考一下
http://blog.csdn.net/jackiecong/archive/2006/11/10/1377886.aspx
  回复  引用    

#6楼  2007-02-08 11:26 高海东      
@luaiping 我给您贴过来
代码如下,就不多说废话了,可以兼容基本上所有的主流浏览器(IE,FF),很多地方可以用到的:

copyToClipboard = function(txt) {
if(window.clipboardData) {
window.clipboardData.clearData();
window.clipboardData.setData(”Text”, txt);
} else if(navigator.userAgent.indexOf(”Opera”) != -1) {
window.location = txt;
} else if (window.netscape) {
try {
netscape.security.PrivilegeManager.enablePrivilege(”UniversalXPConnect”);
} catch (e) {
alert(”您的firefox安全限制限制您进行剪贴板操作,请打开’about:config’将signed.applets.codebase_principal_support’设置为true’之后重试”);
return false;
}
var clip = Components.classes[’@mozilla.org/widget/clipboard;1′].createInstance(Components.interfaces.nsIClipboard);
if (!clip)
return;
var trans = Components.classes[’@mozilla.org/widget/transferable;1′].createInstance(Components.interfaces.nsITransferable);
if (!trans)
return;
trans.addDataFlavor(’text/unicode’);
var str = new Object();
var len = new Object();
var str = Components.classes[”@mozilla.org/supports-string;1″].createInstance(Components.interfaces.nsISupportsString);
var copytext = txt;
str.data = copytext;
trans.setTransferData(”text/unicode”,str,copytext.length*2);
var clipid = Components.interfaces.nsIClipboard;
if (!clip)
return false;
clip.setData(trans,null,clipid.kGlobalClipboard);
}
}



  回复  引用  查看    

#7楼  2007-02-08 15:58 jason_lb      
str = str.replace(/&amp;/g, "<");
这个写错了吧
str = str.replace(/&amp;/g, "&");
  回复  引用  查看    

#8楼 [楼主] 2007-02-08 16:27 吕震宇      
@jason_lb
不好意思写错了,已经改过来了。
  回复  引用  查看    

#9楼  2007-02-09 09:33 活靶子 [未注册用户]
我也有
http://www.cnblogs.com/huobazi/archive/2006/04/08/TwoDropDownListInDataGridAndBubbleEvent.html

http://www.cnblogs.com/huobazi/archive/2004/11/03/DataGridHeaderTextInItemDataBound.html
  回复  引用    

#10楼  2007-02-09 10:11 kwklover      
建议dudu直接在编辑器上加上这个功能,直接插入OK。
剩的每次都弄那些脚本

  回复  引用  查看    

#11楼  2007-02-09 14:53 Amnoh      
可惜在FF上,安全限制比较高,还得先设置才能复制,而且容许操作后,提示也比较吓人“请示安装软件的权限”;IE 7也限制了,每次都提示。
对剪贴板的操作,前途无亮啊 :(
  回复  引用  查看    

#12楼  2007-02-16 12:08 bywind [未注册用户]
不知道在google.reader里面的copycode能不能实现。
另外在firefox里看到禁用的提示(about:config)之后就进入了一个死循环,错误控制台信息:
警告: 分析属性 'top' 值时出错。 声明被丢弃。
源文件:http://www.csdn.net/
行:0
还有left的错误。
  回复  引用    

#13楼  2007-03-30 15:56 张秀兰 [未注册用户]
非常感谢,我用上了!再次感谢!
  回复  引用    

#14楼  2007-07-31 19:40 网友 [未注册用户]
谢谢!我借用了。希望博客主人能同意。
  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-02-08 16:26 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: