之前有遇到的项目需求是,要在移动端,添加白名单的输入框,要求不能调出系统默认键盘同时还要满足可以复制粘贴的行为。这个到现在我也只是实现了复制功能而已。虽然没有实现全部功能,但在这里还是要记录一下,记录自己这两天的心路历程。觉得没有实现不想看的就此可以关闭该网页了。想看的可以看看我得思路和最终为啥没实现。
我们都知道,输入框一般会用 input 的标签来实现,那么 input type为text的一定会调出系统的默认键盘,若不想调用的话,那该怎么办?
我的两种方法:
上面两种方法就能达到用 input 标签而不调出键盘了。那么问题来了,input 失焦或是只读的状态,那么也不能实现长按调出菜单的复制粘贴功能。(只是为了不调出键盘的话,也可以不用 input 标签,可以用 div 或其他标签进行模拟)
好吧,用 input 不能达到我的目的,那我不用好了吧,我自己模拟一个输入框,然后自己模拟一个长按的菜单进行选择好不啦。
首先,来实现长按弹出菜单,上代码:(嘻嘻嘻,样式没有怎么修饰,主要看效果)
js代码:
上面两段代码的结合就可以实现,长按调出我的自定义菜单。
自定义菜单可以调出来了,那就实现复制粘贴的功能吧。
window.clipboardData (IE 才有) 这个就不说了。
ZeroClipboard (借助Flash) 这个也太胖了,不想说。
clipboard.js (很轻小,min文件11kb)下载地址
其实clipboard.js的核心也是 document.ExecCommand(“copy”) 这个,浏览器支持返回 true,不支持或者没启用返回 false。
clipboard.js 是对 document.ExecCommand(“copy”) 做的封装和兼容。
那用这个来看一下实现过程吧。因为 clipboard.js 只是支持复制和剪切的功能,下面以复制为例。
//实现复制的功能
到这里就实现了复制的功能。 clipboard.js 不支持 粘贴paste 的功能;而且剪贴板属于系统,浏览器处于安全的考虑是不允许js访问剪贴板的内容的,那你随便去访问不出问题才怪。但是触发粘贴事件(比如“ctrl+v”快捷键)是可以拿到剪切板的内容的,那我就想,ctrl+v 这个快捷键不是可以进行复制粘贴么,那我就模拟快捷键的这个行为来触发粘贴的行为呗。理想是很美好的!
现实很骨感,键值是模拟了,但是并不能触发 paste 事件,这也是一个安全机制的考虑,用户操作按键的行为,KeyboardEvent的isTrusted值为true,表示是用户操作,认为是可信任的,而模拟的键盘事件isTrusted值为false,认为行为不可信任。这也就是为什么不能触发paste事件了。这种处于安全的考虑是无可厚非的,那么我的功能就此也是没有实现了。
如果有什么好办法,欢迎跟我分享下,qq:1790899324。