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-09
30

用过 del.icio.us 的人一定知道,该网站的标题栏后面有一个标签输入框, 在输入框中输入标签名即可直接跳转到想要看的标签,而不必从纷繁芜杂的标签云中去寻找。 如果你在 WordPress 中添加了标签云, 一定也想在标题栏后添加一个类似于 del.icio.us 那样的输入框吧。

这里是仿照 del.icio.us 制作的标签输入框代码。attachcrumb.zip 使用方法如下。

  1. 首先按照这个方法打开永久链接。
  2. 下载 prototype,然后将 prototype 和本文附带的 crumb.js 放到你的主题目录下的 js/ 目录下,然后在主题的 header.php 的 <head> 标记内加入以下代码。
    <script type="text/javascript" src="<?php bloginfo('template_directory'); ?>/js/prototype.js"></script>
    <script type="text/javascript" src="<?php bloginfo('template_directory'); ?>/js/crumb.js"></script>
  3. 在你想加入标签输入框的地方加入以下代码(通常是在blog的标题后)。
    <h1 id="pagetitle">
      <a id="top"></a><a href="<?php echo get_settings('home'); ?>/"><?php bloginfo('name'); ?></a>
      <!-- 上面是blog标题,下面是标签输入框的代码 -->
      / <span id="crumb"><?php echo single_cat_title(); ?></span>
      <script>
        if(Crumb) 
          Crumb.go('crumb', '<?php echo get_settings('home').get_settings('category_base').'/'; ?>');
      </script>
      <!-- 标签输入框代码结束 -->
    </h1>
  4. 最后在主题的 style.css 中增加以下代码,以定义标签输入框的样式。
    span#crumb input {
      font-size: 0.7em;
      font-family:verdana,sans-serif;
      background-color: #FFFFFF;
      border: solid 1px #DDDDDD;
      color: #808080;
    }
    span#crumb input.crumb-focus {
      border: solid 1px #000000;
      color: #000000;
    }

2006-06
03

这篇文档描述了如何将第一版的Google Maps API从升级到2006年4月3日发布的第二版。如果你的网站是2006年4月3日之前开发的,你应该依据该文档的说明将你的网站升级到API的最新版本。

阅读全文 »
2006-03
31

这一阵子使用了基于Ajax的PHP-MVC框架Zephyr。官方主页为 http://zephyr-php.sourceforge.net/

该框架的Ajax通信机制使用第三方软件 cpaint (http://cpaint.booleansystems.com/)实现,而视图则使用PHP的官方模板 smarty (http://smarty.php.net/)实现。

基本的开发思想很简单:利用javascript通过Ajax来调用远程的php代码,然后自动地将返回结果显示在某个指定的div元素中。实现了以下的目标:

1. 业务逻辑和画面显示的分离。

业务逻辑完全在php代码中实现,而画面显示则完全由smarty提供的模板语言写成。

2. 完全封装了ajax操作。

利用cpaint完全封装了ajax操作,开发时完全不必考虑ajax的复杂性,而可以像开发windows程序那样进行ajax程序的开发。

3. 解决了动态装入js代码的执行问题。

Ajax应用中有一个很重要的问题,就是通过Ajax动态读入的javascript代码不会被自动执行。而zephyr解决了这个问题。

不过,我也同时发现zephyr的一个缺点。

1. 同时读取多个div的内容会引起冲突。

如果试图同时读取画面上多个div,则会导致显示混乱。这是因为,zephyr使用一个全局变量来保存div的名称,因此同时读取多个div时,仅有最后一个div的名字被保存,导致本应读入到各个div中的内容全部都被装入最后一个div。为解决此问题,应当在zephyr的核心javascript/function.js中增加信号量互斥的操作:仅有得到信号量的更新操作才允许进行,如果获取信号量失败,则等待一定时间之后再次尝试,直到成功为止。这样就能够保证各个更新操作依次执行,而不会引起冲突。