zhiqim_clipboard.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /*
  2. * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。
  3. *
  4. * 指定登记&发行网站: https://www.zhiqim.com/ 欢迎加盟知启蒙,[编程有你,知启蒙一路随行]。
  5. *
  6. * 本文采用《知启蒙登记发行许可证》,除非符合许可证,否则不可使用该文件!
  7. * 1、您可以免费使用、修改、合并、出版发行和分发,再授权软件、软件副本及衍生软件;
  8. * 2、您用于商业用途时,必须在原作者指定的登记网站,按原作者要求进行登记;
  9. * 3、您在使用、修改、合并、出版发行和分发时,必须包含版权声明、许可声明,及保留原作者的著作权、商标和专利等知识产权;
  10. * 4、您在互联网、移动互联网等大众网络下发行和分发再授权软件、软件副本及衍生软件时,必须在原作者指定的发行网站进行发行和分发;
  11. * 5、您可以在以下链接获取一个完整的许可证副本。
  12. *
  13. * 许可证链接:http://zhiqim.org/licenses/zhiqim_register_publish_license.htm
  14. *
  15. * 除非法律需要或书面同意,软件由原始码方式提供,无任何明示或暗示的保证和条件。详见完整许可证的权限和限制。
  16. */
  17. +(function(Z)
  18. {//BEGIN
  19. // @version v1.1.0 @author zouzhigang 2015-11-12 新建与整理
  20. // 调用举例:
  21. // var clip = new Z.Clipboard();
  22. // clip.id = "clip_button";
  23. // clip.onClick = function(){clip.setText(Z('#text').val());};
  24. // clip.onCompleted = function(){alert("成功复制代码到剪贴板!");};
  25. // clip.execute();
  26. Z.Clipboard = Z.Class.newInstance();
  27. Z.Clipboard.v = "1.4.0";
  28. /****************************************/
  29. //定义Z.Clipboard下缓存和Flash事件方法
  30. /****************************************/
  31. Z.Clipboard.cache = new Z.HashMap();
  32. Z.Clipboard.load = function(id)
  33. {//加载成功
  34. if (!id || !Z.Clipboard.cache.containsKey(id))
  35. return;
  36. Z.Clipboard.cache.get(id).load();
  37. };
  38. Z.Clipboard.click = function(id)
  39. {//鼠标点击开始(传入复制文本)
  40. if (!id || !Z.Clipboard.cache.containsKey(id))
  41. return;
  42. return Z.Clipboard.cache.get(id).onClick();
  43. };
  44. Z.Clipboard.complete = function(id, text)
  45. {//鼠标点击完成(完成复制回调)
  46. if (!id || !Z.Clipboard.cache.containsKey(id))
  47. return;
  48. Z.Clipboard.cache.get(id).complete(text);
  49. };
  50. /****************************************/
  51. //定义Z.Clipboard下的原型属性和方法
  52. /****************************************/
  53. Z.Clipboard.prototype =
  54. {
  55. defaults:
  56. {
  57. //公共参数
  58. elem: null,
  59. onClick: null,
  60. onCompleted: null,
  61. //H5参数
  62. text: null,
  63. //Flash参数
  64. flash: false,
  65. flashPath: null,
  66. contextPath: null,
  67. background: "transparent",
  68. opacity: 1
  69. },
  70. init: function()
  71. {
  72. this.ready = false;
  73. },
  74. execute: function()
  75. {
  76. this.$elem = Z.$elem(this.elem, "Z.Clipboard");
  77. if (!Z.T.isFunction(this.onClick))
  78. {//必须的函数
  79. Z.alert("[Z.Clipboard]的[onClick]参数必须是函数");
  80. return;
  81. }
  82. if (!this.flash && document.execCommand)
  83. {//未强制flash,且支持执行命令的,默认使用H5
  84. this.$elem.click(this.doClick, this);
  85. }
  86. else
  87. {//否则默认Flash
  88. //创建一个DIV覆盖该元素
  89. var left = this.$elem.offsetLeft();
  90. var top = this.$elem.offsetTop();
  91. var width = this.$elem.offsetWidth();
  92. var height = this.$elem.offsetHeight();
  93. var zIndex = this.$elem.css("zIndex");
  94. zIndex = Z.V.isInteger(zIndex)?parseInt(zIndex)+1:99;
  95. this.$flashDiv = Z("<div>").appendToPos(this.$elem.parent())
  96. .css({position: "absolute", top: top, left: left, width: width, height: height, zIndex: zIndex})
  97. .css("backgroundColor", this.background).opacity(this.opacity);
  98. //获取Flash对象
  99. this.flashId = "Z_Clipboard_"+Z.random(10);
  100. var flashVars = "flashId="+this.flashId;
  101. var flashPath = Z.rootPath(this.contextPath, this.flashPath || "/service/res/swf/ZClipboard.swf");
  102. if (Z.B.msieOnly)
  103. {//ie10以前
  104. this.$flashDiv.html('<object id="'+this.flashId+'" name="'+this.flashId+'" width="'+width+'" height="'+height+'" align="middle" classid="clsid:d27cdb6e-ae6d-11cz-96b8-444553540000" codebase="'+Z.L.protocol+'://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0"><param name="allowScriptAccess" value="always" /><param name="allowFullScreen" value="false" /><param name="movie" value="'+flashPath+'" /><param name="loop" value="false" /><param name="menu" value="false" /><param name="quality" value="best" /><param name="bgcolor" value="#ffffff" /><param name="flashvars" value="'+flashVars+'"/><param name="wmode" value="transparent"/></object>');
  105. }
  106. else
  107. {//firefox,chrome,trident
  108. this.$flashDiv.html('<embed id="'+this.flashId+'" name="'+this.flashId+'" src="'+flashPath+'" flashvars="'+flashVars+'" pluginspage="'+Z.L.protocol+'://www.macromedia.com/go/getflashplayer" style="z-index:999;width:100%;height:100%" align="middle" border="0" loop="false" menu="false" quality="best" bgcolor="#ffffff" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" wmode="transparent"></embed>');
  109. }
  110. this.flashObj = Z.D.id(this.flashId);
  111. Z.Clipboard.cache.put(this.flashId, this);
  112. }
  113. },
  114. setText: function(text)
  115. {//设置复制文本
  116. if (!this.flash && document.execCommand)
  117. this.text = text;
  118. else
  119. this.ready && this.flashObj.setText(text);
  120. },
  121. doClick: function()
  122. {//H5复制文本
  123. //1.先回调点击函数
  124. var text = this.onClick.call(this);
  125. if (text && Z.T.isString(text)){
  126. this.text = text;
  127. }
  128. //2.创建一个文本域固定在顶端隐藏,
  129. var $textarea = Z("<textarea></textarea>")
  130. .addClass("z-hidden-fixed").text(this.text)
  131. .appendTo("body");
  132. //3.选中文本域内容,执行复制命令
  133. $textarea.select();
  134. document.execCommand("copy");
  135. //4.最后回调成功函数
  136. this.complete(this.text);
  137. },
  138. load: function()
  139. {//Flash加载完成
  140. this.ready = true;
  141. },
  142. complete: function(text)
  143. {//复制完成
  144. Z.T.isFunction(this.onCompleted) && this.onCompleted.call(this, text);
  145. },
  146. remove: function()
  147. {
  148. if (!this.flash && document.execCommand)
  149. this.$elem.offclick(this.doClick, this);
  150. else
  151. {
  152. Z.Clipboard.cache.remove(this.flashId);
  153. this.$flashDiv.remove();
  154. }
  155. }
  156. };
  157. /********************************************/
  158. //刷新静态函数和第一次加载
  159. /********************************************/
  160. Z.Clipboard.oncache = [];
  161. Z.Clipboard.onload = function()
  162. {
  163. //1.先删除原来的缓存
  164. Z.each(Z.Clipboard.oncache, function(clipboard){
  165. clipboard.remove();
  166. });
  167. Z.Clipboard.oncache = [];
  168. //2.再加载所有的下拉列表
  169. var elements = Z.D.attrs("data-role", "z-clipboard");
  170. if (!elements || elements.length == 0){
  171. return;
  172. }
  173. Z.each(elements, function(elem)
  174. {
  175. if (!Z.EL.has(elem, "data-click"))
  176. return;
  177. var $elem = Z(elem);
  178. if ($elem.attr("type") == "submit"){
  179. $elem.attr("type", "button");
  180. }
  181. var clipboard = new Z.Clipboard();
  182. clipboard.elem = elem;
  183. clipboard.onClick = Z.evals($elem.attr("data-click"));
  184. clipboard.onCompleted = Z.evals($elem.attr("data-completed"));
  185. clipboard.flash = "true" == $elem.attr("data-flash");
  186. clipboard.flashPath = $elem.attr("data-flashPath");
  187. clipboard.contextPath = $elem.attr("data-context");
  188. clipboard.execute();
  189. Z.Clipboard.oncache.push(clipboard);
  190. });
  191. };
  192. Z.onload(Z.Clipboard.onload);
  193. //END
  194. })(zhiqim);