如果chrome浏览器中有了重复书签,我们可以使用Bookmark Checker这个扩展来检查。但是Bookmark Checker的检查结果没有把重复书签放到一起,如果重复书签较多的话,找起来就非常费事。所以我写了一段JavaScript代码来重新组织Bookmark Checker的结果页面,以提高去重的效率。
首先安装Bookmark Checker,之后在浏览器的工具栏上点击它以打开操作界面。
在下拉框选择“duplicate”,然后点击下方的“check”按钮,即可开始检查重复的书签。
等它检查完毕并且显示了结果页面后,请打开控制台,粘贴执行位于本文末尾的代码。
稍等片刻,等看到页面发生了变化时,就可以方便的删除书签了。重新组织后的界面如下:
在重新组织后的界面里,重复书签分组放在一起,并且显示了其所在的文件夹。
点击任意书签最右侧的“Delete”,就会弹出确认对话框:
确认之后该书签将被立即删除。
现在的代码保留了“一键删除已选择的书签”的功能(remove selected)。
需要注意的是本代码执行后,页面上删除文件夹的功能被隐藏了起来。但你仍然可以在书签管理器或其他扩展里删除文件夹。
代码如下:
function getFolderName (e) { //获取书签所在的路径
var parentE=e.parent();
if (parentE.children()[0].nodeName==="DIV"&&parentE.children().eq(0).find(".icon.folder").length>0) { //说明这个元素是文件夹
folderName=parentE.find("div").eq(0).find(".title .ng-binding").text()+"\\"+folderName;
return getFolderName(parentE);
}else{
if (parentE[0].nodeName==="DIV") {
return folderName;
}else{
return getFolderName(parentE);
}
}
}
function sortUrl(propertyName) { //按url排序
return function(object1, object2) {
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if (value2 < value1) {
return -1;
} else if (value2 > value1) {
return 1;
} else {
return 0;
}
}
}
function checkOPt(e) { //检查并切换选中状态
var checked=e.find("input[type=checkbox]").eq(0).prop("checked");
if (checked) {
e.find("input[type=checkbox]").eq(0).prop("checked",false);
}else{
e.find("input[type=checkbox]").eq(0).prop("checked",true);
}
}
function delBookmark (bid,noalert) { //删除书签
if(noalert==="noalert"){
chrome.bookmarks.remove(bid,function (response) {
$("[bid="+bid+"]").parent().parent().parent().parent().remove();
selectedL--;
if(selectedL===0){
alert("選擇的書籤已經全部刪除。");
}
});
}else{
if(window.confirm("你確定刪除這個書籤嗎?")){
chrome.bookmarks.remove(bid,function (response) {
$("[bid="+bid+"]").parent().parent().parent().parent().remove();
});
}
}
}
$(".btn-remove-all").bind('click',function () { //重做删除全部书签的功能
if(window.confirm("你確定刪除所有选择的書籤嗎?")){
var allInput=$("input[type=checkbox]:checked");
selectedL=allInput.length;
for (var i = 0; i < allInput.length; i++) {
delBookmark(allInput.eq(i).parent().parent().find(".data-del").eq(0).attr("bid"),"noalert");
}
}
});
var selectedL=0; //已选择的书签数量
var allLi=$(".angular-ui-tree-node"); //所有li,包含文件夹和书签
var allBookmarks=[]; //储存所有的书签
var allBookmarksSort=[]; //书签排序
for (var i = 0; i < allLi.length; i++) {
if(allLi.eq(i).find("div").eq(0).find(".icon.bookmark").length>0){ //说明这是一个书签而不是文件夹
var folderName="";
allBookmarks.push({
"id":allLi.eq(i).find("input").eq(0).attr("data-id"),
"li":allLi.eq(i),
"url":allLi.eq(i).find("a")[0].href,
"folder":"位置:"+getFolderName(allLi.eq(i))
});
}
}
//书签的排序
for (var i = 0; i < allBookmarks.length; i++) {
allBookmarksSort[i]=allBookmarks[i];
}
allBookmarksSort.sort(sortUrl("url"));
//创建输出区域
var listArea=document.createElement("div");
listArea.id="listArea";
$(".content-area.ng-scope")[0].insertBefore(listArea,$(".ng-scope.angular-ui-tree")[0]);
$("#listArea").css({"width":"100%","backgroundColor":"#fff"});
$(".ng-scope.angular-ui-tree").remove();
for (var i = 0; i < allBookmarksSort.length; i++) {
//显示书签的路径
var path=document.createElement("div");
path.innerHTML=allBookmarksSort[i].folder;
$(path).css({"color":"#D8534F","padding":"10px 0"})
allBookmarksSort[i].li.find(".tree-content.bookmark")[0].insertBefore(path,allBookmarksSort[i].li.find(".url.ng-scope")[0]);
//重做删除按钮和功能
allBookmarksSort[i].li.find(".tree-delete.ng-scope").remove();
var del=document.createElement("span");
del.innerHTML="Delete";
$(del).attr("bid",allBookmarksSort[i].id);
$(del).click(function () {
delBookmark($(this).attr("bid"));
})
$(del).css({"color":"#D8534F","cursor":"pointer"});
$(del).addClass("data-del");
allBookmarksSort[i].li.find(".tree-control.ng-scope")[0].appendChild(del);
$("#listArea")[0].appendChild(allBookmarksSort[i].li[0]); //插入书签
//绑定选择/取消选择的功能
allBookmarksSort[i].li[0].onclick=function () {
checkOPt($(this));
}
//添加分割线
if (i>0&&i<allBookmarks.length-1) {
if (allBookmarksSort[i].url!==allBookmarksSort[i+1].url) {
var hr=document.createElement("hr");
$("#listArea")[0].appendChild(hr);
}
}
}
16.10.29 补充一个功能,需要手动执行:
如果书签都是成对重复的(每个书签都有两份,而不是三份或更多),可以执行下面的代码。执行完毕后,每对重复书签里会有一个被选中。然后点全部删除按钮(remove selected)就可以一键删除选中的书签了。这样去重更有效率。
for (var i = allBookmarksSort.length - 1; i >= 0; i=i-2) {
allBookmarksSort[i].li[0].click();
}
注意,必须先运行上面那个很长的js代码之后再运行这个才会生效。
写这个脚本的时候挺痛苦的,因为Bookmark Checker的页面元素太过繁杂,class名还高度重复。等我重新组织了结果之后,发现原有的一些功能不生效了,自己要重写一遍 Orz
Google Chrome 61
Windows 10/11
Google Chrome 61
Windows 10/11 嗚呼,Chrome 把這插件禁掉哩。
9 月份時整理過一次,還是好用啊。