<?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>JerryQu的小站</title>
	<atom:link href="http://www.qgy18.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.qgy18.com</link>
	<description></description>
	<lastBuildDate>Fri, 22 Jan 2010 01:40:21 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>使用Gears获取当前地理位置</title>
		<link>http://www.qgy18.com/2009/09/%e4%bd%bf%e7%94%a8google-gears%e8%8e%b7%e5%8f%96%e5%bd%93%e5%89%8d%e5%9c%b0%e7%90%86%e4%bd%8d%e7%bd%ae/</link>
		<comments>http://www.qgy18.com/2009/09/%e4%bd%bf%e7%94%a8google-gears%e8%8e%b7%e5%8f%96%e5%bd%93%e5%89%8d%e5%9c%b0%e7%90%86%e4%bd%8d%e7%bd%ae/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 15:36:57 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[gears]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=156</guid>
		<description><![CDATA[晚上在Google Code上闲逛，发现google gears从0.4版开始新增了一个获取当前地理位置的Geolocation API。试用了一下，居然准确地找到了我的当前位置，很神奇～
相信大家对Google Gears都已经很熟悉了，三大主要功能：本地存储DataBase、本地服务器LocalServer、任务池WorkerPool，外加一个桌面相关功能DeskTop。如果对Gears的这几个特性不是很了解，可以参看老六写的这篇文章。在我这篇文章里... ]]></description>
			<content:encoded><![CDATA[<p>晚上在Google Code上闲逛，发现google gears从0.4版开始新增了一个获取当前地理位置的<a href="http://code.google.com/apis/gears/api_geolocation.html">Geolocation API</a>。试用了一下，居然准确地找到了我的当前位置，很神奇～<img src="http://www.qgy18.com/wp-content/401705e0-e662-44bc-9099-72c5e4ad7ed7.JPG" alt="401705e0-e662-44bc-9099-72c5e4ad7ed7" title="401705e0-e662-44bc-9099-72c5e4ad7ed7" width="326" height="249" class="alignright size-full wp-image-157" /></p>
<p>相信大家对Google Gears都已经很熟悉了，三大主要功能：本地存储DataBase、本地服务器LocalServer、任务池WorkerPool，外加一个桌面相关功能DeskTop。如果对Gears的这几个特性不是很了解，可以参看老六写的<a href="http://www.welefen.com/2008/09/20/gears/">这篇文章</a>。在我这篇文章里只讨论Geolocation API。</p>
<p>这个API使用起来很简单，下面简单的列一下：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">geo</span><span style="color: Gray;"> = </span><span style="color: Blue;">factory</span><span style="color: Gray;">.</span><span style="color: Blue;">create</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">beta.geolocation</span><span style="color: #8b0000;">'</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//创建geolocation对象</span><span style="color: Gray;"><br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">okCallback</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">d</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: #8b0000;">'</span><span style="color: Red;">当前位置(纬度，经度): </span><span style="color: #8b0000;">'</span><span style="color: Gray;"> + </span><span style="color: Blue;">d</span><span style="color: Gray;">.</span><span style="color: Blue;">latitude</span><span style="color: Gray;"> + </span><span style="color: #8b0000;">'</span><span style="color: Red;">,</span><span style="color: #8b0000;">'</span><span style="color: Gray;"> + </span><span style="color: Blue;">d</span><span style="color: Gray;">.</span><span style="color: Blue;">longitude</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;">;<br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">errorCallback</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">err</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Blue;">err</span><span style="color: Gray;">.</span><span style="color: Blue;">message</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">geo</span><span style="color: Gray;">.</span><span style="color: Blue;">getCurrentPosition</span><span style="color: Olive;">(</span><span style="color: Blue;">okCallback</span><span style="color: Gray;"> , </span><span style="color: Blue;">errorCallback</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
<p>基本就是这样了，在这之前创建factory以及获得permission的代码就不贴了，<a href="http://www.qgy18.com/lab/gears/gears_mini.js">看下源码</a>就OK了。</p>
<p>另外，随手抓包看了下这个API实现的原理，其实就是post当前用户的一些信息给google服务器（我这里，post的数据有wifi的ssid，信号强度啥的），服务器就会返回当前的位置，这个技术上没啥特别的，关键在于数据的丰富程度与是否精确。</p>
<blockquote><p>
<strong>request:</strong><br />
<strong>post</strong> http://www.google.com/loc/json<br />
<strong>data</strong> { &#8220;access_token&#8221; : &#8220;2:FIcsRNHXKylSLYpZ:N7RPZxjyMIX4AiMb&#8221;, &#8220;host&#8221; : &#8220;test.*.*.com&#8221;, &#8220;radio_type&#8221; : &#8220;unknown&#8221;, &#8220;request_address&#8221; : false, &#8220;version&#8221; : &#8220;1.1.0&#8243;, &#8220;wifi_towers&#8221; : [ { "mac_address" : "00-*-*-*-*-ea", "signal_strength" : -73, "ssid" : "***" }, { "mac_address" : "00-*-*-*-*-aa", "signal_strength" : -80, "ssid" : "*-*" }, { "mac_address" : "00-*-*-*-*-ba", "signal_strength" : -44, "ssid" : "*-*" } ] }</p>
<p><strong>response:</strong><br />
{&#8220;location&#8221;:{&#8220;latitude&#8221;:40.050772,&#8221;longitude&#8221;:116.308348,&#8221;accuracy&#8221;:150.0}}
</p></blockquote>
<p>大家有空也可以试一试，看Gears能不能找到你的位置（需要先安装Google Gears，Chrome已经内置了Gears）。<a href="http://www.qgy18.com/lab/gears/">点这里</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/09/%e4%bd%bf%e7%94%a8google-gears%e8%8e%b7%e5%8f%96%e5%bd%93%e5%89%8d%e5%9c%b0%e7%90%86%e4%bd%8d%e7%bd%ae/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>用flash计算图片平均颜色</title>
		<link>http://www.qgy18.com/2009/09/%e7%94%a8flash%e8%ae%a1%e7%ae%97%e5%9b%be%e7%89%87%e5%b9%b3%e5%9d%87%e8%89%b2/</link>
		<comments>http://www.qgy18.com/2009/09/%e7%94%a8flash%e8%ae%a1%e7%ae%97%e5%9b%be%e7%89%87%e5%b9%b3%e5%9d%87%e8%89%b2/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 17:59:17 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=149</guid>
		<description><![CDATA[什么是图片平均色呢？我也不知道它的准确定义，总之看下面这张图就明白了。
算出图片平均色有用么？用来做马赛克拼图的时候肯定会用到。另外，网上也有不少依赖于这个的应用：
Multicolr Search Lab，一个能够根据所选颜色找到flickr图片的网站，计算图片平均色应该是其关键的步骤。
live照片的幻灯片播放界面，背景会随着图片的切换而变化为当前图片的平均色填充，看上... ]]></description>
			<content:encoded><![CDATA[<p>什么是图片平均色呢？我也不知道它的准确定义，总之看下面这张图就明白了。</p>
<p><img src="http://www.qgy18.com/wp-content/2009-09-02_014118.png" alt="2009-09-02_014118" title="2009-09-02_014118" width="232" height="263" class="alignleft size-full wp-image-150" />算出图片平均色有用么？用来做马赛克拼图的时候肯定会用到。另外，网上也有不少依赖于这个的应用：</p>
<p><a href="http://labs.ideeinc.com/multicolr">Multicolr Search Lab</a>，一个能够根据所选颜色找到flickr图片的网站，计算图片平均色应该是其关键的步骤。</p>
<p><a href="http://cid-75092ea9bca0f75b.skydrive.live.com/play.aspx/D2?ref=1">live照片</a>的幻灯片播放界面，背景会随着图片的切换而变化为当前图片的平均色填充，看上去很是自然、和谐。</p>
<p>还有<a href="http://www.opera.com/mini/">Opera Mini</a>，优秀的手机浏览器，细心的同学可能会发现它显示未下载的图片时，会用一个色块代替，当然这个色块也是该图片的平均色。</p>
<p>那么，怎么能得到图片的平均色呢？<a href="http://jandan.net/2007/04/28/cool-tool-to-determine-the-average-color-in-a-photograph.html">这里</a>有煎蛋提供的一个可以完成该功能的软件，这里还有个<a href="http://www.wisegeek.com/how-can-i-find-the-average-color-in-a-photograph.htm">国外的网站</a>也提供了类似的功能。这些桌面程序或者后端程序的实现不属于这篇文章的讨论范畴了，用flash在前端同样可以实现，比如说下面这个Demo。</p>
<p>	<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0" width="360" height="270" id="Flickr1" align="middle"><param name="allowScriptAccess" value="sameDomain" /><param name="allowFullScreen" value="false" /><param name="movie" value="/Flickr_n.swf" /><param name="quality" value="high" /><param name="wmode" value="transparent" /><param name="bgcolor" value="#9ed5e1" /><embed wmode="transparent" src="/Flickr_n.swf" quality="high" bgcolor="#9ed5e1" width="360" height="270" id="Flickr2" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer_cn" /><br />
	</object></p>
<p>我采用的方法是<a href="http://hi.baidu.com/jkisjk">JK</a>提出的。取到图片后，分别读取图片每一个像素R、G、B三种色值，累加起来再除以图片总像素数，也就是图片宽×高，得到R、G、B的平均值，继而得到平均颜色。核心的代码在下面：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">imgData</span><span style="color: Gray;">:</span><span style="color: Teal;">BitmapData</span><span style="color: Gray;"> = </span><span style="color: Blue;">Bitmap</span><span style="color: Olive;">(</span><span style="color: Blue;">img</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">bitmapData</span><span style="color: Gray;">;<br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">red</span><span style="color: Gray;">:</span><span style="color: Teal;">Number</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">blue</span><span style="color: Gray;">:</span><span style="color: Teal;">Number</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">, </span><span style="color: Blue;">green</span><span style="color: Gray;">:</span><span style="color: Teal;">Number</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;">;<br /></span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">i</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;"> ; </span><span style="color: Blue;">i</span><span style="color: Gray;"> &lt; </span><span style="color: Blue;">imgData</span><span style="color: Gray;">.</span><span style="color: Teal;">width</span><span style="color: Gray;">; </span><span style="color: Blue;">i</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">for</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">j</span><span style="color: Gray;"> = </span><span style="color: Maroon;">0</span><span style="color: Gray;"> ; </span><span style="color: Blue;">j</span><span style="color: Gray;"> &lt; </span><span style="color: Blue;">imgData</span><span style="color: Gray;">.</span><span style="color: Teal;">height</span><span style="color: Gray;">; </span><span style="color: Blue;">j</span><span style="color: Gray;">++</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">pixel</span><span style="color: Gray;">:</span><span style="color: Blue;">Pixel</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Pixel</span><span style="color: Olive;">(</span><span style="color: Blue;">imgData</span><span style="color: Gray;">.</span><span style="color: Teal;">getPixel32</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;">, </span><span style="color: Blue;">j</span><span style="color: Olive;">))</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">red</span><span style="color: Gray;"> += </span><span style="color: Blue;">pixel</span><span style="color: Gray;">.</span><span style="color: Blue;">getRed</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">green</span><span style="color: Gray;"> += </span><span style="color: Blue;">pixel</span><span style="color: Gray;">.</span><span style="color: Blue;">getGreen</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">blue</span><span style="color: Gray;"> += </span><span style="color: Blue;">pixel</span><span style="color: Gray;">.</span><span style="color: Blue;">getBlue</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">area</span><span style="color: Gray;">:</span><span style="color: Teal;">Number</span><span style="color: Gray;"> = </span><span style="color: Blue;">imgData</span><span style="color: Gray;">.</span><span style="color: Teal;">width</span><span style="color: Gray;"> * </span><span style="color: Blue;">imgData</span><span style="color: Gray;">.</span><span style="color: Teal;">height</span><span style="color: Gray;">;<br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Teal;">c</span><span style="color: Gray;">:</span><span style="color: Teal;">ColorTransform</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Teal;">ColorTransform</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: Maroon;">1</span><span style="color: Gray;">, </span><span style="color: Maroon;">1</span><span style="color: Gray;">,</span><span style="color: Blue;">red</span><span style="color: #8b0000;">/</span><span style="color: Red;">area, green</span><span style="color: #8b0000;">/</span><span style="color: Blue;">area</span><span style="color: Gray;"> , </span><span style="color: Blue;">blue</span><span style="color: #8b0000;">/</span><span style="color: Red;">area, 0);</span><span style="color: #8b0000;">/</span><span style="color: #ffa500;">//</span><span style="color: Gray;"><br />&nbsp;<br /></span><span style="color: Teal;">trace</span><span style="color: Olive;">(</span><span style="color: Teal;">c</span><span style="color: Gray;">.</span><span style="color: Teal;">color</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;<br /></span><span style="color: #ffa500;">//Pixel</span><span style="color: Gray;"><br /></span><span style="color: Blue;">package</span><span style="color: Gray;"> </span><span style="color: Blue;">com</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">class</span><span style="color: Gray;"> </span><span style="color: Blue;">Pixel</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">value</span><span style="color: Gray;"> : </span><span style="color: Blue;">uint</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">Pixel</span><span style="color: Olive;">(</span><span style="color: Blue;">n1</span><span style="color: Gray;">:</span><span style="color: Blue;">uint</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">value</span><span style="color: Gray;"> = </span><span style="color: Blue;">n1</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">getRed</span><span style="color: Olive;">()</span><span style="color: Gray;">:</span><span style="color: Teal;">int</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">value</span><span style="color: Gray;"> &gt;&gt; </span><span style="color: Maroon;">16</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp; </span><span style="color: Maroon;">0</span><span style="color: Blue;">xFF</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">getGreen</span><span style="color: Olive;">()</span><span style="color: Gray;">:</span><span style="color: Teal;">int</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">value</span><span style="color: Gray;"> &gt;&gt; </span><span style="color: Maroon;">8</span><span style="color: Olive;">)</span><span style="color: Gray;"> &amp; </span><span style="color: Maroon;">0</span><span style="color: Blue;">xFF</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">getBlue</span><span style="color: Olive;">()</span><span style="color: Gray;">:</span><span style="color: Teal;">int</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Blue;">value</span><span style="color: Gray;"> &amp; </span><span style="color: Maroon;">0</span><span style="color: Blue;">xFF</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span></div></div>
<p>原理很简单，代码也不多。关键是看应用场景了，用得好的话很容易就起到锦上添花的效果～</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/09/%e7%94%a8flash%e8%ae%a1%e7%ae%97%e5%9b%be%e7%89%87%e5%b9%b3%e5%9d%87%e8%89%b2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>跨浏览器的“复制到剪贴板”.续</title>
		<link>http://www.qgy18.com/2009/08/clipboard2/</link>
		<comments>http://www.qgy18.com/2009/08/clipboard2/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 14:15:55 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[用户体验]]></category>
		<category><![CDATA[跨浏览器]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=145</guid>
		<description><![CDATA[很早之前，写过一篇“跨浏览器“复制到剪贴板”的解决方案”，当时给出的解决方案是，IE使用window.clipboardData，firefox等其它浏览器使用flash来调用System.setClipboard方法。但是，随着Flash10安全策略更新，只允许在flash内部调用setClipboard方法，那篇文章给出的demo已经失效。我重新写了一个demo，见这里。
新demo是在flash内部调用的setClipboard方法，原则上安装了flash的浏览器都可以用... ]]></description>
			<content:encoded><![CDATA[<p>很早之前，写过一篇“<a href="http://www.qgy18.com/2008/08/clipboard/">跨浏览器“复制到剪贴板”的解决方案</a>”，当时给出的解决方案是，IE使用window.clipboardData，firefox等其它浏览器使用flash来调用System.setClipboard方法。但是，随着<a href="http://www.qgy18.com/2009/01/flash10%e5%ae%89%e5%85%a8%e7%ad%96%e7%95%a5%e6%9b%b4%e6%96%b0/">Flash10安全策略更新</a>，只允许在flash内部调用setClipboard方法，那篇文章给出的demo已经失效。我重新写了一个demo，<a href="http://www.qgy18.com/lab/clipboard2/">见这里</a>。</p>
<p>新demo是在flash内部调用的setClipboard方法，原则上安装了flash的浏览器都可以用；另外，IE7及以上版本用js调用clipboardData会弹出选择是否允许的提示，往往初级用户看到这样提示还以为网站有病毒，所以这次一视同仁所有浏览器都用flash写剪切板。原理比较简单，大概说一下：</p>
<ul>
<li>页面上提供两个js方法getData和copySuccess供flash调用，getData返回需要复制的内容，copySuccess是复制成功的回调函数；</li>
<li>往flash里添加一个任意的DisplayObject，例如TextField，注册Click事件，事件响应函数里先调用页面上的js方法getData得到粘贴内容，再用System.setClipboard写入剪切板，最后通知页面上的copySuccess。</li>
</ul>
<p>完整的代码<a href="http://www.qgy18.com/file/code/2.html">见这里</a>。如果要个性化提示文字，打开clipboard.as，修改后编译即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/08/clipboard2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Javascript与Flash通信全解析</title>
		<link>http://www.qgy18.com/2009/08/flash_externalinterface/</link>
		<comments>http://www.qgy18.com/2009/08/flash_externalinterface/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 09:08:02 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=140</guid>
		<description><![CDATA[刚开始学习flash as3编程，一些学习笔记也丢上来吧，现在还都是些初级的话题～
Flash已经提供了ExternalInterface接口与JavaScript通信，ExternalInterface有两个方法，call和addCallback，call的作用是让Flash调用js里的方法，addCallback是用来注册flash函数让js调用。下面是官方文档对call和addCallback的说明：
利用 ActionScript，可以在 HTML 页上执行以下操作：

调用任何 JavaScript 函数。
传递任意数量... ]]></description>
			<content:encoded><![CDATA[<p>刚开始学习flash as3编程，一些学习笔记也丢上来吧，现在还都是些初级的话题～</p>
<p>Flash已经提供了ExternalInterface接口与JavaScript通信，ExternalInterface有两个方法，call和addCallback，call的作用是让Flash调用js里的方法，addCallback是用来注册flash函数让js调用。下面是官方文档对call和addCallback的说明：</p>
<p>利用 ActionScript，可以在 HTML 页上执行以下操作：</p>
<ul>
<li>调用任何 JavaScript 函数。</li>
<li>传递任意数量、具有任意名称的参数。</li>
<li>传递各种数据类型（Boolean、Number、String 等等）。</li>
<li>接收来自 JavaScript 函数的返回值。</li>
</ul>
<p>通过在 HTML 页上使用 JavaScript，可以：</p>
<ul>
<li>调用 ActionScript 函数。</li>
<li>使用标准的函数调用表示法传递参数。</li>
<li>将值返回给 JavaScript 函数。</li>
</ul>
<p>实际使用的时候，需要注意以下两点：</p>
<p>一、调用时机。js调用flash对象提供的函数时，可能swf还没有完全加载完，此时调用会失败。类似的，flash调用js函数时，也存在js函数还没load到的情况。所以adobe官方示例里采用了一种比较绕的逻辑来避免这种问题：</p>
<ul>
<li>页面上有一个变量_isJSReady，初始为false。还有一个isJSReady函数用来返回_isJSReady的值，供flash调用。在合适的时机（例如：window.onload），将_isJSReady设置为true，表示flash可以使用js里的函数了；</li>
<li>flash里有一个定时器，定期（例如：100ms）去调用页面上的isJSReady方法，直到isJSReady返回true，就可以addCallback，调用页面上的flashReadyHandler方法，通知页面可以跟flash交互了。</li>
</ul>
<p>二、如何获取flash对象。将flash插入到页面有很多方法，例如swfobject.js或者AC_RunActiveContent.js类似的库。我们来看一种最原始的方法，直接在html插入标记来插入flash：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Olive;">&lt;</span><span style="color: Green;">object</span><span style="color: Gray;"> </span><span style="color: #00008b;">classid</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">clsid:d27cdb6e-ae6d-11cf-96b8-444553540000</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> <br /></span><span style="color: #00008b;">codebase</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://download.macromedia.com/pub/shockwave/cabs<br />/flash/swflash.cab#version=10,0,0,0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">width</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">730</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">height</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">520</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">align</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">middle</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">param</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">allowScriptAccess</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">sameDomain</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">param</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">allowFullScreen</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">false</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">param</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">movie</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test.swf</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">param</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">quality</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">high</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">param</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">bgcolor</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#ffffff</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">embed</span><span style="color: Gray;"> </span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test.swf</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">quality</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">high</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">bgcolor</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#ffffff</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">width</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">730</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">height</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">520</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">align</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">middle</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">allowScriptAccess</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">always</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">allowFullScreen</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">false</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">application/x-shockwave-flash</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">pluginspage</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://www.adobe.com/go/getflashplayer_cn</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">object</span><span style="color: Olive;">&gt;</span></div></div>
<p>假设test.swf提供了hello的方法，我们来在js里调用这个方法，代码如下：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">hello</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></div></div>
<p>结果，除了IE之外，其他浏览器都不会工作，会提示找不到hello这个方法。这个问题困扰了我比较久。最后发现：在非IE浏览器里，flash提供的方法是加在embed上的，我们要得到object下的embed对象，调用embed上的方法才会成功！</p>
<p>官方示例是采用下面方法获取flash对象的：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">getFlashMovieObject</span><span style="color: Olive;">(</span><span style="color: Blue;">movieName</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Teal;">window</span><span style="color: Gray;">.</span><span style="color: Teal;">document</span><span style="color: Olive;">[</span><span style="color: Blue;">movieName</span><span style="color: Olive;">]){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Teal;">window</span><span style="color: Gray;">.</span><span style="color: Teal;">document</span><span style="color: Olive;">[</span><span style="color: Blue;">movieName</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Gray;"> </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Teal;">navigator</span><span style="color: Gray;">.</span><span style="color: Blue;">appName</span><span style="color: Gray;">.</span><span style="color: Blue;">indexOf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Microsoft</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">==-</span><span style="color: Maroon;">1</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">embeds</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">embeds</span><span style="color: Olive;">[</span><span style="color: Blue;">movieName</span><span style="color: Olive;">])</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">embeds</span><span style="color: Olive;">[</span><span style="color: Blue;">movieName</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: Blue;">movieName</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span></div></div>
<p>这里罗列出所有情况，当然不会有问题。其实，没必要弄得这么复杂，我们给object和embed取不同名称，例如一个test1，一个test2，如果是IE就getElementById(“test1”)，其它浏览器getElementById(“test2”)就行了。另外，如果使用js插入swf的话，很可能js里就已经做过判断，根据不同浏览器来输出object和embed其中一种。总之，如果调用失败，首先检查得到的flash对象是不是[object HTMLEmbedElement]。</p>
<p>最后，放上一个例子，是我参照官方文档写的。</p>
<p><a href="http://www.qgy18.com/file/code/1.html">点击这里</a></p>
<p>补充一个细节：在傲游里，刷新页面后js调用flash里的方法可能会失败。<a href="http://www.qgy18.com/2008/09/maxthon-bugs/">这篇文章</a>有提到这个问题，解决方法是给swf地址加上随机数，让浏览器每次都重新加载flash。不过这样swf就不能被浏览器缓存，很无语～下面是一段判断傲游的js代码，建议只针对傲游加随机数。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">isMaxthon</span><span style="color: Gray;"> = </span><span style="color: Green;">false</span><span style="color: Gray;">;<br /></span><span style="color: Green;">try</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">external</span><span style="color: Gray;">.</span><span style="color: Blue;">max_language_id</span><span style="color: Gray;"> != </span><span style="color: Blue;">undefined</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">isMaxthon</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Green;">catch</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">e</span><span style="color: Olive;">){}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Blue;">isMaxthon</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/08/flash_externalinterface/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WebIM开发之多页面数据同步</title>
		<link>http://www.qgy18.com/2009/08/webim_data_sync/</link>
		<comments>http://www.qgy18.com/2009/08/webim_data_sync/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 08:01:05 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[WebIM]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=137</guid>
		<description><![CDATA[呃，好久没更新博客了，一来最近确实比较忙，二来人也变懒了，这样很不好～要改变！
今天要讨论的话题是多页面数据同步。顾名思义，就是更新A页面的内容，B页面也要及时反映出改变，当然A、B页面至少要是在同域下才有意义。放在WebIM这个应用场景中来，就是如果有多个页面开着webim，其中任何一个页面上发送或接收到新消息，要在其他所有的页面中同步显示出来。
使... ]]></description>
			<content:encoded><![CDATA[<p>呃，好久没更新博客了，一来最近确实比较忙，二来人也变懒了，这样很不好～要改变！</p>
<p>今天要讨论的话题是多页面数据同步。顾名思义，就是更新A页面的内容，B页面也要及时反映出改变，当然A、B页面至少要是在同域下才有意义。放在WebIM这个应用场景中来，就是如果有多个页面开着webim，其中任何一个页面上发送或接收到新消息，要在其他所有的页面中同步显示出来。</p>
<p>使用短连接的WebIM要轮询服务器来获取最新的消息，如果多个页面一起轮询，那么对服务器的消耗还是很大的，使用页面数据同步能减少消耗：无论同时存在多少个聊天页面，同时仅有一个主页面A负责与服务器轮询；在主页面A轮询到服务器消息后，分发给其他页面B、C、D；如果A被关掉了，检测程序会马上检测到，并从剩下的页面中挑选新的页面充当主页面负责通讯；客户端向服务端提交数据不必通过主页面，直接向服务器提交即可，只是提交的数据也需要分发给其他页面，便于同步UI。</p>
<p>多页面数据同步的实现细化起来，大概就是下面这个流程：</p>
<p>1.有一套本地化存储方案，要求能本域下任何页面都可以读写数据，至少有set和get两个方法；</p>
<p>2.页面加载时实例化sync对象，可以指定页面代号(name)方便进行页面分组，系统自动给每个页面分类一个唯一标识符(clientId)，并将这个页面client的相关信息加入clients列表，放进本地存储；</p>
<p>3.sync提供sendMsg方法，可根据clientID发给单一页面，或根据name发给一组页面，传递的数据(data)是一个JSON，sendMsg方法不关心data的实际结构。将消息的发送者clientID、接收者clientID以及data拼成一个消息JSON，并将多条JSON组成一个消息数组，序列化后放本地存储；</p>
<p>4.sync通过定时检查并解析本地存储获知是否有新消息，在收到发给自己(根据clientID来判断)的消息后，将这条消息置为已读，并调用onNewMsg方法，将data作为参数传递给它；</p>
<p>5.页面unload的时候，需要调用remove方法将自己从clients列表中去除。</p>
<p>另外，每个页面都必须有一个定时器，用来更新clients列表，检查新消息以及删掉已读消息。</p>
<p>新版本的webim应该会采用这种方案来实现多页面聊天，具体代码我也没写完，不过从下面的demo已经可以看到基本思想：打开多个页面，在文本框写些文字，点击同步按钮，其它页面会同步更新文本框。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">sync</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">MsgSync</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test2</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//test2是页面名称(name)</span><span style="color: Gray;"><br /></span><span style="color: Blue;">sync</span><span style="color: Gray;">.</span><span style="color: Blue;">onNewMsg</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">e</span><span style="color: Olive;">){</span><span style="color: Gray;">    </span><span style="color: #ffa500;">//处理其它页面发过来的消息</span><span style="color: Gray;"><br />&nbsp; $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">txt</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">value</span><span style="color: Gray;"> = </span><span style="color: Blue;">e</span><span style="color: Gray;">.</span><span style="color: Blue;">message</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;">;<br />$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">send</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">onclick</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(){</span><span style="color: Gray;"> </span><span style="color: #ffa500;">//向页面名称同为test2的其它页面发送消息</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Blue;">sync</span><span style="color: Gray;">.</span><span style="color: Blue;">sendMsg</span><span style="color: Olive;">({</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">name</span><span style="color: Gray;">:</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test2</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">data</span><span style="color: Gray;">:</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">message</span><span style="color: Gray;">:$</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">txt</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">value</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">false</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></div></div>
<p><a href="http://www.qgy18.com/lab/sync/">点这里打开Demo</a>。</p>
<p>该方案的让人头疼的是用什么做本地存储：userData需要页面完全一致才能使用；globalStorage只有firefox和ie8才支持；flash、google gear需要装插件，database storage是html5里的内容也没几家支持。这样看来似乎只有session cookie比较靠谱，但众所周知每次与服务器的交互都会带上cookie，cookie本身的容量也很有限。但是，相比较每个页面都轮询服务器而言，就算用cookie存也还是值得的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/08/webim_data_sync/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>我的webim被人无耻盗用了～</title>
		<link>http://www.qgy18.com/2009/05/%e6%88%91%e7%9a%84webim%e8%a2%ab%e4%ba%ba%e6%97%a0%e8%80%bb%e7%9b%97%e7%94%a8%e4%ba%86%ef%bd%9e/</link>
		<comments>http://www.qgy18.com/2009/05/%e6%88%91%e7%9a%84webim%e8%a2%ab%e4%ba%ba%e6%97%a0%e8%80%bb%e7%9b%97%e7%94%a8%e4%ba%86%ef%bd%9e/#comments</comments>
		<pubDate>Mon, 18 May 2009 04:14:51 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[未归类]]></category>
		<category><![CDATA[QGYWebIM]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=133</guid>
		<description><![CDATA[今天，一朋友发我一网站，看了差点没让我吐血。。。那网站把我开源的webim拿去弄成英文版的，对我这个作者只字不提，还弄了官方网站、博客和BBS。相比之下，反倒弄得像我是冒牌货似的。
既然完全公开了源代码，其实我早就预料到这样事情的发生，尽管我在说明里写上“仅供学习和研究使用，严禁用于任何商业用途”，但是对于很多站长拿这个去做盈利网站我也就默认... ]]></description>
			<content:encoded><![CDATA[<p>今天，一朋友发我一网站，看了差点没让我吐血。。。那网站把我开源的webim拿去弄成英文版的，对我这个作者只字不提，还弄了官方网站、博客和BBS。相比之下，反倒弄得像我是冒牌货似的。</p>
<p>既然完全公开了源代码，其实我早就预料到这样事情的发生，尽管我在说明里写上“仅供学习和研究使用，严禁用于任何商业用途”，但是对于很多站长拿这个去做盈利网站我也就默认了，偶尔还会无偿提供一下技术支持。</p>
<p>只是，我一再强调，我这个webim只有前端是用心写过的，后端无论是asp还是php都是随便写的，如果要用在非测试环境中，一定要重写后端代码，否则服务器会吃不消，性能也是一个问题。但是<strong>这个骗子网站在未征求我的同意情况下拿我的demo去骗钱，收39$的服务费</strong>，这不能不让人愤慨～</p>
<p>真是林子大了什么鸟都有了。查了一下whois，好像是北京朝阳通州？</p>
<p>附上<strong>骗子</strong>网址：<a href="http://www.fleaim.com"><del datetime="2009-05-18T05:40:26+00:00">www.fleaim.com</del></a></p>
<p>update：估计这骗子订了我blog的rss，在写这篇文章的不久，刚刚网站已经被解析到其他网站了。幸好我已经将所有相关资料都截图了，不知道是不是换其他域名继续坑人，我会持续关注的。</p>
<p>PS：新建了一个QQ群，欢迎对我这个webim或者是前端技术有兴趣的同学加进来探讨，我会抽空解答大家的疑问。<br />
QQ群号：87485493<br />
51JS讨论贴：<a href="http://bbs.51js.com/viewthread.php?tid=77474&#038;extra=page%3D1&#038;page=1">http://bbs.51js.com/viewthread.php?tid=77474&#038;extra=page%3D1&#038;page=1</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/05/%e6%88%91%e7%9a%84webim%e8%a2%ab%e4%ba%ba%e6%97%a0%e8%80%bb%e7%9b%97%e7%94%a8%e4%ba%86%ef%bd%9e/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>轻松去掉web中flash右键菜单</title>
		<link>http://www.qgy18.com/2009/04/noflashmenu/</link>
		<comments>http://www.qgy18.com/2009/04/noflashmenu/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 16:43:11 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[跨浏览器]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=107</guid>
		<description><![CDATA[今天无意中看到一个画面还不错的webgame，随手右键单击看是否用flash写的（我对flash的判断标准是看右键菜单有无About Adobe Flash Player&#8230;字样）,但是点了居然不出任何菜单。记得之前看到要完全干掉flash右键菜单要用到一些很WS的方法，不知道这个webgame怎么实现的。看了一下它的代码，原来是在flash父容器里做文章：firefox下阻止mousedown默认事件及事件传播；IE下给父容器setCaptu... ]]></description>
			<content:encoded><![CDATA[<p>今天无意中看到一个画面还不错的webgame，随手右键单击看是否用flash写的（我对flash的判断标准是看右键菜单有无About Adobe Flash Player&#8230;字样）,但是点了居然不出任何菜单。记得之前看到要完全干掉flash右键菜单要用到一些很WS的方法，不知道这个webgame怎么实现的。看了一下它的代码，原来是在flash父容器里做文章：firefox下阻止mousedown默认事件及事件传播；IE下给父容器setCapture。摘录核心代码稍加改造就是下面这个样子：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">NoRightClick</span><span style="color: Olive;">(</span><span style="color: Blue;">pid</span><span style="color: Olive;">){</span><span style="color: #ffa500;">//pid:flash's parentNode id</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">el</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: Blue;">pid</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">mousedown</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">event</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">event</span><span style="color: Gray;">.</span><span style="color: Blue;">button</span><span style="color: Gray;"> == </span><span style="color: Maroon;">2</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">event</span><span style="color: Gray;">.</span><span style="color: Blue;">stopPropagation</span><span style="color: Olive;">()</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//for firefox</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">event</span><span style="color: Gray;">.</span><span style="color: Blue;">preventDefault</span><span style="color: Olive;">()</span><span style="color: Gray;">;&nbsp; </span><span style="color: #ffa500;">//for chrome</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">,</span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">attachEvent</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">onmousedown</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">event</span><span style="color: Gray;">.</span><span style="color: Blue;">button</span><span style="color: Gray;"> == </span><span style="color: Maroon;">2</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">setCapture</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">attachEvent</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">onmouseup</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">releaseCapture</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">oncontextmenu</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(){</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">false</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span><span style="color: Gray;">;</span></div></div>
<div class="hl-surround"><div class="hl-main"><span style="color: Olive;">&lt;</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">testContent</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">width:800px</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; var so = new SWFObject(&quot;test.swf&quot;, &quot;t1&quot;, &quot;800&quot;, &quot;550&quot;, &quot;9&quot;, &quot;#000000&quot;);<br />&nbsp; so.addParam(&quot;quality&quot;, &quot;high&quot;);<br />&nbsp; so.addParam(&quot;name&quot;, &quot;t1&quot;);<br />&nbsp; so.addParam(&quot;id&quot;, &quot;t1&quot;);<br />&nbsp; so.addParam(&quot;algin&quot;, &quot;middle&quot;);<br />&nbsp; so.addParam(&quot;AllowScriptAccess&quot;, &quot;sameDomain&quot;);<br />&nbsp; so.addParam(&quot;menu&quot;, &quot;false&quot;);<br />&nbsp; so.addParam(&quot;wmode&quot;, &quot;opaque&quot;);<br />&nbsp; so.addParam(&quot;pluginspage&quot;, &quot;http://www.adobe.com/go/getflashplayer&quot;);<br />&nbsp; so.write(&quot;testContent&quot;);<br />&nbsp;<br />&nbsp; NoRightClick(&quot;testContent&quot;);<br />&nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span></div></div>
<p>经过试验，该代码可以在IE、Firefox和Google Chrome里去掉flash的右键菜单，还是挺方便的。至于这样做有什么意义呢？我暂时还没有想到——但网上搜索一下，有这种需求的人还是不少的。</p>
<p><a href="http://www.qgy18.com/lab/noflashmenu/">演示地址</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/04/noflashmenu/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>使用js callback的一个小技巧</title>
		<link>http://www.qgy18.com/2009/04/js_callbac/</link>
		<comments>http://www.qgy18.com/2009/04/js_callbac/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 17:04:50 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=97</guid>
		<description><![CDATA[很多情况下，我们需要跨域读取数据，或者是调用别人json格式的api，都要用到js callback这种机制。通常做法是页面上定义一个A方法，再调用第三方的url并且把回调函数名A传过去。这样做固然没什么问题，但有没有更好的方法呢？
用过jQuery的同学肯定都知道，jQuery有一个getJSON的方法，只需要两个参数（callback地址和匿名函数）就能正常工作。摘录官方示例如下：
$.getJSON(&#34;htt... ]]></description>
			<content:encoded><![CDATA[<p>很多情况下，我们需要跨域读取数据，或者是调用别人json格式的api，都要用到js callback这种机制。通常做法是页面上定义一个A方法，再调用第三方的url并且把回调函数名A传过去。这样做固然没什么问题，但有没有更好的方法呢？</p>
<p>用过jQuery的同学肯定都知道，<a href="http://jQuery.com">jQuery</a>有一个getJSON的方法，只需要两个参数（callback地址和匿名函数）就能正常工作。摘录官方示例如下：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">$.</span><span style="color: Blue;">getJSON</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&amp;tagmode=any&amp;format=json&amp;jsoncallback=?</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp; $.</span><span style="color: Blue;">each</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Gray;">.</span><span style="color: Blue;">items</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;">,</span><span style="color: Blue;">item</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&lt;img/&gt;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">attr</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">src</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">item</span><span style="color: Gray;">.</span><span style="color: Blue;">media</span><span style="color: Gray;">.</span><span style="color: Blue;">m</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">appendTo</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#images</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: Blue;">i</span><span style="color: Gray;"> == </span><span style="color: Maroon;">3</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">false</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></div></div>
<p>很神奇吧！在这个例子中，我们并不用指定callback函数名，回调也仅仅只是一个匿名函数而已，那么它是怎么完成函数调用的呢？去看下jQuery的源代码，你会发现其实原理很简单。如果懒得看太多代码，看看下面我写的山寨版loadJSON，也能明白。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">loadJSON</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Gray;">,</span><span style="color: Blue;">callback</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">cn</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jscallback</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Olive;">(</span><span style="color: Gray;">+</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Teal;">Date</span><span style="color: Olive;">())</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">s</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">createElement</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">script</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Blue;">s</span><span style="color: Gray;">.</span><span style="color: Blue;">type</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Blue;">s</span><span style="color: Gray;">.</span><span style="color: Blue;">src</span><span style="color: Gray;"> = </span><span style="color: Blue;">url</span><span style="color: Gray;"> + </span><span style="color: Blue;">cn</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Teal;">window</span><span style="color: Olive;">[</span><span style="color: Blue;">cn</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">callback</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementsByTagName</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">head</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">appendChild</span><span style="color: Olive;">(</span><span style="color: Blue;">s</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">loadJSON</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&amp;tagmode=any&amp;format=json&amp;jsoncallback=</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">o</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">i</span><span style="color: Gray;">=</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: Blue;">i</span><span style="color: Gray;">&lt;</span><span style="color: Maroon;">3</span><span style="color: Gray;">;</span><span style="color: Blue;">i</span><span style="color: Gray;">++</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">img</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">createElement</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">img</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; </span><span style="color: Blue;">img</span><span style="color: Gray;">.</span><span style="color: Blue;">src</span><span style="color: Gray;"> = </span><span style="color: Blue;">o</span><span style="color: Gray;">.</span><span style="color: Blue;">items</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">media</span><span style="color: Gray;">.</span><span style="color: Blue;">m</span><span style="color: Gray;">;<br />&nbsp;&nbsp; </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">body</span><span style="color: Gray;">.</span><span style="color: Blue;">appendChild</span><span style="color: Olive;">(</span><span style="color: Blue;">img</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Olive;">})</span><span style="color: Gray;">;</span></div></div>
<p><a href="http://www.qgy18.com/lab/callback/">演示地址</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/04/js_callbac/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Flash10安全策略更新</title>
		<link>http://www.qgy18.com/2009/01/flash10%e5%ae%89%e5%85%a8%e7%ad%96%e7%95%a5%e6%9b%b4%e6%96%b0/</link>
		<comments>http://www.qgy18.com/2009/01/flash10%e5%ae%89%e5%85%a8%e7%ad%96%e7%95%a5%e6%9b%b4%e6%96%b0/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 03:59:35 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=91</guid>
		<description><![CDATA[之前写过一篇文章跨浏览器“复制到剪贴板”的解决方案，里面讲到在Firefox下如果安装了Flash，就可以利用js调用flash的setClipboard方法来将一段文字写进系统剪切板。但是最近发现，在很多电脑上这种方法已经失灵了。研究了一下，发现是flash10更新了安全策略：新的策略只允许在flash内部调用setClipboard方法，利用js调用无效；当然，如果在flash里添加事件来执行setClipboard是在允... ]]></description>
			<content:encoded><![CDATA[<p>之前写过一篇文章<a href="http://www.qgy18.com/2008/08/clipboard/">跨浏览器“复制到剪贴板”的解决方案</a>，里面讲到在Firefox下如果安装了Flash，就可以利用js调用flash的setClipboard方法来将一段文字写进系统剪切板。但是最近发现，在很多电脑上这种方法已经失灵了。研究了一下，发现是flash10更新了安全策略：新的策略只允许在flash内部调用setClipboard方法，利用js调用无效；当然，如果在flash里添加事件来执行setClipboard是在允许范围内的。</p>
<p>除了setClipboard的更新外，还有一个比较大的更新就是：FileReference.browse和FileReference.download将只能通过Flash 内容响应鼠标或键盘的操作来使用。也就是说类似于<a href="http://www.swfupload.org/">SWFUpload</a>一类的通过js来打开文件选择框的应用将会无法工作！SWFUpload官方采用&#8221;在SWF中引入一个按钮，用户点击此按钮来触发文件选择对话框的显示&#8221;的方案解决的这一问题。</p>
<p>Flash的这次安全升级给我的启示：最好不要用一种语言来做本来不属于他做的事(例如利用window.name跨域传输数据等等)，尽管这些Hack在很多情况下很好用，但也最容易因为某次更新升级而失效。</p>
<p>参考：<br />
<a href="http://www.jeffothy.com/weblog/clipboard-copy#comment-123736">http://www.jeffothy.com/weblog/clipboard-copy#comment-123736</a><br />
<a href="http://www.v-sky.com/blog/?p=227">http://www.v-sky.com/blog/?p=227</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/01/flash10%e5%ae%89%e5%85%a8%e7%ad%96%e7%95%a5%e6%9b%b4%e6%96%b0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>用Fiddler来调试web应用</title>
		<link>http://www.qgy18.com/2009/01/fiddler-web-debugger/</link>
		<comments>http://www.qgy18.com/2009/01/fiddler-web-debugger/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 07:55:42 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[debugger]]></category>
		<category><![CDATA[fiddler]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=73</guid>
		<description><![CDATA[在测试或者优化web应用时，经常需要替换一些静态资源，如css/image/js等。当然，这些工作是在开发环境来做，直接ftp替换也没什么问题。但有的时候仅仅是想调研一下而不想影响环境的稳定，或者想方便的对比两段代码效果，就可以利用一个小工具来完成工作——Fiddler。
先来简单的介绍下Fiddler(官网&#124;需要.NET Framework v2.0&#124;MicroSoft出品)：一个集web性能分析、数据监测、自... ]]></description>
			<content:encoded><![CDATA[<p>在测试或者优化web应用时，经常需要替换一些静态资源，如css/image/js等。当然，这些工作是在开发环境来做，直接ftp替换也没什么问题。但有的时候仅仅是想调研一下而不想影响环境的稳定，或者想方便的对比两段代码效果，就可以利用一个小工具来完成工作——Fiddler。</p>
<p>先来简单的介绍下Fiddler(<a href="http://www.fiddlertool.com/Fiddler2/">官网</a>|需要.NET Framework v2.0|MicroSoft出品)：一个集web性能分析、数据监测、自动响应、创建请求四大功能于一身，自带众多实用小工具，支持插件扩展的HTTP调试工具。通过简单的配置代理(IE中全自动、FF中需如下图手动配置)，就可以开始使用Fiddler了。</p>
<p><img class="aligncenter size-full wp-image-74" style="border:1px solid #ccc" title="2009-01-11_151753" src="http://www.qgy18.com/wp-content/2009-01-11_151753.png" alt="2009-01-11_151753" width="344" height="128" /></p>
<p>这篇文章讲的只是利用fiddler来替换静态资源，利用的是它的自动响应功能。选择软件右侧的AutoResponder这个tab，点“Add”按钮来添加一条规则，在Rule Editor里的文本框填上要被替换资源的url，后面的文本框选择源文件就OK了。如下图：<br />
<img class="aligncenter size-full wp-image-76" style="border:1px solid #ccc" title="2009-01-11_145020" src="http://www.qgy18.com/wp-content/2009-01-11_145020.png" alt="2009-01-11_145020" width="384" height="33" /></p>
<p><img class="aligncenter size-full wp-image-75" style="border:1px solid #ccc" title="2009-01-11_144953" src="http://www.qgy18.com/wp-content/2009-01-11_144953.png" alt="2009-01-11_144953" width="522" height="81" /></p>
<p>搞定，就这么简单，现在只要请求被命中，就会被转发到指定的源文件了。修改代码后保存一下F5就能生效，既方便又不会影响到他人。这个功能挖掘下还可以干一些其它有意思的事情：配置Rule时，选择转发404之类的错误码，就可以用来测试Ajax的onError事件；把类似于Http://www.***.com/1.html这样的url转发到本地页面，就可以在本地代码里用Ajax请求www.***.com的内容。由于本地页面是通过Http://www.***.com/1.html来访问，不再有跨域问题了。这在做一个获取数据程序的时候很有用。虽说最后还是要用后端程序来解决跨域问题，但开发前期利用Fiiddler做转发，非常的高效！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/01/fiddler-web-debugger/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
