惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

博客园 - greatqn

web方式修改svn密码 java程序用pid重启 ant编译android项目 apache ci 的404设置 mysql主从同步操作,及队列设计 Gearman安装,测试笔记 自己写过的一个vba脚本,用于移动copy一点数据。 jquery代码收藏 [php代码]从svn获取指定版本,并同步到ftp上。 jquery表格jqGrid操作笔记。 C#登录https网站并下载文件 js调试工具 ci_sae 监控项目示例 Sina App Engine 初级入门 被baidu拔毛后的恢复之路 linux操作,杂记 - greatqn - 博客园 一个备份dos脚本 jconsole本地连接失败的故障解决 [转]又拍网架构中的分库设计
花瓣采集js解析
greatqn · 2012-01-17 · via 博客园 - greatqn

第一步:收藏夹段js

javascript:void(function(d,a,c,b){a[c]&&typeof a[c].showValidImages=='function'?a[c].showValidImages():(b=a.createElement('script'),b.id='huaban_script',b.setAttribute('charset','utf-8'),b.src='http://huaban.com/js/pinmarklet.js?'+Math.floor(+new Date/1E7),a.body.appendChild(b))}(window,document,'__huaban'));

如果js已经加载,就运行showValidImages()的方法。
没有,则加载js:http://huaban.com/js/pinmarklet.js
对a标签下的img能识别出来。

第二步:提取pinmarklet.js
把线上的js保存到本地huaban.js。
43K,一千多行的代码,经过初步的压缩。
从第一步的效果看,功能是遍历页面,组装成采集页面,再提交采集。

线索:变量"__huaban" var global="__huaban";
    document[global]._loaded=!0,
    document[global].showValidImages=showImagesAndInitPinBtn

_loaded 初始化标记。

线索:showValidImages方法。
document[global].showValidImages=showImagesAndInitPinBtn

方法1:showImagesAndInitPinBtn 字面意思明显。很好的命名。
var a=getCurrentPageImagesWithEncapsulation();
showImages(a),initPinBtn(a),window.scroll(0,0)
a的数据结构:

w=242 h=284 src=http://s4.42qu.us/img/jpg/book/3.jpg img=[object HTMLImageElement] alt= img2=[object HTMLImageElement] _parentNode=null
[{container:c,w:b.width,h:b.height,src:b.src,img:b,description:e+(d&&d.innerText||""),img2:b}]

方法2:getCurrentPageImagesWithEncapsulation
参数初始
var _document=d||document;eImages=eImages||[],opts=opts||{};
遍历img

for(i=0;i<_document.images.length;i++){
var img=_document.images[i];
//alert(img);//[object HTMLImageElement]
}
isValidImage(img)&&(img=encapsulateImage(img),opts&&(img._parentNode=opts.parentNode||null),eImages.push(img))
function isValidImage(a){return a.style.display=="none"||a.className=="ImageToPin"||a.width<100||a.height<100?!1:!0}

如果img上加上class ImageToPin,就可以跳过被花瓣抓的命运。:)

getVideoOnCustomerPage(_document,eImages);
一些视频的处理。

eImages.push(img)

遍历背景图background-image等。
checkbgimgs

filters
bgimgs

遍历iframes

var iframes=_document.getElementsByTagName("iframe");
for(var i=0;i<iframes.length;i++)

方法3:function showImages(a)
c.onclick=function(){return pinImage(a),b()};

方法4:function initPinBtn(a){generatePinBtn(),registerImagesForPinBtn(a)}

方法5:generatePinBtn 生成采集按钮。

方法6:registerImagesForPinBtn(a) 注册鼠标事件。

方法7:取消按钮:

var b=function(){
return c.parentNode.removeChild(c),
d.parentNode.removeChild(d),
showingImage=!1,
selectedText="",
showFlash(),
window.scroll(0,lastScrollY),
!1
},

方法8:采集按钮:pinImage
http://www.w3school.com.cn/htmldom/met_win_open.asp

var e={
media:a.big_img?a.big_img.src:d.src,
url:c,
w:a.big_img?a.big_img.width:d.width,
h:a.big_img?a.big_img.height:d.height,
alt:d.alt,
title:a.title||document.title,
description:a.description||"",
media_type:a.media_type||"",
video:a.video||""
};

全局参数:

var siteDomain="huaban.com",主域
imageRoot="http://"+siteDomain+"/img",图片路径
bookmarkletUrl="http://"+siteDomain+"/bookmarklet/",书签路径
domChanged=!1,
selectedText="",
lastScrollY=0,
isShareBtn=!1,
pinBtn=null,
hidePinBtnTimer=null,
currentImage=null,
imageDesc="",
showingImage=!1,
itemUrl="",
skip=!1,
skiphrefs=["http://www.diandian.com/wall"];

技巧1:
(function(){alert("test");})();
定义个方法,直接运行。好处是把一些临时变量圈起来了,不容易和其它代码发生冲突。

技巧2:alert("\u4f60\u73b0");
js文件里,避免出现中文。

技巧3:!0 代替 true

技巧4:|| && 语法。

基础方法:
function isIE(){return/msie/i.test(navigator.userAgent)&&!/opera/i.test(navigator.userAgent)}
function isSafari(){return/Safari/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)}
function isPinable(a) 判断是否局域网地址。
function generateTag(a,b){var c=document.createElement(b||"div");return c.id=global+"_"+a,c}生成一个节点。

正则表达式:
http://hzjavaeyer.group.iteye.com/group/wiki/2276-JavaScript-Core

看js代码,用的是MyEclipse,有括号对应功能。

存疑:代码里用了大量的','号。不知道和';'号比,有什么优势。