您现在的位置 » 博客首页 » 前端代码

复制Input内容代码_支持所有浏览器,修正了Firefox3.5以上的问题

2010-04-13
今天作一个功能,有一个input,里边有内容,点一下按钮就复制里边的内容到剪贴板;



点这里看效果:http://www.zishu.cn/attachments/month_1004/flashCopy.html

但IE6两行JS代码就可以,IE7以上也差不多,只不过出来一个安全提示比较恶心,用户如果看到了,一定有怀疑;
再但就是Firefox、Chrome等根本就不让你复制;

记得以前网上有这方面的代码,找了一下,发现全部不能在firefox3.5以上的版本中应该,最后终于找到了一个,代码还相当相当的复杂,不太敢用。
最后,憋的实在没有办法了,查了查资料,自已写了一个:

主要的理解的几个点:
1、Firefox这些浏览器,出于安全考虑吧,直接是不让复制的;
2、在Flash中,可以用System.setClipboard(),把内容扔到剪贴板上,然后再让FLASH工作在Firefox下;
3、在Flash播放器10.0之后呢,也是出于安全考虑吧,System.setClipboard的内容必须在FLASH里边;
4、用ExternalInterface可以和JS通信;
5、ExternalInterface在flash8中必须引用一下才可以;

默认的HTML代码:

<input type="text" id="testInput" name="testInput" value="4234324234" />
<div id="buttonBox">
	<button onclick="copy('testInput')">copy</button>
</div>


所以,设计的时候,先作第一个判断,如果是IE,就还用默认的代码,这样最没有问题,如果不是,就用一个FLASH把默认的按钮覆盖;

if (window.XMLHttpRequest){//如果不是IE时,就用FLASH的方式复制
	$('buttonBox').innerHTML = '<embed src="flashCopy.swf" width="48" 
height="23" quality="high"  
pluginspage="http://www.macromedia.com/go/getflashplayer" 
type="application/x-shockwave-flash"></embed>';
}


以下是所有的JS文件:

<script>
function $(id){
	return document.getElementById(id);
}

function copy(){//ie6
	var value = $('testInput').value;  
	window.clipboardData.clearData();   
	window.clipboardData.setData("Text", value); 
	alert('复制成功!');	
}

function flashCopy(){//firefox .......
	return $('testInput').value;  
}

function flashCopyBack(){
	alert('复制成功!');
}

if("v" != "v"){//如果不是IE时,就用FLASH的方式复制
	$('buttonBox').innerHTML = '<embed src="111.swf" width="48" height="23" quality="high"  pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"></embed>';
}
</script>


FLASH按钮的代码如下:

on (release) {
	import flash.external.ExternalInterface;
	var inputText = ExternalInterface.call('flashCopy');
	System.setClipboard(inputText);
	ExternalInterface.call('flashCopyBack');
	//_root.boboText.text = inputText;
}


原理,就是避开那个安全上的限制,在点FLASH中的按钮时,通过FLASH中的代码去调页面中的JS代码,JS代码可以拿到INPUT中的值,然后再传给FLASH,这时,FLASH中就有了这些值了,然后,FLASH自已再通过System.setClipboard把这些值存到剪贴板上; 再然后,他再去调用页面中的flashCopyBack,flashCopyBack只干一件事,就是提示已复制成功!

我在Firefox、chrome、ie中都测过了,没有问题,如果谁发现有问题,请告诉我,谢谢,因为我现在已经开始用!

转载请注明出处:子鼠
评论:9 条 | 查看:1255 次
夏至未至于2011年07月20日20点01分03秒说
子鼠你好 ,我有个项目中到了这样的问题,但是需要用两个按钮分别复制两个文本框里的内容,那是不是要做两个flash按钮呢?然后分别对应不同的js? 有没有好的解决办法?
zishu于2011年07月20日21点29分48秒回复说
这个代码你改一改就行了,把input的id传给swf文件,swf在call的时候,把id再回传给js. 就可以了;
zishu于2010年12月19日22点37分08秒说
//win7 firefox bug
setTimeout("reloop()",200);
啊啊于2010年12月13日11点42分26秒说
我在本地测试,用Google浏览器里怎么复制的值是null呢。
80后网管小胡于2010年06月03日23点46分30秒说
80后网管小胡
http://www.life80.cn
博主的博客很新颖,希望能交换友情链接,谢谢!
贰陆于2010年05月06日13点27分14秒说
Good
贰陆于2010年04月21日8点00分00秒说
[quote][b]最初由 [color=blue]zishu[/color] 发表于 2010-04-13 04:56 PM:[/b]
undefined[/quote]
果然是这样。。只是还需要针对使用环境去控制这个flash按钮的显示。
谢谢博主
贰陆于2010年04月13日8点00分00秒说
太棒了。。收藏。。
贰陆于2010年04月13日8点00分00秒说
为什么把你的flashcopy.swf下载到本地以后调试不行了呢?
zishu于2010年04月13日8点00分00秒说
[quote][b]最初由 [color=blue]贰陆[/color] 发表于 2010-04-13 02:09 PM:[/b]
为什么把你的flashcopy.swf下载到本地以后调试不行了呢?[/quote]
本地有安全方面的问题,有可能会不行!

发布评论/留言

名字/昵称:
内容: