跨浏览器的剪贴板访问解决方案
在IE中,JS可以直接访问剪贴板,但是firefox,chrome等其它"高级"浏览器,就没这么幸运了。网上流传的所谓兼容firefox/IE的剪贴板访问javascript代码,都是N年前的往事了。
根据http://mozilla.com.cn/post/49413/ 上的说法:
----------------------------------
火狐不允许网页操作用户的剪切板,因为有安全问题,网页可能盗用你复制的密码等等。
以前可以通过修改设置提权,允许网页获得高权限,操作剪切板,目前火狐已经取消了这个接口。不再允许,所以修改了设置也无效,目前还是自己通过快捷键复制吧。
----------------------------------
看来通过"纯js"来达到“一统天下”,至少在剪贴板这一问题上,已经是不可能了.
幸好,我们还有Flash/Silverlight这一类插件可以解决这一问题。Flash和Silverlight都内置了剪贴板的访问接口,zClip就是利用flash来解决这一问题的免费项目:
http://www.steamdev.com/zclip/
其原理是在目标元素上叠加一个透明的flash,点击目标元素时,其实就是把flash激活了,然后通过flash内部的剪贴板访问接口实现 复制到剪贴板 功能.
整个flash 1K + js 7K,一共约8K大小,已经能圆满解决该问题。
但是事情并没有就此止步,如果你还想进一步减少附加文件的大小,或者检验"自己动手,丰衣足食"的乐趣,下面给出了Silverlight的解决方案:
一、创建一个新Silverliight项目,里面就放一个MainPage,然后在MainPage.xaml.cs里,把对剪贴板的读写方法暴露出来
using System;
using System.Windows;
using System.Windows.Browser;
using System.Windows.Controls;
namespace ClipboardTools
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
}
/// <summary>
/// 设置剪贴板文本
/// </summary>
/// <param name="text"></param>
/// <returns></returns>
[ScriptableMember()]
public bool SetText(string text)
{
try
{
Clipboard.SetText(text);
return true;
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
return false;
}
}
/// <summary>
/// 获取剪贴板文本
/// </summary>
/// <returns></returns>
[ScriptableMember()]
public string GetText()
{
try
{
return Clipboard.GetText();
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
return "";
}
}
/// <summary>
/// 测试剪贴板里是否有内容
/// </summary>
/// <returns></returns>
[ScriptableMember()]
public bool ContainsText()
{
return Clipboard.ContainsText();
}
}
}
然后在App.xaml.cs里注册一下:
private void Application_Startup(object sender, StartupEventArgs e)
{
MainPage mp = new MainPage();
this.RootVisual = mp;
HtmlPage.RegisterScriptableObject("JsHandler", mp);
}
如果是Silverlight5,注册把下面这个选项勾上,以允许一些需要高权限的操作在浏览器中运行
二、web页面上使用代码示例:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Clipboard</title>
<style type="text/css">
html, body { height: 100%; overflow: auto;margin: 0;padding:0 }
#silverlightControlHost { height: 0px;width: 0px; }
button{ width: 75px;margin-left:5px}
</style>
</head>
<body>
<div id="silverlightControlHost">
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2"
width="100%" height="100%">
<param name="source" value="ClientBin/Clipboard.xap" />
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="5.0.61118.0" />
<param name="onLoad" value="SilverlightLoaded" />
<param name="autoUpgrade" value="false" />
</object>
</div>
<script type="text/javascript">
var slCtl = null;
function SilverlightLoaded(sender) {
slCtl = sender.getHost();
}
function setText(text) {
if (slCtl != null) {
var s = slCtl.Content.JsHandler.SetText(text);
if (s) {
alert(text + "nn已复制到剪贴板!");
return true;
} else {
alert("复制到剪贴板失败!");
return true;
}
}
alert("Silverlight加载失败!");
return false;
}
function getText() {
if (slCtl != null) {
return slCtl.Content.JsHandler.GetText();
}
return "";
}
</script>
<div style="margin:10px">
<input type="text" id="txtSrc" value="Sample Text"/>
<button id="btnCopy" onclick="setText(document.getElementById('txtSrc').value)">copy</button>
<button id="btnSet" onclick="alert(getText())">get</button>
</div>
</body>
</html>
silverlight编译后的xap约4K,js代码不足1K,一共5k左右
- hduoj------确定比赛名次
- HDUOJ----1165Eddy's research II
- HDUOJ-----1556Color the ball
- HDUOJ-----2175取(m堆)石子游戏
- Golang语言社区-Go语言递归
- go语言mongdb管道使用(一)
- HDUOJ---------2255奔小康赚大钱
- HDUOJ------1711Number Sequence
- HDUOJ---1712 ACboy needs your help
- HDUOJ---1867 A + B for you again
- HDUOJ--------1420Prepared for New Acmer
- PowerVM虚拟化环境下 CPU 利用率的监控与探究
- 虚函数中构造函数的调用顺序
- HDUOJ-----4512吉哥系列故事——完美队形I(LCIS)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python爬虫-MongoDB
- Python爬虫-selenium
- 用Python识别图形验证码,实现自动登陆!
- 当Docker遇到Intellij IDEA,再次解放了生产力~
- 用Python爬取自主品牌汽车,看看国产汽车究竟长什么样?(上)
- 工具包 | 使用Python绘制Sci学术期刊配图
- 深入剖析AQS和CAS,看了都说好
- 用Python爬取自主品牌汽车,看看国产汽车究竟长什么样?(下)
- 读者问:小林怎么学操作系统和计算机网络呀?
- 用Python搭建一个简单的代理池
- 用Python模拟登陆GitHub并获取信息
- APUE学习手札 编写一个与3.12节中dup2功能相同的函数,要求不调用fcntl函数,并且要有正确的出错处理
- Python教程 | 最标准的地图调用方式(国家测绘局提供数据)
- Python数据可视化:Python大佬有哪些?
- 新手一看就懂的线程池