讲故事

查MBA智库·百科的时候,需要把有些重要的内容摘抄下来,但是会提示需要下载app才能开放复制功能。
image.png
遇到这种情况,难不成就默默去下载一个几乎不会用到的app?而且可能还要给它一大堆“莫须有”的权限才能正常使用。
作为一名程序员,是绝对不会让这种事情发生的。

作分析

表象

从表象上看应该是这么回事:
当我复制需要的内容时,页面就弹出我必须先干某事的提示。
而操作剪贴板就是为了让我的复制达不到预期。而且经测试发现,我粘贴出来的还是之前复制的内容。
解除浏览器限制复制 - 图2

初步猜测

这种情况就能知道铁定是加了一些触发事件导致的,而这个触发事件的关键词一定是“复制”。
作为一个程序员,开发者工具总认识吧。
image.png
知道定位到需要复制的内容上,看看这地方绑定了哪些事件,然后找到复制。
image.png
接下来就是拜读这两个事件了。

ad_v0927.js

从文件名就看出这玩意儿不是什么好东西。
所以代码命名、书写规范,能极大的提高代码的可读性。
感谢代码规范!!!让我们一起成为业内清流。

  1. $(document).on('copy', function (e) {
  2. // console.log('copy demand');
  3. var txt;
  4. if (document.selection) {
  5. txt = document.selection.createRange().text
  6. } else {
  7. txt = window.getSelection() + '';
  8. }
  9. //光标是不是选中了一个有内容的片段
  10. if (txt) {
  11. copyEvent.isadshow = getCookie(copyEvent.copyCookiename);
  12. if (!copyEvent.isadshow) {
  13. //需要App扫码
  14. $("#know_copy_pop").next().html('');
  15. showCopyPop();
  16. return false;
  17. } else {
  18. return true;
  19. }
  20. }
  21. });
  22. function showCopyPop() {
  23. if ($("#copy_pop_wiki").length > 0) {
  24. if (typeof (statWikiCopyPop) == 'function') {
  25. statWikiCopyPop();
  26. }
  27. $("#copy_pop_wiki").removeClass('hid');
  28. $("#bg").show();
  29. var pushname = $("#copy_pop_wiki").attr('data-name');
  30. pushShow(pushname);
  31. }
  32. }
  33. //百科复制弹层 弹出
  34. function statWikiCopyPop() {
  35. _hmt.push(['_trackEvent', 'wiki_copy', 'wiki_copy_pop']);
  36. }
  37. function pushShow(pushname) {
  38. if (typeof (_hmt) != 'undefined') {
  39. _hmt.push(['_trackEvent', 'ad_show', pushname]);
  40. }
  41. }

3~8获取我要复制的内容
12获取我有没有扫过码,需不需要弹出AD
16展示弹窗
17复制失败
19复制成功
综上,就是这个监听导致我们的代码出问题了。

wiki.js

  1. //复制监听
  2. document.oncopy = function () {
  3. var txt;
  4. if (document.selection) {
  5. txt = document.selection.createRange().text
  6. } else {
  7. txt = window.getSelection() + '';
  8. }
  9. if (txt) {
  10. if (typeof statWikiCopy === 'function') {
  11. statWikiCopy();
  12. }
  13. }
  14. }
  15. //百科复制统计
  16. function statWikiCopy() {
  17. if (wfIsPC()) {
  18. var s = 'wiki_copy_pc';
  19. } else {
  20. var s = 'wiki_copy_mobile';
  21. }
  22. _hmt.push(['_trackEvent', 'wiki_copy', s]);
  23. }

3~8获取我要复制的内容
11统计复制内容
综上,wiki.js这段的只是为了统计使用。这种用户数据收集起来也有一定的价值。

去实践

那么,分析完逻辑就方便我们去“对付”它了。
点下事件移除就行,不要太方便。
image.png
这样就能正常复制了。

来总结

  1. 选中要复制的内容
  2. 右键查看,调出开发者工具
  3. 找到copy事件,并移除(可以一刀切)
  4. 愉快地复制。