讲故事
查MBA智库·百科的时候,需要把有些重要的内容摘抄下来,但是会提示需要下载app才能开放复制功能。
遇到这种情况,难不成就默默去下载一个几乎不会用到的app?而且可能还要给它一大堆“莫须有”的权限才能正常使用。
作为一名程序员,是绝对不会让这种事情发生的。
作分析
表象
从表象上看应该是这么回事:
当我复制需要的内容时,页面就弹出我必须先干某事的提示。
而操作剪贴板就是为了让我的复制达不到预期。而且经测试发现,我粘贴出来的还是之前复制的内容。
初步猜测
这种情况就能知道铁定是加了一些触发事件导致的,而这个触发事件的关键词一定是“复制”。
作为一个程序员,开发者工具总认识吧。
知道定位到需要复制的内容上,看看这地方绑定了哪些事件,然后找到复制。
接下来就是拜读这两个事件了。
ad_v0927.js
从文件名就看出这玩意儿不是什么好东西。
所以代码命名、书写规范,能极大的提高代码的可读性。
感谢代码规范!!!让我们一起成为业内清流。
$(document).on('copy', function (e) {
// console.log('copy demand');
var txt;
if (document.selection) {
txt = document.selection.createRange().text
} else {
txt = window.getSelection() + '';
}
//光标是不是选中了一个有内容的片段
if (txt) {
copyEvent.isadshow = getCookie(copyEvent.copyCookiename);
if (!copyEvent.isadshow) {
//需要App扫码
$("#know_copy_pop").next().html('');
showCopyPop();
return false;
} else {
return true;
}
}
});
function showCopyPop() {
if ($("#copy_pop_wiki").length > 0) {
if (typeof (statWikiCopyPop) == 'function') {
statWikiCopyPop();
}
$("#copy_pop_wiki").removeClass('hid');
$("#bg").show();
var pushname = $("#copy_pop_wiki").attr('data-name');
pushShow(pushname);
}
}
//百科复制弹层 弹出
function statWikiCopyPop() {
_hmt.push(['_trackEvent', 'wiki_copy', 'wiki_copy_pop']);
}
function pushShow(pushname) {
if (typeof (_hmt) != 'undefined') {
_hmt.push(['_trackEvent', 'ad_show', pushname]);
}
}
3~8获取我要复制的内容
12获取我有没有扫过码,需不需要弹出AD
16展示弹窗
17复制失败
19复制成功
综上,就是这个监听导致我们的代码出问题了。
wiki.js
//复制监听
document.oncopy = function () {
var txt;
if (document.selection) {
txt = document.selection.createRange().text
} else {
txt = window.getSelection() + '';
}
if (txt) {
if (typeof statWikiCopy === 'function') {
statWikiCopy();
}
}
}
//百科复制统计
function statWikiCopy() {
if (wfIsPC()) {
var s = 'wiki_copy_pc';
} else {
var s = 'wiki_copy_mobile';
}
_hmt.push(['_trackEvent', 'wiki_copy', s]);
}
3~8获取我要复制的内容
11统计复制内容
综上,wiki.js这段的只是为了统计使用。这种用户数据收集起来也有一定的价值。
去实践
那么,分析完逻辑就方便我们去“对付”它了。
点下事件移除就行,不要太方便。
这样就能正常复制了。
来总结
- 选中要复制的内容
- 右键查看,调出开发者工具
- 找到copy事件,并移除(可以一刀切)
- 愉快地复制。