<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>蓝色的华 &#187; javascript</title>
	<atom:link href="http://bluehua.org/tag/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://bluehua.org</link>
	<description>分享所学,backup一切~</description>
	<lastBuildDate>Fri, 13 Apr 2012 14:08:46 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>node.js中mysql-native的掉线重联</title>
		<link>http://bluehua.org/2012/03/21/1826.html</link>
		<comments>http://bluehua.org/2012/03/21/1826.html#comments</comments>
		<pubDate>Wed, 21 Mar 2012 14:35:25 +0000</pubDate>
		<dc:creator>冥王星2011</dc:creator>
				<category><![CDATA[web dev]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mysql-native]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://bluehua.org/?p=1826</guid>
		<description><![CDATA[由于受一篇性能测试的文章的影响，选择了mysql-native作为node的mysql客户端，由于没有自动重联的功能,长时间运行后就会掉线,所以加了一段判断掉线的代码: var Mysql = null; &#160; function MysqlConnect&#40;&#41; &#123; //... } &#160; MysqlSafeQuery = function&#40;sql&#41; &#123; if &#40;!Mysql &#124;&#124; !Mysql.connection.writable&#41; &#123; MysqlConnect&#40;&#41;; &#125; &#160; return Mysql.query&#40;sql&#41;; &#125;]]></description>
			<content:encoded><![CDATA[<p>由于受一篇<a href="http://cnodejs.org/topic/4f16442ccae1f4aa2700112f">性能测试的文章</a>的影响，选择了mysql-native作为node的mysql客户端，由于没有自动重联的功能,长时间运行后就会掉线,所以加了一段判断掉线的代码:</p>

<div class="wp_syntax"><div class="code overflow"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Mysql <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> MysqlConnect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #006600; font-style: italic;">//... }</span>
&nbsp;
MysqlSafeQuery <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>sql<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>Mysql <span style="color: #339933;">||</span> <span style="color: #339933;">!</span>Mysql.<span style="color: #660066;">connection</span>.<span style="color: #660066;">writable</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        MysqlConnect<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000066; font-weight: bold;">return</span> Mysql.<span style="color: #660066;">query</span><span style="color: #009900;">&#40;</span>sql<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://bluehua.org/2012/03/21/1826.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JsonStream.js</title>
		<link>http://bluehua.org/2012/03/21/1808.html</link>
		<comments>http://bluehua.org/2012/03/21/1808.html#comments</comments>
		<pubDate>Wed, 21 Mar 2012 13:02:32 +0000</pubDate>
		<dc:creator>冥王星2011</dc:creator>
				<category><![CDATA[web dev]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[JsonStream]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://bluehua.org/?p=1808</guid>
		<description><![CDATA[JsonStream.js是一个用于node.js的双向通信协议实现，它使用json作为数据包格式，可以用于socket，也可以用于http长连接,同时自带了简单的rpc实现。这段代码现在被用于一个对实时性要求比较高的小项目，本来打算用python+twisted做，但是后来临时决定尝试一下node.js，下面举例说明用法: 第一个例子，最简单的应用，基于socket通信,发送和接受json数据 StreamServer.js var Net = require&#40;'net'&#41;; var JsonStream = require&#40;'./JsonStream.js'&#41;; &#160; //创建一个普通的socket server var server = Net.createServer&#40;function&#40;c&#41; &#123; //当有客户端连接后,socket连接之上创建一个JsonStream var stream = new JsonStream.Stream&#40;c&#41;; &#160; //监听客户端发来的json数据 stream.on&#40;'json', function&#40;json&#41; &#123; console.log&#40;'receiv json from client:'&#41;; console.log&#40;json&#41;; &#125;&#41;; &#160; //没三秒钟向客户端发送一个json数据 setInterval&#40;function&#40;&#41;&#123; stream.write&#40;&#123; data:'hello client', time:new Date&#40;&#41; &#125;&#41;; &#125;, 3000&#41;; &#125;&#41;; &#160; server.listen&#40;7777&#41;; 第二个例子,基于socket，两端互相rpc调用 RpcServer.js var Net = [...]]]></description>
			<content:encoded><![CDATA[<p>JsonStream.js是一个用于node.js的双向通信协议实现，它使用json作为数据包格式，可以用于socket，也可以用于http长连接,同时自带了简单的rpc实现。这段代码现在被用于一个对实时性要求比较高的小项目，本来打算用python+twisted做，但是后来临时决定尝试一下node.js，下面举例说明用法:</p>
<p>第一个例子，最简单的应用，基于socket通信,发送和接受json数据<br />
StreamServer.js</p>

<div class="wp_syntax"><div class="code overflow"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Net <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'net'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> JsonStream <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'./JsonStream.js'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//创建一个普通的socket server</span>
<span style="color: #003366; font-weight: bold;">var</span> server <span style="color: #339933;">=</span> Net.<span style="color: #660066;">createServer</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">//当有客户端连接后,socket连接之上创建一个JsonStream</span>
    <span style="color: #003366; font-weight: bold;">var</span> stream <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> JsonStream.<span style="color: #660066;">Stream</span><span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">//监听客户端发来的json数据</span>
    stream.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'json'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>json<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'receiv json from client:'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>json<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">//没三秒钟向客户端发送一个json数据</span>
    setInterval<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        stream.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
            data<span style="color: #339933;">:</span><span style="color: #3366CC;">'hello client'</span><span style="color: #339933;">,</span>
            time<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">new</span> Date<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
server.<span style="color: #660066;">listen</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">7777</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>第二个例子,基于socket，两端互相rpc调用<br />
RpcServer.js</p>

<div class="wp_syntax"><div class="code overflow"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Net <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'net'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> JsonStream <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'./JsonStream.js'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//定义服务端支持的Rpc接口</span>
<span style="color: #003366; font-weight: bold;">var</span> ServerApi <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">//这是一个普通的接口,直接返回数据</span>
    hello<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000066;">name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'client call hello'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">'hello '</span> <span style="color: #339933;">+</span> <span style="color: #000066;">name</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">//这是一个异步返回的方法</span>
    <span style="color: #006600; font-style: italic;">//这里的SimpleDeferred的确不是一个全功能的Deffered</span>
    <span style="color: #006600; font-style: italic;">//只能用在异步返回的情况</span>
&nbsp;
    helloAfter<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000066;">name</span><span style="color: #339933;">,</span> delay<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'client call helloAfter'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> defer <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> JsonStream.<span style="color: #660066;">SimpleDeferred</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
            defer.<span style="color: #660066;">done</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'hello '</span> <span style="color: #339933;">+</span> <span style="color: #000066;">name</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">' after '</span> <span style="color: #339933;">+</span> delay <span style="color: #339933;">+</span> <span style="color: #3366CC;">'s'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> delay <span style="color: #339933;">*</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">return</span> defer<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> server <span style="color: #339933;">=</span> Net.<span style="color: #660066;">createServer</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> stream <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> JsonStream.<span style="color: #660066;">Stream</span><span style="color: #009900;">&#40;</span>c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    stream.<span style="color: #660066;">delegate</span> <span style="color: #339933;">=</span> ServerApi<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">//每3秒调用一次客户端的say方法</span>
    setInterval<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        stream.<span style="color: #660066;">rpcCall</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'say'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'你好!'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">3000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
server.<span style="color: #660066;">listen</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">7777</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>RpcClient.js中的调用部分</p>

<div class="wp_syntax"><div class="code overflow"><pre class="javascript" style="font-family:monospace;">stream.<span style="color: #660066;">rpcCall</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'hello'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'client a'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
stream.<span style="color: #660066;">rpcCall</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'helloAfter'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'client a'</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
     console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span>res<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>第三个例子，用于长连接的http双向通信,由于客户端的代码和现有的业务框架结合比较紧密，暂不提供，只示意一下Server端的代码,基本使用方法和socket的类似</p>

<div class="wp_syntax"><div class="code overflow"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> Http <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'http'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> JsonStream <span style="color: #339933;">=</span> require<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'./JsonStream.js'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//Rpc接口定义</span>
<span style="color: #003366; font-weight: bold;">var</span> ServerApi <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//创建一个http server</span>
<span style="color: #003366; font-weight: bold;">var</span> HttpServer <span style="color: #339933;">=</span> Http.<span style="color: #660066;">createServer</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>request<span style="color: #339933;">,</span> response<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">//让JsonStream处理所有http请求</span>
    JsonStream.<span style="color: #660066;">HttpStream</span>.<span style="color: #660066;">acceptRequest</span><span style="color: #009900;">&#40;</span>request<span style="color: #339933;">,</span> response<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
JsonStream.<span style="color: #660066;">HttpStream</span>.<span style="color: #660066;">events</span>.<span style="color: #660066;">on</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'new'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>stream<span style="color: #339933;">,</span> request<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    console.<span style="color: #660066;">log</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'new http stream !!!!!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    stream.<span style="color: #660066;">delegate</span> <span style="color: #339933;">=</span> ServerApi<span style="color: #339933;">;</span>
    <span style="color: #006600; font-style: italic;">//发送json到浏览器端</span>
    stream.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        data<span style="color: #339933;">:</span><span style="color: #3366CC;">'hello browser'</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
HttpServer.<span style="color: #660066;">listen</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">80</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//长连接的最大时长设为30秒</span>
JsonStream.<span style="color: #660066;">HttpStream</span>.<span style="color: #660066;">checkTimeOut</span><span style="color: #009900;">&#40;</span><span style="color: #CC0000;">30</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>更多细节详见源码:),经过一段时间的运行，代码已趋于稳定，可以通过svn获取代码和示例,请容忍我的不爱写注释，呵呵～:</p>
<pre>

http://code-of-emptyhua.googlecode.com/svn/trunk/nodejs/jsonstream
</pre>
]]></content:encoded>
			<wfw:commentRss>http://bluehua.org/2012/03/21/1808.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hello lua</title>
		<link>http://bluehua.org/2011/06/23/1650.html</link>
		<comments>http://bluehua.org/2011/06/23/1650.html#comments</comments>
		<pubDate>Thu, 23 Jun 2011 13:31:33 +0000</pubDate>
		<dc:creator>冥王星2011</dc:creator>
				<category><![CDATA[IOS]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://bluehua.org/?p=1650</guid>
		<description><![CDATA[lua将作为下一门新语言学习。如果按照一年学习一门新语言的标准来说，我算超勤快的了。lua被发明的目的便是嵌入C或C++程序，给程序带来编译语言不及的灵活性。 google了一下lua，发现大部分都是做游戏开发的C++程序员的文章，看来不只是魔兽世界在用。 lua做嵌入的优势： 1 . 小，整个解释器不到200K 实际测试: 编译一个空的IOS项目 205K 嵌入Lua后的IOS项目 414K 2 . 运行速度快 实际测试: 做了三个测试程序，分别内嵌lua(静态链接)，javascript(动态链接JavascriptCore,链接库6.4M),python(动态链接python2.6,链接库2.0M) 三个程序都做相同的事情，初始化一个脚本运行环境，打印一个字符串，销毁 比如lua,其他JS和python类似，只不过调用的api不一样: static int lua_printf&#40;lua_State *L&#41; &#123; const char *cmsg = luaL_checkstring&#40;L, 1&#41;; printf&#40;&#34;%s\n&#34;, cmsg&#41;; return 0; &#125; &#160; static void eval_lua&#40;NSString *code&#41; &#123; lua_State *L; L = lua_open&#40;&#41;; luaopen_base&#40;L&#41;; lua_register&#40;L, &#34;printf&#34;, lua_printf&#41;; luaL_loadstring&#40;L, &#91;code cStringUsingEncoding:NSUTF8StringEncoding&#93;&#41;; lua_pcall&#40;L, 0, LUA_MULTRET, [...]]]></description>
			<content:encoded><![CDATA[<p>lua将作为下一门新语言学习。如果按照一年学习一门新语言的标准来说，我算超勤快的了。lua被发明的目的便是嵌入C或C++程序，给程序带来编译语言不及的灵活性。<br />
google了一下lua，发现大部分都是做游戏开发的C++程序员的文章，看来不只是魔兽世界在用。</p>
<p>lua做嵌入的优势：<br />
1 . 小，整个解释器不到200K<br />
实际测试:<br />
编译一个空的IOS项目 205K<br />
嵌入Lua后的IOS项目 414K<br />
2 . 运行速度快<br />
实际测试:<br />
做了三个测试程序，分别内嵌lua(静态链接)，javascript(动态链接JavascriptCore,链接库6.4M),python(动态链接python2.6,链接库2.0M)<br />
三个程序都做相同的事情，初始化一个脚本运行环境，打印一个字符串，销毁<br />
比如lua,其他JS和python类似，只不过调用的api不一样:</p>

<div class="wp_syntax"><div class="code overflow"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">static</span> <span style="color: #a61390;">int</span> lua_printf<span style="color: #002200;">&#40;</span>lua_State <span style="color: #002200;">*</span>L<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
    <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>cmsg <span style="color: #002200;">=</span> luaL_checkstring<span style="color: #002200;">&#40;</span>L, <span style="color: #2400d9;">1</span><span style="color: #002200;">&#41;</span>;
    <span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;%s<span style="color: #2400d9;">\n</span>&quot;</span>, cmsg<span style="color: #002200;">&#41;</span>;
    <span style="color: #a61390;">return</span> <span style="color: #2400d9;">0</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">static</span> <span style="color: #a61390;">void</span> eval_lua<span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>code<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
    lua_State <span style="color: #002200;">*</span>L;
    L <span style="color: #002200;">=</span> lua_open<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span>;
    luaopen_base<span style="color: #002200;">&#40;</span>L<span style="color: #002200;">&#41;</span>;
    lua_register<span style="color: #002200;">&#40;</span>L, <span style="color: #bf1d1a;">&quot;printf&quot;</span>, lua_printf<span style="color: #002200;">&#41;</span>;
    luaL_loadstring<span style="color: #002200;">&#40;</span>L, <span style="color: #002200;">&#91;</span>code cStringUsingEncoding<span style="color: #002200;">:</span>NSUTF8StringEncoding<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
    lua_pcall<span style="color: #002200;">&#40;</span>L, <span style="color: #2400d9;">0</span>, LUA_MULTRET, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span>;
    lua_close<span style="color: #002200;">&#40;</span>L<span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">int</span> main <span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> argc, <span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span> argv<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
    <span style="color: #400080;">NSAutoreleasePool</span> <span style="color: #002200;">*</span>pool <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAutoreleasePool</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
    NSTimeInterval start <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDate</span> timeIntervalSinceReferenceDate<span style="color: #002200;">&#93;</span>;
    eval_lua<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;printf(<span style="color: #2400d9;">\&quot;</span>你好 lua<span style="color: #2400d9;">\&quot;</span>)&quot;</span><span style="color: #002200;">&#41;</span>;
    NSTimeInterval duration <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDate</span> timeIntervalSinceReferenceDate<span style="color: #002200;">&#93;</span> <span style="color: #002200;">-</span> start;
    <span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;total time:%.5f<span style="color: #2400d9;">\n</span>&quot;</span>, duration<span style="color: #002200;">&#41;</span>;
&nbsp;
    <span style="color: #002200;">&#91;</span>pool release<span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">return</span> <span style="color: #2400d9;">0</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>PK结果</p>

<div class="wp_syntax"><div class="code overflow"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-lh</span> <span style="color: #000000; font-weight: bold;">*</span>_test
<span style="color: #660033;">-rwxr-xr-x</span>  <span style="color: #000000;">1</span> hualu  staff    10K  <span style="color: #000000;">6</span> <span style="color: #000000;">23</span> <span style="color: #000000;">20</span>:<span style="color: #000000;">32</span> js_test
<span style="color: #660033;">-rwxr-xr-x</span>  <span style="color: #000000;">1</span> hualu  staff   136K  <span style="color: #000000;">6</span> <span style="color: #000000;">23</span> <span style="color: #000000;">20</span>:<span style="color: #000000;">37</span> lua_test
<span style="color: #660033;">-rwxr-xr-x</span>  <span style="color: #000000;">1</span> hualu  staff   9.4K  <span style="color: #000000;">6</span> <span style="color: #000000;">23</span> <span style="color: #000000;">20</span>:<span style="color: #000000;">32</span> py_test
$ .<span style="color: #000000; font-weight: bold;">/</span>lua_test
你好 lua
total <span style="color: #000000; font-weight: bold;">time</span>:<span style="color: #000000;">0.00018</span>
$ .<span style="color: #000000; font-weight: bold;">/</span>js_test
你好 Javascript
total <span style="color: #000000; font-weight: bold;">time</span>:<span style="color: #000000;">0.00557</span>
$ .<span style="color: #000000; font-weight: bold;">/</span>py_test
你好 Python
total <span style="color: #000000; font-weight: bold;">time</span>:<span style="color: #000000;">0.01311</span></pre></div></div>

<p>3.  lua支持多线程，每个线程可以配置独立的解释器（没有亲测，道听途说)<br />
4. 语法简单，其实这个可以算优点，比JS要简单易懂的多。。。</p>
<p>lua这么小巧的身躯太适合嵌入手机软件了。可以动态的从server上加载一些lua脚本来运行，免去劳烦用户更新软件的烦恼～.就目前所知，愤怒的小鸟是一个混合编程的好例子，关卡的设置均由lua控制。</p>
<p>其实已经有geek为前面三门语言做了Objc的Bridge，项目分别是:<br />
对于lua有<a href="https://github.com/beetlebugorg/wax">wax</a><br />
对于js有<a href="http://code.google.com/p/jscocoa/">jscocoa</a><br />
对于python有<a href="http://pyobjc.sourceforge.net/documentation/index.html">PyObjc</a></p>
<p>而且他们的目的已经不是简单的嵌入Objectivc了，而是代替objc作为MAC或IOS应用的开发语言。。。当然我并不是很赞同这种偷懒的方法，脚本要适度使用。</p>
<p>最后，看的一些资料:<br />
<a href="http://www.codingnow.com/2000/download/lua_manual.html">Lua 5.1 参考手册</a><br />
<a href="http://www.grzmobile.com/blog/2009/11/13/integrating-lua-into-an-iphone-app.html">xcode中添加静态链接库</a><br />
<a href="http://bbs.luaer.cn/read-Lua-tid-83-fpage-2.html">lua和python谁更适用于嵌入MMORPG？</a></p>
]]></content:encoded>
			<wfw:commentRss>http://bluehua.org/2011/06/23/1650.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于js的字符串编码</title>
		<link>http://bluehua.org/2011/04/21/1607.html</link>
		<comments>http://bluehua.org/2011/04/21/1607.html#comments</comments>
		<pubDate>Thu, 21 Apr 2011 15:38:19 +0000</pubDate>
		<dc:creator>冥王星2011</dc:creator>
				<category><![CDATA[我火星]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[unichar]]></category>
		<category><![CDATA[utf-16]]></category>

		<guid isPermaLink="false">http://bluehua.org/?p=1607</guid>
		<description><![CDATA[The String type is the set of all finite ordered sequences of zero or more 16-bit unsigned integer values (“elements”). The String type is generally used to represent textual data in a running ECMAScript program, in which case each element in the String is treated as a code unit value (see Clause 6). Each element [...]]]></description>
			<content:encoded><![CDATA[<p>The String type is the set of all finite ordered sequences of zero or more 16-bit unsigned integer values (“elements”). The String type is generally used to represent textual data in a running ECMAScript program, in which case each element in the String is treated as a code unit value (see Clause 6). Each element is regarded as occupying a position within the sequence. These positions are indexed with nonnegative integers. The first element (if any) is at position 0, the next element (if any) at position 1, and so on. The length of a String is the number of elements (i.e., 16-bit values) within it. The empty String has length zero and therefore contains no elements.<br />
When a String contains actual textual data, each element is considered to be a single UTF-16 code unit. Whether or not this is the actual storage format of a String, the characters within a String are numbered by their initial code unit element position as though they were represented using UTF-16. All operations on Strings (except as otherwise stated) treat them as sequences of undifferentiated 16-bit unsigned integers; they do not ensure the resulting String is in normalised form, nor do they ensure language-sensitive results.</p>
<p>按照ECMA标准，无论引擎底层如何实现，js的字符串看起来都应该是UTF-16编码的字符串，并且每个字符串单元代表一个UTF-16的双字节<br />
例如:<br />
&gt;”中”.length<br />
1<br />
<a href="http://bluehua.org/wp-content/uploads/2011/04/2011-21-04_230411.png"><img class="alignnone size-full wp-image-1612" title="2011-21-04_23:04:11" src="http://bluehua.org/wp-content/uploads/2011/04/2011-21-04_230411.png" alt="" width="111" height="32" /></a>(不知道这是啥特殊字符，发到wordpress有问题，直接贴图，那我是怎么输进去的呢，后面说转义符）<br />
“中”编码成UTF-16为一个双字节0x4E2D,所以长度为１<br />
长的像口的字符编码成UTF-16占４字节 0xD950 0xDF21,占用两个双字节，长度为２<br />
(下面用”口”代替这个特殊字符)<br />
&gt;”口”[0]<br />
“”<br />
&gt;”口”.charCodeAt(0).toString(16)<br />
“d950&#8243;<br />
所以字符串的长度显然是占用双字节的个数，而非我以前想当然认为的实际字符的个数。。。</p>
<p>\udddd形式的转义同样用来表示一个双字节，而非字符本身，”口”用转义符来表示的话:</p>
<p><a href="http://bluehua.org/wp-content/uploads/2011/04/2011-21-04_230440.png"><img class="alignnone size-full wp-image-1613" title="2011-21-04_23:04:40" src="http://bluehua.org/wp-content/uploads/2011/04/2011-21-04_230440.png" alt="" width="118" height="32" /></a></p>
<p>最后我要的结论是：</p>
<p>对于像objective　c里unichar一样的UTF-16编码格式的字符串可以通过@“\\u04x”直接得到json转义串～</p>
]]></content:encoded>
			<wfw:commentRss>http://bluehua.org/2011/04/21/1607.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PPJ回忆录</title>
		<link>http://bluehua.org/2011/01/16/1529.html</link>
		<comments>http://bluehua.org/2011/01/16/1529.html#comments</comments>
		<pubDate>Sun, 16 Jan 2011 09:27:11 +0000</pubDate>
		<dc:creator>冥王星2011</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PPJ]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://bluehua.org/2011/01/16/1529.html</guid>
		<description><![CDATA[个人以为:学一门脚本很容易，但是学几门就是一个痛苦的事，因为我经常把他们搞混。。 于是我下决心写一个能够帮我理清楚的文档，我命之为《PPJ回忆录》,从周5写到今天，精疲力尽，剩下OO和正则部分没写，我决定先歇会~ 毫不客气的说，对于同时学里面任意两门语言的同学，这个文档都会对你有帮助。 &#8212;&#8212;&#8212;&#8211; post by gmail~]]></description>
			<content:encoded><![CDATA[<p>个人以为:学一门脚本很容易，但是学几门就是一个痛苦的事，因为我经常把他们搞混。。</p>
<p>于是我下决心写一个能够帮我理清楚的文档，我命之为<a href="http://bluehua.org/demo/PPJ.html">《PPJ回忆录》</a>,从周5写到今天，精疲力尽，剩下OO和正则部分没写，我决定先歇会~</p>
<p>毫不客气的说，对于同时学里面任意两门语言的同学，这个文档都会对你有帮助。</p>
<p>&#8212;&#8212;&#8212;&#8211;<br />
post by gmail~</p>
]]></content:encoded>
			<wfw:commentRss>http://bluehua.org/2011/01/16/1529.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>一段用于辅助gettxt翻译的vim配置</title>
		<link>http://bluehua.org/2010/10/20/1451.html</link>
		<comments>http://bluehua.org/2010/10/20/1451.html#comments</comments>
		<pubDate>Wed, 20 Oct 2010 03:38:48 +0000</pubDate>
		<dc:creator>冥王星2011</dc:creator>
				<category><![CDATA[soft]]></category>
		<category><![CDATA[gettext]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://bluehua.org/2010/10/20/1451.html</guid>
		<description><![CDATA[看图吧，用得到的话会觉的简直太爽了，^_^ 使用方法： 打开需要标记的文件，输入命令 :GettextMarkStart,开启辅助 选择需要翻译的文本 按_出来提示菜单，选择完成标记 配置：http://code-of-emptyhua.googlecode.com/svn/trunk/vim/addgettextmark.vim &#8212;&#8212;&#8212;&#8211; post by gmail~]]></description>
			<content:encoded><![CDATA[<p>看图吧，用得到的话会觉的简直太爽了，^_^<br />
使用方法：<br />
打开需要标记的文件，输入命令 :GettextMarkStart,开启辅助<br />
选择需要翻译的文本<br />
<a href="http://bluehua.org/wp-content/uploads/2010/10/screenshot_092.png"><img src="http://bluehua.org/wp-content/uploads/2010/10/screenshot_092.png" alt="screenshot_092.png" title="screenshot_092.png"/></a><br />
按_出来提示菜单，选择完成标记<br />
<a href="http://bluehua.org/wp-content/uploads/2010/10/screenshot_093.png"><img src="http://bluehua.org/wp-content/uploads/2010/10/screenshot_093.png" alt="screenshot_093.png" title="screenshot_093.png"/></a></p>
<p>配置：<a href="http://code-of-emptyhua.googlecode.com/svn/trunk/vim/addgettextmark.vim">http://code-of-emptyhua.googlecode.com/svn/trunk/vim/addgettextmark.vim</a></p>
<p>&#8212;&#8212;&#8212;&#8211;<br />
post by gmail~</p>
]]></content:encoded>
			<wfw:commentRss>http://bluehua.org/2010/10/20/1451.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>相对完美的设计思路~</title>
		<link>http://bluehua.org/2010/07/22/1394.html</link>
		<comments>http://bluehua.org/2010/07/22/1394.html#comments</comments>
		<pubDate>Wed, 21 Jul 2010 16:27:31 +0000</pubDate>
		<dc:creator>冥王星2011</dc:creator>
				<category><![CDATA[web dev]]></category>
		<category><![CDATA[all in one]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[web.py]]></category>

		<guid isPermaLink="false">http://bluehua.org/2010/07/22/1394.html</guid>
		<description><![CDATA[有没有可能写一套代码适应以下三种情况: 1. 客户端没有开启javascript，或者使用ucweb一类的弱智浏览器访问时，功能没有影响 2. 客户端开启了javascript，每个页面都有单独加载的js,但是禁用ajax,只帮助用户交互 3. 客户端开启了javascript，为了提高载入速度，尽量使所有操作用ajax完成 略有所得: http://www.blogo2.com 源代码: http://code-of-emptyhua.googlecode.com/svn/trunk/blogo2 没有禁用js的时候，页面切换，表单提交（注册和登录没有用）尽量的使用ajax，而且部分操作会使用弹层(登录后的管理),禁用js之后，则所有操作换成普通表单提交在页面之间跳来跳去。。 还有一个功能没有开启，就是可以选择不用ajax，但是独立开的页面js依然有效。 有兴趣的同学可以check源代码，这种模式的实现: 1. 开发的时候禁用ajax，单个页面开发，而且要求禁用js时业务可以走通，页面内的js和css统一由模板引入。 2. 对需要开启ajax的链接增加hook，例如data-ajax=”dialog:{}”,则表明在开启ajax模式后，点击这个链接需要弹窗 3. ajax模式下只需要对单个页面更换特有的模板，动态加载需要的js和css即可。 这种设计的特点: 1. 尽量一个人包前后端。。 2. json不潮了，ajax返回html代码，优点是js不用套页面了，缺点是流量大 over，虽然没有完美的代码，但是我尽量~ &#8212;&#8212;&#8212;&#8211; post by gmail~]]></description>
			<content:encoded><![CDATA[<p>有没有可能写一套代码适应以下三种情况:<br />
1. 客户端没有开启javascript，或者使用ucweb一类的弱智浏览器访问时，功能没有影响<br />
2. 客户端开启了javascript，每个页面都有单独加载的js,但是禁用ajax,只帮助用户交互<br />
3. 客户端开启了javascript，为了提高载入速度，尽量使所有操作用ajax完成</p>
<p>略有所得: <a href="http://www.blogo2.com">http://www.blogo2.com</a><br />
源代码: <a href="http://code-of-emptyhua.googlecode.com/svn/trunk/blogo2">http://code-of-emptyhua.googlecode.com/svn/trunk/blogo2</a></p>
<p>没有禁用js的时候，页面切换，表单提交（注册和登录没有用）尽量的使用ajax，而且部分操作会使用弹层(登录后的管理),禁用js之后，则所有操作换成普通表单提交在页面之间跳来跳去。。</p>
<p>还有一个功能没有开启，就是可以选择不用ajax，但是独立开的页面js依然有效。</p>
<p>有兴趣的同学可以check源代码，这种模式的实现:<br />
1. 开发的时候禁用ajax，单个页面开发，而且要求禁用js时业务可以走通，页面内的js和css统一由模板引入。<br />
2. 对需要开启ajax的链接增加hook，例如data-ajax=”dialog:{}”,则表明在开启ajax模式后，点击这个链接需要弹窗<br />
3. ajax模式下只需要对单个页面更换特有的模板，动态加载需要的js和css即可。</p>
<p>这种设计的特点:<br />
1. 尽量一个人包前后端。。<br />
2. json不潮了，ajax返回html代码，优点是js不用套页面了，缺点是流量大</p>
<p>over，虽然没有完美的代码，但是我尽量~</p>
<p>&#8212;&#8212;&#8212;&#8211;<br />
post by gmail~</p>
]]></content:encoded>
			<wfw:commentRss>http://bluehua.org/2010/07/22/1394.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>js中简单实现数据和ui绑定</title>
		<link>http://bluehua.org/2010/05/18/1286.html</link>
		<comments>http://bluehua.org/2010/05/18/1286.html#comments</comments>
		<pubDate>Tue, 18 May 2010 09:27:44 +0000</pubDate>
		<dc:creator>冥王星2011</dc:creator>
				<category><![CDATA[web dev]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://bluehua.org/?p=1286</guid>
		<description><![CDATA[很简单的例子 //计数加一 count ++ //更新ui jQuery&#40;'#count'&#41;.text&#40;count&#41;; 相信几乎所有前端工程师都会写过上面这样的代码，更新数据，然后更新ui，行云流水般的。 然而也是相当一部分内测bug的起源，数据删除了，ui里的计数没有变，或者ui变了，数据里确没有删除。而在逻辑复杂的应用里，更是很难保证不出这种低级错误。 其实我们可以通过自定义事件，这样重写 this.data_bind&#40;'count', 'change', function&#40;count&#41; &#123; //更新计数 jQuery&#40;'#count'&#41;.text&#40;count&#41;; &#125;&#41;; .... &#160; this.data_bind&#40;'count', 'change', function&#40;count&#41; &#123; //刷新分页 refresh_pager&#40;count&#41;; &#125;&#41;; &#160; this.set_data&#40;'count', this.get_data&#40;'count'&#41; + 1&#41;; 上次D2上听金大为讲模板技术，当时感觉耳目一新，最近边写边考虑这些新思想，其实使用现有的自定义事件要简单的多，而且灵活性，适用性更好。 用过flex的同学看完这篇文章肯定会说：靠，你们写js的还真是原始社会。。]]></description>
			<content:encoded><![CDATA[<p>很简单的例子</p>

<div class="wp_syntax"><div class="code overflow"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">//</span>计数加一
count ++
<span style="color: #000000; font-weight: bold;">//</span>更新ui
jQuery<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'#count'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>.text<span style="color: #7a0874; font-weight: bold;">&#40;</span>count<span style="color: #7a0874; font-weight: bold;">&#41;</span>;</pre></div></div>

<p>相信几乎所有前端工程师都会写过上面这样的代码，更新数据，然后更新ui，行云流水般的。 然而也是相当一部分内测bug的起源，数据删除了，ui里的计数没有变，或者ui变了，数据里确没有删除。而在逻辑复杂的应用里，更是很难保证不出这种低级错误。</p>
<p>其实我们可以通过自定义事件，这样重写</p>

<div class="wp_syntax"><div class="code overflow"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">data_bind</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'count'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'change'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>count<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">//更新计数</span>
    jQuery<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#count'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">text</span><span style="color: #009900;">&#40;</span>count<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
....
&nbsp;
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">data_bind</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'count'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'change'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>count<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #006600; font-style: italic;">//刷新分页</span>
    refresh_pager<span style="color: #009900;">&#40;</span>count<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">set_data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'count'</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">get_data</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'count'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>上次D2上听金大为讲模板技术，当时感觉耳目一新，最近边写边考虑这些新思想，其实使用现有的自定义事件要简单的多，而且灵活性，适用性更好。</p>
<p>用过flex的同学看完这篇文章肯定会说：靠，你们写js的还真是原始社会。。</p>
]]></content:encoded>
			<wfw:commentRss>http://bluehua.org/2010/05/18/1286.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>js业务框架中对ajax的再次包装</title>
		<link>http://bluehua.org/2010/05/10/1216.html</link>
		<comments>http://bluehua.org/2010/05/10/1216.html#comments</comments>
		<pubDate>Mon, 10 May 2010 08:30:20 +0000</pubDate>
		<dc:creator>冥王星2011</dc:creator>
				<category><![CDATA[web dev]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://bluehua.org/?p=1216</guid>
		<description><![CDATA[一个简单的load动作，如果简单用任何一个js框架实现 startloding&#40;&#41;; new ajax&#40;&#123; url : 'test.php', compete : function&#40;&#41; &#123; stoploading&#40;&#41; &#125;, success : function&#40;data&#41; &#123; try &#123; var obj = json_decode&#40;data&#41;; &#125; catch&#40;e&#41; &#123; //服务异常，未返回json造成异常 error&#40;'服务器异常'&#41;; return; &#125; &#160; //正常的业务逻辑错误 if &#40; json&#91;'code'&#93; !== 0 &#41; &#123; error&#40;json&#91;'desc'&#93;&#41;; return; &#125; &#160; ... &#125;, error : function&#40;&#41; &#123; //网络请求失败造成异常 error&#40;'网络异常'&#41;; &#125; &#125;&#41;; 而一个业务框架对ajax再次包装，成为一个action new [...]]]></description>
			<content:encoded><![CDATA[<p>一个简单的load动作，如果简单用任何一个js框架实现</p>

<div class="wp_syntax"><div class="code overflow"><pre class="javascript" style="font-family:monospace;">startloding<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">new</span> ajax<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    url <span style="color: #339933;">:</span> <span style="color: #3366CC;">'test.php'</span><span style="color: #339933;">,</span>
    compete <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
         stoploading<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    success <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">try</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #003366; font-weight: bold;">var</span> obj <span style="color: #339933;">=</span> json_decode<span style="color: #009900;">&#40;</span>data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #006600; font-style: italic;">//服务异常，未返回json造成异常</span>
            error<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'服务器异常'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #006600; font-style: italic;">//正常的业务逻辑错误</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> json<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'code'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">!==</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            error<span style="color: #009900;">&#40;</span>json<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'desc'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        ...
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
    error <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #006600; font-style: italic;">//网络请求失败造成异常</span>
        error<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'网络异常'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>而一个业务框架对ajax再次包装，成为一个action</p>

<div class="wp_syntax"><div class="code overflow"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">new</span> action<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
    action <span style="color: #339933;">:</span> <span style="color: #3366CC;">'load'</span><span style="color: #339933;">,</span>
    action_name <span style="color: #339933;">:</span> <span style="color: #3366CC;">'加载'</span><span style="color: #339933;">,</span>
    url <span style="color: #339933;">:</span> <span style="color: #3366CC;">'test.php'</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
api.<span style="color: #660066;">add_action</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'load_start'</span><span style="color: #339933;">,</span> startloading<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
api.<span style="color: #660066;">add_action</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'load_complete'</span><span style="color: #339933;">,</span> stoploading<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//这里的成功不是ajax成功，而是判定json['code']之后action真正的成功，这就要求所有action需要有统一的成功判定标准，和json包装格式</span>
api.<span style="color: #660066;">add_action</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'load_success'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>msg<span style="color: #339933;">,</span> data<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>  .... <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//这里没有添加异常处理，因为没有特殊需要，所以action会执行默认的错误处理，可能是一个弹窗</span></pre></div></div>

<p>不仅仅是节省了代码，后者有更好的可读性，load动作本身也具有了更好的重用性</p>
<p>具体的框架代码已经在用，还不是很完美，待贴～</p>
]]></content:encoded>
			<wfw:commentRss>http://bluehua.org/2010/05/10/1216.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>wordpress api的js实现版本</title>
		<link>http://bluehua.org/2010/04/10/1084.html</link>
		<comments>http://bluehua.org/2010/04/10/1084.html#comments</comments>
		<pubDate>Fri, 09 Apr 2010 16:43:32 +0000</pubDate>
		<dc:creator>冥王星2011</dc:creator>
				<category><![CDATA[web dev]]></category>
		<category><![CDATA[action]]></category>
		<category><![CDATA[filter]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://bluehua.org/?p=1084</guid>
		<description><![CDATA[2012 4.4第二版 (感谢kmvan的宝贵意见:)) 主要做了以下修改: 1. 修正在回调中remove注销自己时会出问题 2. 支持add_action(&#8216;ac1&#124;ac2&#8242;, func);的方式一次添加多个action 3. filter也可以传递额外参数 &#40;function&#40;ns&#41; &#123; var filters = &#123;&#125;; var max_priority = 10; var default_priority = 10; &#160; var each = function&#40;a, cb&#41; &#123; a = a.concat&#40;&#91;&#93;&#41;; for &#40;var i = 0, j = a.length; i &#60; j; i ++&#41; &#123; if &#40;cb &#38;&#38; cb&#40;i, a&#91;i&#93;&#41; === [...]]]></description>
			<content:encoded><![CDATA[<p>2012 4.4第二版 (感谢kmvan的宝贵意见:))<br />
主要做了以下修改:<br />
1. 修正在回调中remove注销自己时会出问题<br />
2. 支持add_action(&#8216;ac1|ac2&#8242;, func);的方式一次添加多个action<br />
3. filter也可以传递额外参数</p>

<div class="wp_syntax"><div class="code overflow"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>ns<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> filters <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> max_priority <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> default_priority <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> each <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> cb<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        a <span style="color: #339933;">=</span> a.<span style="color: #660066;">concat</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> j <span style="color: #339933;">=</span> a.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> j<span style="color: #339933;">;</span> i <span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>cb <span style="color: #339933;">&amp;&amp;</span> cb<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> array_include <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> v<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> j <span style="color: #339933;">=</span> a.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> j<span style="color: #339933;">;</span> i <span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">===</span> v<span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> to_array <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> rt <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> j <span style="color: #339933;">=</span> a.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> j<span style="color: #339933;">;</span> i <span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
           rt.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066; font-weight: bold;">return</span> rt<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">function</span> _set<span style="color: #009900;">&#40;</span>func<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> priority<span style="color: #339933;">,</span> key<span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        func<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'__filter_'</span> <span style="color: #339933;">+</span> tag <span style="color: #339933;">+</span> <span style="color: #3366CC;">'_'</span> <span style="color: #339933;">+</span> priority <span style="color: #339933;">+</span> <span style="color: #3366CC;">'_'</span> <span style="color: #339933;">+</span> key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span> 
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">function</span> _get<span style="color: #009900;">&#40;</span>func<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> priority<span style="color: #339933;">,</span> key<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> func<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'__filter_'</span> <span style="color: #339933;">+</span> tag <span style="color: #339933;">+</span> <span style="color: #3366CC;">'_'</span> <span style="color: #339933;">+</span> priority <span style="color: #339933;">+</span> <span style="color: #3366CC;">'_'</span> <span style="color: #339933;">+</span> key<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
    <span style="color: #009900;">&#125;</span>
&nbsp;
    ns.<span style="color: #660066;">add_filter</span> <span style="color: #339933;">=</span> ns.<span style="color: #660066;">add_action</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>tag<span style="color: #339933;">,</span> func<span style="color: #339933;">,</span> priority<span style="color: #339933;">,</span> run_once<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        run_once <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">typeof</span> run_once <span style="color: #339933;">===</span> <span style="color: #3366CC;">'undefined'</span> <span style="color: #339933;">?</span> <span style="color: #003366; font-weight: bold;">false</span> <span style="color: #339933;">:</span> run_once<span style="color: #339933;">;</span>
        priority <span style="color: #339933;">=</span> priority <span style="color: #339933;">||</span> default_priority<span style="color: #339933;">;</span> 
        each<span style="color: #009900;">&#40;</span>tag.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'|'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> tag<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>   
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>priority<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>priority<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>array_include<span style="color: #009900;">&#40;</span>filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>priority<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> func<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>priority<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>func<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            _set<span style="color: #009900;">&#40;</span>func<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> priority<span style="color: #339933;">,</span> <span style="color: #3366CC;">'run_once'</span><span style="color: #339933;">,</span> run_once<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    ns.<span style="color: #660066;">remove_filter</span> <span style="color: #339933;">=</span> ns.<span style="color: #660066;">remove_action</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>tag<span style="color: #339933;">,</span> func<span style="color: #339933;">,</span> priority<span style="color: #339933;">,</span> run_once<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        priority <span style="color: #339933;">=</span> priority <span style="color: #339933;">||</span> default_priority<span style="color: #339933;">;</span>
        each<span style="color: #009900;">&#40;</span>tag.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'|'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> tag<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>priority<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
            <span style="color: #003366; font-weight: bold;">var</span> funcs <span style="color: #339933;">=</span> filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>priority<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
            each<span style="color: #009900;">&#40;</span>funcs<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> f<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
               <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>f <span style="color: #339933;">===</span> func<span style="color: #009900;">&#41;</span>
                    funcs.<span style="color: #660066;">splice</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    ns.<span style="color: #660066;">add_once_filter</span> <span style="color: #339933;">=</span> ns.<span style="color: #660066;">add_once_action</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>tag<span style="color: #339933;">,</span> func<span style="color: #339933;">,</span> priority<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        ns.<span style="color: #660066;">add_filter</span><span style="color: #009900;">&#40;</span>tag<span style="color: #339933;">,</span> func<span style="color: #339933;">,</span> priority<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">function</span> filter_or_action<span style="color: #009900;">&#40;</span>ac<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span> value<span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003366; font-weight: bold;">var</span> args <span style="color: #339933;">=</span> to_array<span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        args.<span style="color: #660066;">shift</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>args.<span style="color: #660066;">shift</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>ac <span style="color: #339933;">===</span> <span style="color: #3366CC;">'filter'</span><span style="color: #009900;">&#41;</span> args.<span style="color: #660066;">shift</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #003366; font-weight: bold;">var</span> _cfs <span style="color: #339933;">=</span> filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> func<span style="color: #339933;">,</span> funcs<span style="color: #339933;">;</span> 
        <span style="color: #003366; font-weight: bold;">var</span> rt <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> breaked <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span> i <span style="color: #339933;">&lt;=</span> max_priority <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            funcs <span style="color: #339933;">=</span> _cfs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>funcs <span style="color: #339933;">||</span> funcs.<span style="color: #660066;">length</span> <span style="color: #339933;">===</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                i <span style="color: #339933;">++;</span>
                <span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            each<span style="color: #009900;">&#40;</span>funcs<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> func<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span> func <span style="color: #339933;">!==</span> <span style="color: #3366CC;">'function'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
&nbsp;
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>ac <span style="color: #339933;">==</span> <span style="color: #3366CC;">'action'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    rt <span style="color: #339933;">=</span> func.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> args<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
                    rt <span style="color: #339933;">=</span> func.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span>rt<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">concat</span><span style="color: #009900;">&#40;</span>args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
&nbsp;
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>_get<span style="color: #009900;">&#40;</span>func<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> <span style="color: #3366CC;">'run_once'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    funcs.<span style="color: #660066;">splice</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span> 
&nbsp;
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> rt <span style="color: #339933;">&amp;&amp;</span> rt<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'end'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    rt <span style="color: #339933;">=</span> rt<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'value'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">||</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
                    breaked <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>breaked<span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span> rt<span style="color: #339933;">;</span>
            i <span style="color: #339933;">++;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066; font-weight: bold;">return</span> rt<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    ns.<span style="color: #660066;">apply_filters</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>tag<span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> args <span style="color: #339933;">=</span> to_array<span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">return</span> filter_or_action.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'filter'</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">concat</span><span style="color: #009900;">&#40;</span>args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    ns.<span style="color: #660066;">do_action</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>tag<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> args <span style="color: #339933;">=</span> to_array<span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        filter_or_action.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'action'</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">concat</span><span style="color: #009900;">&#40;</span>args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
<a href="http://bluehua.org/2009/12/22/751.html">上次提到的一个想法的实现版本</a>,正在应用到偶开发的项目当中~<br />
比wordpress的action和filter增加两个特性</p>
<ul>
<li>能够添加一个只运行一次的action或者filter</li>
<li>可以通过返回{end:true}这种特殊对象来结束一个action或者filter</li>
</ul>
<p>这两个特性在web开发里灰常有用</p>

<div class="wp_syntax"><div class="code overflow"><pre class="javascript" style="font-family:monospace;"><span style="color: #339933;">&lt;</span>html<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #006600; font-style: italic;">//2010.4.10 第一版</span>
<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>ns<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> filters <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> max_priority <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
    <span style="color: #003366; font-weight: bold;">var</span> default_priority <span style="color: #339933;">=</span> <span style="color: #CC0000;">10</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> array_include <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> v<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> j <span style="color: #339933;">=</span> a.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> j<span style="color: #339933;">;</span> i <span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> v <span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> to_array <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> rt <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> j <span style="color: #339933;">=</span> a.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> j<span style="color: #339933;">;</span> i <span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
           rt.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066; font-weight: bold;">return</span> rt<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">function</span> _set<span style="color: #009900;">&#40;</span>func<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> priority<span style="color: #339933;">,</span> key<span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        func<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'__filter_'</span> <span style="color: #339933;">+</span> tag <span style="color: #339933;">+</span> <span style="color: #3366CC;">'_'</span> <span style="color: #339933;">+</span> priority <span style="color: #339933;">+</span> <span style="color: #3366CC;">'_'</span> <span style="color: #339933;">+</span> key<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span> 
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">function</span> _get<span style="color: #009900;">&#40;</span>func<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> priority<span style="color: #339933;">,</span> key<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> func<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'__filter_'</span> <span style="color: #339933;">+</span> tag <span style="color: #339933;">+</span> <span style="color: #3366CC;">'_'</span> <span style="color: #339933;">+</span> priority <span style="color: #339933;">+</span> <span style="color: #3366CC;">'_'</span> <span style="color: #339933;">+</span> key<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
    <span style="color: #009900;">&#125;</span>
&nbsp;
    ns.<span style="color: #660066;">add_filter</span> <span style="color: #339933;">=</span> ns.<span style="color: #660066;">add_action</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>tag<span style="color: #339933;">,</span> func<span style="color: #339933;">,</span> priority<span style="color: #339933;">,</span> run_once<span style="color: #009900;">&#41;</span> 
    <span style="color: #009900;">&#123;</span>
        run_once <span style="color: #339933;">=</span> run_once <span style="color: #339933;">===</span> undefined <span style="color: #339933;">?</span> <span style="color: #003366; font-weight: bold;">false</span> <span style="color: #339933;">:</span> run_once<span style="color: #339933;">;</span>
        priority <span style="color: #339933;">=</span> priority <span style="color: #339933;">||</span> default_priority<span style="color: #339933;">;</span> 
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>   
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>priority<span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>priority<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>array_include<span style="color: #009900;">&#40;</span>filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>priority<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> func<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>priority<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">push</span><span style="color: #009900;">&#40;</span>func<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        _set<span style="color: #009900;">&#40;</span>func<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> priority<span style="color: #339933;">,</span> <span style="color: #3366CC;">'run_once'</span><span style="color: #339933;">,</span> run_once<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    ns.<span style="color: #660066;">add_once_filter</span> <span style="color: #339933;">=</span> ns.<span style="color: #660066;">add_once_action</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>tag<span style="color: #339933;">,</span> func<span style="color: #339933;">,</span> priority<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        ns.<span style="color: #660066;">add_filter</span><span style="color: #009900;">&#40;</span>tag<span style="color: #339933;">,</span> func<span style="color: #339933;">,</span> priority<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">function</span> filter_or_action<span style="color: #009900;">&#40;</span>ac<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span> value<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> ac <span style="color: #339933;">==</span> <span style="color: #3366CC;">'action'</span> <span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #003366; font-weight: bold;">var</span> args <span style="color: #339933;">=</span> to_array<span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            args.<span style="color: #660066;">shift</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            args.<span style="color: #660066;">shift</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #003366; font-weight: bold;">var</span> _cfs <span style="color: #339933;">=</span> filters<span style="color: #009900;">&#91;</span>tag<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> i <span style="color: #339933;">=</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span> func<span style="color: #339933;">;</span> 
        <span style="color: #003366; font-weight: bold;">var</span> rt <span style="color: #339933;">=</span> value<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span> i <span style="color: #339933;">&lt;=</span> max_priority <span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>_cfs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">||</span> _cfs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">length</span> <span style="color: #339933;">===</span> <span style="color: #CC0000;">0</span> <span style="color: #009900;">&#41;</span> 
            <span style="color: #009900;">&#123;</span>
                i <span style="color: #339933;">++;</span>
                <span style="color: #000066; font-weight: bold;">continue</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            <span style="color: #000066; font-weight: bold;">for</span> <span style="color: #009900;">&#40;</span> <span style="color: #003366; font-weight: bold;">var</span> j <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">,</span> length <span style="color: #339933;">=</span> _cfs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> length<span style="color: #339933;">;</span> j <span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#123;</span>
                func <span style="color: #339933;">=</span> _cfs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> ac <span style="color: #339933;">==</span> <span style="color: #3366CC;">'action'</span> <span style="color: #009900;">&#41;</span>
                <span style="color: #009900;">&#123;</span>
                    rt <span style="color: #339933;">=</span> func.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> args<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000066; font-weight: bold;">else</span>
                <span style="color: #009900;">&#123;</span>
                    rt <span style="color: #339933;">=</span> func.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> rt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
&nbsp;
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> _get<span style="color: #009900;">&#40;</span>func<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> <span style="color: #3366CC;">'run_once'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> 
                <span style="color: #009900;">&#123;</span>
                    _cfs<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">splice</span><span style="color: #009900;">&#40;</span>j<span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                    j <span style="color: #339933;">--;</span>
                    length <span style="color: #339933;">--;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span> rt <span style="color: #339933;">&amp;&amp;</span> rt<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'end'</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span> <span style="color: #000066; font-weight: bold;">return</span> rt<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'value'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">||</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
&nbsp;
            i <span style="color: #339933;">++;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066; font-weight: bold;">return</span> rt<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    ns.<span style="color: #660066;">apply_filters</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>tag<span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000066; font-weight: bold;">return</span> filter_or_action<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'fitler'</span><span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> value<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
    ns.<span style="color: #660066;">do_action</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>tag<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #003366; font-weight: bold;">var</span> args <span style="color: #339933;">=</span> to_array<span style="color: #009900;">&#40;</span>arguments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        filter_or_action.<span style="color: #660066;">apply</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'action'</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">concat</span><span style="color: #009900;">&#40;</span>args<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>window<span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> log<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;p&gt;'</span> <span style="color: #339933;">+</span> str <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/p&gt;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//普通的filter</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'status'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> text.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/orz/g</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'超人'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
log<span style="color: #009900;">&#40;</span>apply_filters<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'status'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'orzorz'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #006600; font-style: italic;">//再添加一个filter</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'status'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> text.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'超人'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'动感'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
log<span style="color: #009900;">&#40;</span>apply_filters<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'status'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'orzorz'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//添加一个优先级较高的filter,并通过返回包含end字段的对象结束过滤器</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'status'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>end<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span> value<span style="color: #339933;">:</span>text<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
log<span style="color: #009900;">&#40;</span>apply_filters<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'status'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'orzorz'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//但是下面这个优先级较高的会执行</span>
add_filter<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'status'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>text<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066; font-weight: bold;">return</span> text <span style="color: #339933;">+</span> <span style="color: #3366CC;">'管不着我'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
log<span style="color: #009900;">&#40;</span>apply_filters<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'status'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'orzorz'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
log<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'-----------------------------'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
log<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'action测试'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
log<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'-----------------------------'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//下面是action</span>
add_action<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ac_success'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    log<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'返回数据:'</span> <span style="color: #339933;">+</span>  a <span style="color: #339933;">+</span> b <span style="color: #339933;">+</span> c<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #006600; font-style: italic;">//添加一个只会执行一次的action回调</span>
add_once_action<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ac_success'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    log<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'我只会执行一次的'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
add_action<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ac_success'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    log<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'俺的优先级比较高'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
log<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'----------第一次执行----------------'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
do_action<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ac_success'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'1'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'2'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'3'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
log<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'----------第二次执行----------------'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
do_action<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ac_success'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'4'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'5'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'6'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
add_action<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ac_success'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> b<span style="color: #339933;">,</span> c<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    log<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'全部屏蔽'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #009900;">&#123;</span>end<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span> 
<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
log<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'----------第三次执行----------------'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
do_action<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'ac_success'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'1'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'2'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'3'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #339933;">&lt;/</span>script<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://bluehua.org/2010/04/10/1084.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.731 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-05-22 08:51:42 -->

