2009-03
16

GreaseMonkey这个插件大家都早已熟悉了。最近我遇到一个问题:需要让页面在调用完某个函数之后自动执行我的函数。 其实这个并不难,写个函数替换原有的函数即可:

function hook() {
  var f = unsafeWindow.foo;         // 保存旧函数
  unsafeWindow.foo = function() {   // 定义新函数
    alert("Hello!");                // 先执行我们的处理
    f();                            // 再执行旧函数
  }
}

然后加载到页面上:

setTimeout(hook, 1000);

这样,页面再执行foo函数时,就会先执行我们的alert("Hello!")了。

不过这个函数还有很大的问题。比如,原有函数的参数不能正确传给foo,返回值无法取出来,无法应用到对象中的方法,通用性不好等。 下面来一个个解决。

阅读全文 »
2008-05
30

今天delicious上这个名为 SocialHistory 的脚本十分引人注目。 源代码可以在这里下载。 这段js代码的功能就是判断你的用户有没有访问过某个网站。使用方法很简单,例如:

window.onload = function() {
    var sl = new SocialHistory();
    alert(sl.doesVisit("Del.icio.us"));
}

如果用户曾经使用过del.icio.us,那么该函数就会返回真,否则返回假。

其实原理并不复杂,它利用了链接的 a:visited 伪类的属性。首先在页面上生成一个iframe, 并在这个iframe中设置 a 和 a:visited 为不同的样式。然后将网站的链接插入到 iframe 中。 浏览器就会根据用户的访问历史,为访问过的链接设置 a:visited 的样式。 最后再获得链接的最终样式,如果是 a:visited,就可以认为用户访问过该网站了。 具体的实现方式可以参考源代码。

这个脚本主要用于显示社会性书签的图标,可以恰到好处地显示用户所使用的网站。 但我担心,这样的做法是不是有盗取用户隐私之嫌? 虽然这个方法只能判断用户有无访问特定的网站,并不能无限制地得到所有访问历史。


2008-01
09

刚刚看到一篇好文(原文链接), 对Javascript中的delete操作符分析得很透彻。在这里简单地介绍一下内容。

虽然是一个小小的delete操作符,其行为却异常复杂。

阅读全文 »
2007-01
30

最近一直在开发Ajax应用程序。众所周知Ajax的特点是客户端和服务器分离, 客户端通常由纯Javascript组成,通过XMLHttpRequest对象与服务器通信。 在调试客户端代码时,如果服务器开在本地,尚可通过samba等方式直接编辑 服务器上的客户端js代码,倘若服务器在异地,那么每次修改js代码后通过FTP等 方式上传之后再调试就十分费事。说到这里自然会想到将js代码放到本地, 然而XMLHttpRequest却只能访问同一域名下的URL,本地的js代码无法直接使用 远程服务器上的服务。

迷茫之际,同事介绍了delegate这款软件,利用它即可实现本地调试客户端代码。

delegate可以在这里下载。 delegate实际上是一个功能强大的代理服务器,它有个类似于Linux的mount功能, 能够将Internet上的URL映射到本地。利用这个功能, 即可将远程的服务器端和本地的客户端集成到同一个域名下, 实现客户端代码的本地调试。

方法如下:

  1. 将Apache配置到本机的8080端口,然后将客户端代码放在htdocs下, 使之能够通过 http://localhost:8080/client/ 访问。
  2. 下载delegate并解压缩。
  3. 编辑以下的配置文件 delegate.cfg。
    -P80
    ADMIN="yourname@yourmail.com"
    MOUNT="/client/* http://localhost:8080/client/*"
    MOUNT="/cgi-bin/* http://server-address/cgi-bin/*"
    第一行的 -P80 指定delegate使用80端口;第二行的ADMIN指定管理员邮件地址, 可以随意设置;第三行将客户端映射到 delegate 的 /client/ 路径下; 第四行将远程服务器目录映射到 delegate 的 /cgi-bin/ 路径下。
    另外,如果你需要通过代理服务器访问远程服务器,可以这样设置:
    MOUNT="/cgi-bin/* http://server-address/cgi-bin/*" PROXY="代理服务器地址:端口"
  4. 在命令行输入以下命令安装delegate。注意不同版本的delegate的可执行文件名不同。
    dg9.4.1.exe +=delegate.cfg
  5. 打开浏览器,访问 http://localhost/client/。这样即可随时看到对js代码的修改。

实际上,用好这个方法还可以“盗用”许多网站的服务,即自己开发客户端, 再通过 delegate 将请求转发给服务器。其方法不再详述。


2006-12
07

Firebug开发小组终于发布了激动人心的Firebug 1.0 Beta版。 与当初的Firebug 0.4版相比,这次的正式发布版已经不仅仅是简单的Javascript控制台, 而是集控制台、调试器、DOM查看/编辑器、网络监视器于一身的强大调试工具。 而使用者也不再限于Javascript开发者,内置的Box模型查看功能让网页设计师也受益匪浅。 下面我们来看看它的新功能吧。

阅读全文 »
2006-11
24

用Javascript经常会遇到一个很头疼的问题:Firefox下工作正常的代码,放到IE下就出现语法错误。这时可以检查一下是否有类似于下面的代码。

<script>
var a = {name:"charlee",};
alert(a.name);
</script>

生成对象时,对象的最后一个属性后面多了一个逗号。频繁添加删除属性时,经常会忘记删除最后的逗号。Firefox会忽视这个逗号,而IE却会报错。


2006-11
23

感谢Clear为我们提供了这个效率更高的字符串替换函数。这是经常使用的HTML特殊字符替换函数,即将 &、<、>、" 等函数替换成 &、<、>、"。通常的作法都是连续使用数个 replace 函数,而Clear仅使用一个 replace 就完成了替换。

我对这两个函数作了benchmark,发现新函数的效率约为原函数的1.4倍。虽然没有预想中那么高效率,但当要替换的字符串更多时,效率应该会提高吧。

测试方法为,对一个2048字节长的字符串分别执行两个函数100次,取其执行时间。下面为10次测试的结果。toTXT_1 为通常的作法,toTXT_2 为Clear的方法。

toTXT_1(ms)toTXT_2(ms)toTXT_1/toTXT_2
1609120475%
2250154769%
1672131379%
1813125069%
1844121966%
2063142169%
2031117258%
1797136076%
2015128164%
1860150081%

测试程序在这里。attachjavascript-benchmark.zip


2006-03
29

0. 前言

所谓IE地址栏表达式,就是在IE的地址栏中输入 javascript:< 代码>,执行某些功能,来动态改变原有页面的参数以达到某些目的,例如开放被禁止的按钮、显示原本隐藏的图片等等。本文将就IE地址栏的使用方法做一个详细的说明。

阅读全文 »
2006-03
27

DOM对象event仅在事件发生的期间内存在。因此下面这种写法是错误的:

<a href="javascript:alert(window.event.x)">

而应当写成

<a href="#" onclick="alert(window.event.x); return false">

2006-03
27

通常,如果对HTML元素指定了 position: absolute,则可以通过 left、top、pixelLeft等 属性获取该元素的位置和大小。但是不指定 position:absolute 的情况下则不能使用该方法。

幸运的是如果我们想知道的是文本框的位置,则可以使用 textRange 对象来获取。

如果我们有

<input type="text" id="inputbox">

则可以通过以下代码获取其位置:

var inputbox = document.getElementById('inputbox');
var tr = inputbox.createTextRange();
top = tr.boundingTop;
left = tr.boundingLeft;
height = tr.boundingHeight;