無標題文檔

「阻挠」用户下载图片

昨天写的篇文章 中,无意间发现 从 Flickr 右键下载的图片 竟然不是原图。好奇心起,于是就分析起其机制。

https://friable.rocks/_/2009_11_05/0115255fba53.jpg

原来在它的原图上层,再浮动了与其同宽高的一个像素的透明 GIF 图片。这样,当用户右键点击「图片另存为」时,保存的就是其一像素的 GIF 图片。

这个方法虽然是能防「君子」,但相比 Flash (甚至 ActiveX)等措施,对于客户端的资源占用少了许多。职业病,我考虑的是脚本上的实现。

在不长的时间,这个脚本就实现了, 看下 DEMO 或者 打包下载 (用法参见页面)。

不过还是出现了几个问题,在这里提下

var m = document.createElement('img');
var element = document.getElementById(element).getElementsByTagName("img");
for(var i = element.length - 1; i >= 0; i--) {
    this.insertAfter(element[i], m.cloneNode(true));
}

本来的写法是

var m = document.createElement('img');
var element = document.getElementById(element).getElementsByTagName("img");
for(var i = 0; i < element.length; i++) {
    this.insertAfter(element[i], m.cloneNode(true));
}

出现的问题是 新创建的图片只会插入到第一章图片的后面。

感谢 圆心 同志的排查,原来是插入图片时,新插入的图片节点被加入,导致原先图片节点 length 发生变化

换个迭代方式就能解决这个问题。

if (document.documentElement.getBoundingClientRect)  {
    var box = targetElement.getBoundingClientRect();
    maskImage.style['top']  = box.top + "px";
    maskImage.style['left'] = box.left + "px";
} else {
    maskImage.style['top']  = targetElement. + "px";
    maskImage.style['left'] = targetElement.offsetLeft + "px";
}

依旧 很「暴力」的一段代码,主要功能是获取元素在页面中的位置。PPK 告诉我们,尽量避免因兼容性问题,而去检测浏览器类型。

附,看下 YUI 在这方面是怎么做的

跨域 Ajax 调用总结

上次提到过跨域 Ajax 的调用问题 ,这次做个总结。众所周知,Javascript 有「同源策略」的限制。但有时候偏偏又要碰到 Ajax 跨域调用的问题,这个时候就需要些「特殊」的方法使脚本正常使用。

总结下目前所能想到的一些策略,具体的可以查看 Yahoo 开发中心的 相关文档

使用 iframe

具体详情,可以 参看这里

实现的原理就是 iframe 与 父页面 进行 Javascript 通信。完全跨域操作没有测试过,但跨子域名是完全可行的。

优势(部分)

  • 全部使用 Javascript 搞定
  • 简单,不用学习其他语言

缺点(部分)

  • 破坏 HTML 结构
  • 客户端的资源占用比较大

服务器端脚本

https://friable.rocks/_/2008_04_07/1207562864.gif

架构可以先「盗用」 Yahoo 文中 的那张插图。大家也许想到变通的办法了,就是在服务器端编写类似网关的脚本。

比如获取另外个域下的 Json 输出,用 PHP 编写的部分代码如下

header('Content-type: text/javascript');
$url = 'http://x.other.net/json';
if ($content  = file_get_contents($url)) {
    echo $url;
}

很简单的代码,但对于服务器端而言,没有任何的限制。进一步的扩展,可以使用 CURL 库

优势(部分)

  • 使用没有任何限制
  • 对 Javascript 透明

缺点(部分)

  • 必须支持服务器端
  • Javascript 程序员必须了解服务器端语言
  • 服务器端脚本必须与页面在同个域内
  • 可能会加重服务器负载

由于相对比较熟悉 PHP 语言,加上后者对于客户端友好,所以在条件允许的情况下,个人还是比较偏向后者。

清·明

清明 - 杜牧

清明时节雨纷纷,路上行人欲断魂。
借问酒家何处有,牧童遥指杏花村。

每年的清明天气都是不好,心情也尤其显得郁闷。对于国家清明放假的决策,还是表示支持的 -- 加上周末,我还可以多休息几天。

早上还在喧闹的杭州,下午两三点就到了乡下的乡下。空气中弥漫着小雨,这里的空气尤其显得清新。

https://friable.rocks/_/2009_11_05/5942955c14c3.jpg

这是个浙东的渔村,离海就两三公里。祖辈世世代代都在这里生存,所以归尘以后也就安葬在同个地方。从山上俯瞰,可以看见整个小镇的全貌。

https://friable.rocks/_/2009_11_05/0116755c14b6.jpg

往东望去,不远就是东海。清晨在这里看日出,是件非常惬意的事情。朝阳倒映着海平面,就犹如将地平线镶上了层金边。

https://friable.rocks/_/2009_11_05/0802055c14c9.jpg

由于这座山的战略位置非常重要,所以海军就在这里驻扎。母亲曾经说,「千万可不能打仗啊,否则老祖宗的地盘就得不到安宁了」。

https://friable.rocks/_/2009_11_05/6431955c149d.jpg

再说说这个村子,正如大家所预想到的,这个村子的特产就是海鲜。逛了下超市,发现这里海鲜的价格,竟然连杭州的一半都不到。

照片里的是种叫做 泥螺 的软体生物,味道非常的鲜美,但并不是所有人,都喜欢这种粘粘的类似于 鼻涕虫 一样的食物。

我的照片

您好!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,欢迎您通过 GitHubTwitterInstagram 了解我的更多动态。

本博客原名 Gracecode.com 、现更名 「無標題文檔」「精于心、简于形」以此践行极简、务实的理念。 在工作之外的个人生活方面,我崇尚简单、追求平淡,偶尔也带着一些可能不被所有人理解的幽默感。

同时为避免争议和麻烦,在此郑重声明:本站所有内容为非 AI 生成,所有观点及立场均仅代表我个人,不代表任何我所就职或关联的公司与组织。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章