Archive for AJAX

FireFox中textNode分片的问题

Ajax应用中很常见的行为便是后台把数据用XML包裹好返回给浏览器,浏览器解析XML,得到nodeValue

如果单个node中内容很长(超过4096字节),这时在FireFox/Mozilla中就要注意了,内容将会被FrieFox分解为多个textNode,每个大小为4096字节。这种情况可以用下列函数处理(IE兼容)

function getNodeValue(node)
{
        if(node && node.hasChildNodes()){
                //return node.firstChild.nodeValue;
                var s=""
                //Mozilla has many textnodes with a size of 4096
                //chars each instead of one large one.
                //They all need to be concatenated.
                for(var j=0;j<node.childNodes.length;j++){
                        s+=new String(node.childNodes.item(j).nodeValue);
                }
                return s;
        }else
                return "";
}

评论(2)

如何用Squid来实现Ajax跨域代理

什么是Ajax跨域代理?

玩Ajax的应该知道我在说什么:) 简单说就是因为浏览器的安全限制,你不能直接获取你站点以外的xml文档。

为什么用Squid来做?

你完全可以自己写一个代理小程序,比如用php,这方面的资料网上很多。
Squid是一个应用非常广泛、功能强大的代理服务器软件,用它自然是为了获得高效。

需要哪些软件?

Lighttpd(Apache)、Squid、squirm。 我这里以lighttpd为例,你完全可以用apache来代替。
这里介绍一下squirm,这是一款为squid量身定做的redirector程序,支持 正规表达式 ,至于什么是redirector下面的工作原理你会知道它的作用。
系统平台:理论上支持上述软件的应该都可以(比如选择常见的linux),我这里以freebsd为例。

工作原理

用Lighttpd(Apache)的proxy模块作前端代理,把特定url的请求发送到squid,比如把 /service/proxy/*/http://othersite.com/abc.xml 这样的请求发送给squid来处理。

squid通过squirm这个redirector对url进行修正(相当于url rewrite),通过squirm的配置文件我们可以把上述url地址重定向为 http://othersite.com/abc.xml ,这个过程对浏览器是透明的完全由squid完成。squid获取 http://othersite.com/abc.xml 后返回给浏览器,这样我们就实现了跨域,在Ajax应用中你如果要获取其他站点的内容就在url前加上 /service/proxy/*/ 即可。

关键配置

相关软件的基本配置网上很容易找到参考,我就不罗嗦了,下面给出关键的配置。

Lighttpd - lighttpd.conf,比如我们的squid将工作在6666端口,就作如下配置

$HTTP["url"] =~ "^/service/proxy/" {
    proxy.server = (
        "" => (
                   (
                        "host" => "127.0.0.1",
                        "port" => 6666
                    )
                )
    )
}

Squid - squid.conf

http_port 6666
redirect_program /usr/local/bin/squirm
redirect_children 5
redirect_rewrites_host_header on
httpd_accel_host virtual
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

squirm
- squirm.conf 主要指定redirector的匹配规则文件的位置

begin
network 0.0.0.0/0
log /var/squid/logs/squirm-private-match.log
abort-log /var/squid/logs/squirm-private-abort.log
pattern common.patterns all
end

- common.patterns 这里的匹配规则文件是 common.patterns

regex ^.*/service/proxy/\*/(.*)$        \1

...
ok,that's all.

相关链接:
Squid: http://www.squid-cache.org
Lighttpd: http://www.lighttpd.net
Apache: http://www.apache.org
Squirm: http://squirm.foote.com.au

注:原文曾发布在http://www.mipang.com/groups/tiandi/t.331.d13577b5f3.htm

评论(0)

AJAX应用中怎样确保得到XML DOM对象?

使返回的xml数据能够作为XML DOM对象来用,需要这么几件事情:

1、服务器返回的头部信息需要 设置 Content-Type: text/xml

2、返回的xml结构中需要有个documentElmement节点,这样可以保证各浏览器之间的兼容。举例来说:
(建议你客户端和服务器端全部使用UTF-8编码,减少因编码问题引起的莫名奇妙问题)

<?xml version="0.1" encoding="UTF-8"?>
<res>
  <data><![CDATA[abc123]]></data>
</res>

这里 res就是documentElement

3、以上面的xml为例,客户端收到responseXML对象后,首先

var doc = responseXML.documentElement; //得到 res,这步很重要
var d = doc.getElementsByTagName('data')[0];
alert( getNodeValue(d) ); //  show 'abc123'

//----------------------
function getNodeValue(node)
{
  if(node && node.hasChildNodes()){
    //return node.firstChild.nodeValue;
    var s="";
    //Mozilla has many textnodes with a size of 4096 chars
    // each instead of one large one.
    //They all need to be concatenated.
    for(var j=0;j<node.childNodes.length;j++){
      s+=new String(node.childNodes.item(j).nodeValue);
    }
    return s;
  }else
    return "";
}

评论(1)