<?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>FoxLing - 前端开发 &#187; JS/AJAX/DOM</title>
	<atom:link href="http://foxling.org/category/js-ajax-dom/feed/" rel="self" type="application/rss+xml" />
	<link>http://foxling.org</link>
	<description>我还在寻找方向</description>
	<lastBuildDate>Tue, 10 Apr 2012 16:48:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>从一道题目去了解JS里的类型转换</title>
		<link>http://foxling.org/js-ajax-dom/js_type_conversion/</link>
		<comments>http://foxling.org/js-ajax-dom/js_type_conversion/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 18:32:26 +0000</pubDate>
		<dc:creator>FoxLing</dc:creator>
				<category><![CDATA[JS/AJAX/DOM]]></category>

		<guid isPermaLink="false">http://foxling.org/?p=684</guid>
		<description><![CDATA[前段时间看了玉伯的《一道大题目》，今晚又看到译飞的《类型转换的乐趣》。 记得当时看了玉伯的文章后就知道他在考《命名函数表达式探秘》的内容，并没有太在意，只是觉得对于浏览器或者Javascript的某些怪异现象，有一定的了解就OK，在实际的运用中，肯定是会避免出现这样的问题。 但看到译飞的文章里提到的 [] == ![] //为true 时，的确愣了一下。 最后，译飞还留下了一道思考题： {} == !{}; //返回什么值？ [] == [] //返回什么值？ 把我的兴趣给提了起来，追根究底一翻再睡觉。 [] == [] 不用讲，肯定是false，两个不同的对象。 通过译飞的分析 Step01: [] == ![] // 由于[]是对象，则 ![] 返回fasle，演变为 Step02。 Step02: [] == fasle // 由于 fasle 是 Boolean 值，则转换成数字 0，演变为 Step03。 Step03: [] == 0 // 由于 0是数字，[]是对象，[] 转换成数字 Number([]) -> 0，演变为 [...]]]></description>
			<content:encoded><![CDATA[<p>前段时间看了<a href="http://lifesinger.org/">玉伯</a>的<a href="http://lifesinger.org/blog/2010/10/a-hard-quiz/">《一道大题目》</a>，今晚又看到<a href="http://www.planabc.net/">译飞</a>的<a href="http://www.planabc.net/2010/11/01/funny_type_conversion_in_javascript/">《类型转换的乐趣》</a>。</p>
<p>记得当时看了玉伯的文章后就知道他在考<a href="http://www.cn-cuckoo.com/main/wp-content/uploads/2009/12/named-function-expressions-demystified.html">《命名函数表达式探秘》</a>的内容，并没有太在意，只是觉得对于浏览器或者Javascript的某些怪异现象，有一定的了解就OK，在实际的运用中，肯定是会避免出现这样的问题。</p>
<p>但看到译飞的文章里提到的 <code>[] == ![] //为true</code> 时，的确愣了一下。<br />
最后，译飞还留下了一道思考题：</p>
<pre>
{} == !{}; //返回什么值？
[] == [] //返回什么值？
</pre>
<p>把我的兴趣给提了起来，追根究底一翻再睡觉。<br />
<code>[] == []</code> 不用讲，肯定是false，两个不同的对象。<br />
通过译飞的分析</p>
<blockquote><p>
Step01: [] == ![] // 由于[]是对象，则 ![] 返回fasle，演变为 Step02。<br />
Step02: [] == fasle // 由于 fasle 是 Boolean 值，则转换成数字 0，演变为 Step03。<br />
Step03: [] == 0 // 由于 0是数字，[]是对象，[] 转换成数字 Number([]) -> 0，演变为 Step04。<br />
Step04: 0 == 0 // 返回最终结果：true
</p></blockquote>
<p><code>[] == ![] //为true</code>，同理，<code>{}</code>也是对象，<code>{} == !{};</code>应该也是true。<br />
通过运行得到结果false。很明显，中间还有道道。</p>
<p>通过翻看<a href="http://bclary.com/2004/11/07/">ECMAScript</a>得知，在译飞的Step03：</p>
<blockquote><p>Step03: [] == 0 // 由于 0是数字，[]是对象，[] 转换成数字 Number([]) -> 0，演变为 Step04。</p></blockquote>
<p>针对<code>{}</code>和<code>[]</code>处理的结果是不一样的。</p>
<p>Number([]) ：<br />
Step01: [] 转换成 空字符串<br />
Step02: Number(”) -> 0;</p>
<p>Number({})：<br />
Step01: {} 转换成 &#8216;[object Object]&#8216;<br />
Step01: Number(&#8216;[object Object]&#8216;) -> NaN</p>
<p>结果：<br />
<code>NaN == 0 //false</code></p>
<p>具体见<a href="http://bclary.com/2004/11/07/#a-8.6.2.6">ECMAScript 8.6.2.6</a><br />
还有其它各种类型的转换，可以仔细再看看。</p>
<p>最后，了解浏览器和Javascript的某些怪异现象和特性，可以在项目中避免遇到一些诡异的问题。</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;我只是条无辜的分割线&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>最后的最后，很晚了，睡觉。</p>
]]></content:encoded>
			<wfw:commentRss>http://foxling.org/js-ajax-dom/js_type_conversion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Eclipse里使用ANT合并压缩JS&amp;CSS</title>
		<link>http://foxling.org/js-ajax-dom/in-eclipse-use-ant-concat-compress/</link>
		<comments>http://foxling.org/js-ajax-dom/in-eclipse-use-ant-concat-compress/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 16:38:08 +0000</pubDate>
		<dc:creator>FoxLing</dc:creator>
				<category><![CDATA[JS/AJAX/DOM]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[Aptana]]></category>
		<category><![CDATA[eclipse]]></category>

		<guid isPermaLink="false">http://foxling.org/?p=674</guid>
		<description><![CDATA[Aptana 是一款基于Eclipse的免费开源的软件，非常方便地编写 html, css, js, 有丰富完善的代码提示，包括大部分的 JS 框架的提示，比如 prototype/dojo/jquery/yui 等，相当方便。 由于工作开发环境是 JAVA，于是我用 Eclipse 安装了Aptana 的插件。 ANT，是 Apache 的一个开源项目，用于自动化调用程序完成项目的编译，打包，测试等。 Eclipse 内置了Ant，可以很方便地对JS, CSS进行压缩合并处理。 比如 js, css 文件都放在 web_assets 目录下，那么目录结构如下： web_assets +-- ant-build //存放ant build xml 配置文件 +-- js.build.xml //处理 js 的配置文件 +-- js //最终的js文件 +-- lib //其它依赖的程序 +-- src //源文件 lib目录下有yuicompressor.jar, 用 YUI Compressor 压缩 JavaScript 和 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://aptana.org/">Aptana</a> 是一款基于Eclipse的免费开源的软件，非常方便地编写 html, css, js, 有丰富完善的代码提示，包括大部分的 JS 框架的提示，比如 prototype/dojo/jquery/yui 等，相当方便。<br />
由于工作开发环境是 JAVA，于是我用 <a href="http://eclipse.org/">Eclipse</a> 安装了Aptana 的插件。</p>
<p>ANT，是 Apache 的一个开源项目，用于自动化调用程序完成项目的编译，打包，测试等。<br />
Eclipse 内置了Ant，可以很方便地对JS, CSS进行压缩合并处理。</p>
<p>比如 js, css 文件都放在 web_assets 目录下，那么目录结构如下：</p>
<pre>
web_assets
    +-- ant-build  <span style="color:#999;">//存放ant build xml 配置文件</span>
        +-- js.build.xml <span style="color:#999;">//处理 js 的配置文件</span>
    +-- js  <span style="color:#999;">//最终的js文件</span>
    +-- lib  <span style="color:#999;">//其它依赖的程序</span>
    +-- src  <span style="color:#999;">//源文件</span>
</pre>
<p><span id="more-674"></span></p>
<p>lib目录下有yuicompressor.jar, 用 <a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a> 压缩 JavaScript 和 CSS</p>
<p>ant-bild/js.build.xml 文件内容如下：</p>
<pre>
&lt;project name="js.build" default="clean" basedir="../"&gt;
    &lt;description&gt;js.build for ANT&lt;/description&gt;
    &lt;property name="src" location="src" /&gt;
    &lt;property name="build" location="build" /&gt;
    &lt;property name="target" location="js" /&gt;
    &lt;property name="lib" location="lib"/&gt;
    &lt;property name="charset" value="utf-8"/&gt;

    &lt;target name="init"&gt;
        &lt;mkdir dir="${build}"/&gt;
    &lt;/target&gt;

    &lt;target name="concat" depends="init"&gt;
        &lt;concat destfile="${build}/core.js" encoding="${charset}" outputencoding="${charset}"&gt;
        	&lt;path path="${src}/core.js" /&gt;
		&lt;path path="${src}/dialog.js" /&gt;
        &lt;/concat&gt;
        &lt;replaceregexp match="@DEBUG@" replace="" flags="g" byline="true" file="${build}/core.js" encoding="${charset}" /&gt;
    &lt;/target&gt;

    &lt;target name="compress" depends="concat"&gt;
        &lt;java jar="${lib}/yuicompressor.jar" fork="true"&gt;
            &lt;arg line="--type js --charset utf-8 ${build}/core.js -o ${target}/core.js"/&gt;
        &lt;/java&gt;

    &lt;/target&gt;

    &lt;target name="clean" depends="compress"&gt;
        &lt;delete dir="${build}"/&gt;
    &lt;/target&gt;

&lt;/project&gt;
</pre>
<p>这个 ant 配置文件要经过4个流程：</p>
<ol>
<li>target init 进行初始化处理，创建一个目录build，用于暂存文件；</li>
<li>target concat 合并两个 js 文件，放到 build 目录下；</li>
<li>target compress 调用 Yui Compressor 对合并后的 js 进行压缩</li>
<li>target clean 进行清理动作，删除生成的 build 目录</li>
</ol>
<p>ANT标签和属性解释：</p>
<ul>
<li>project 的 default 对应某个 target 的 name 值，表示默认执行哪个步骤；</li>
<li>target 的 depends 对应其他某些 target 的 name 属性，表示依赖性；</li>
<li>${name} 可以引用 property 中定义的值。</li>
<li>mkdir 标签创建一个目录</li>
<li>replaceregexp, 正则表达式替换，将DEBUG标识替换为空，在正式环境不处理DEBUG信息</li>
<li>注意设置文件的 encoding 属性，否则可能有乱码情况</li>
</ul>
<p>关于ANT的详细文档，请看官方手册：<a href="http://ant.apache.org/manual/">http://ant.apache.org/manual/</a></p>
<p>在 Eclipse 里右击这个文件，选择 Run As -> ANT Build<br />
即可以控制台看到信息：</p>
<pre>
Buildfile: D:\eclipse\workspace\JS-Test\web_assets\ant-build\build.xml
init:
concat:
compress:
clean:
   [delete] Deleting directory D:\eclipse\workspace\JS-Test\web_assets\build
BUILD SUCCESSFUL
Total time: 875 milliseconds
</pre>
<p>这时候 js 目录就生成了合并压缩后的 core.js 文件，相当方便。</p>
]]></content:encoded>
			<wfw:commentRss>http://foxling.org/js-ajax-dom/in-eclipse-use-ant-concat-compress/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>异步脚本加载 JS Loader</title>
		<link>http://foxling.org/js-ajax-dom/async-loading-js/</link>
		<comments>http://foxling.org/js-ajax-dom/async-loading-js/#comments</comments>
		<pubDate>Wed, 09 Jun 2010 15:03:37 +0000</pubDate>
		<dc:creator>FoxLing</dc:creator>
				<category><![CDATA[JS/AJAX/DOM]]></category>

		<guid isPermaLink="false">http://foxling.org/?p=653</guid>
		<description><![CDATA[JS会阻塞其它页面资源的下载，通过对JS的异步加载可以解决这个问题，加快页面内容的呈现速度。获得更好的体验。 使用script标签加载 通过firebug查看各种资源加载状态，当test.js下载完毕后，图片才开始下载。 猛击测试页面block.html 使用JSLoader异步加载JS 当使用异步加载方式加载JS时，test.js与图片同时加载，加快了页面的呈现： 猛击测试页面js-loader JSLoader JSLoader.load(url, [fun1], [funN]); 参数： url 要加载的JS的地址 fun 依赖该JS执行的函数 使用示例： JSLoader.load('test.js', function(){ document.getElementById('test').innerHTML = test; }); 猛击这里下载JSLoader.js JSLoader源码： var JSLoader = function(){ var scripts = {}; function getScript(url){ var script = scripts[url]; if (!script){ script = {loaded:false, funs:[]}; scripts[url] = script; add(script, url); } return script; } function [...]]]></description>
			<content:encoded><![CDATA[<p>JS会阻塞其它页面资源的下载，通过对JS的异步加载可以解决这个问题，加快页面内容的呈现速度。获得更好的体验。</p>
<h3>使用script标签加载</h3>
<p>通过firebug查看各种资源加载状态，当test.js下载完毕后，图片才开始下载。<br />
<img src="http://foxling.org/wp-content/uploads/2010/06/script-block.png" alt="" title="JS将阻塞其它资源下载" width="600" height="113" class="aligncenter size-full wp-image-654" /></p>
<p><a href="/examples/2010/06/js-loader/block.html">猛击测试页面block.html</a></p>
<h3>使用JSLoader异步加载JS</h3>
<p>当使用异步加载方式加载JS时，test.js与图片同时加载，加快了页面的呈现：<br />
<img src="http://foxling.org/wp-content/uploads/2010/06/sync-load.png" alt="" title="异步方式加载JS" width="600" height="130" class="aligncenter size-full wp-image-655" /></p>
<p><a href="/examples/2010/06/js-loader/">猛击测试页面js-loader</a></p>
<h3>JSLoader</h3>
<p>JSLoader.load(url, [fun1], [funN]);<br />
参数：<br />
url 要加载的JS的地址<br />
fun 依赖该JS执行的函数</p>
<p>使用示例：</p>
<pre>
JSLoader.load('test.js', function(){
    document.getElementById('test').innerHTML = test;
});
</pre>
<p><a href="/examples/2010/06/js-loader/jsloader.js">猛击这里下载JSLoader.js</a></p>
<p><span id="more-653"></span></p>
<p>JSLoader源码：</p>
<pre>
var JSLoader = function(){

	var scripts = {};

	function getScript(url){
		var script = scripts[url];
		if (!script){
			script = {loaded:false, funs:[]};
			scripts[url] = script;
			add(script, url);
		}
		return script;
	}

	function run(script){
		var funs = script.funs,
			len = funs.length,
			i = 0;

		for (; i &lt; len; i++){
			var fun = funs.pop();
			fun();
		}
	}

	function add(script, url){
		var scriptdom = document.createElement('script');
		scriptdom.type = 'text/javascript';
		scriptdom.loaded = false;
		scriptdom.src = url;

		scriptdom.onload = function(){
			scriptdom.loaded = true;
			run(script);
			scriptdom.onload = scriptdom.onreadystatechange = null;
		};

		//for ie
		scriptdom.onreadystatechange = function(){
			if ((scriptdom.readyState === 'loaded' ||
					scriptdom.readyState === 'complete') &#038;&#038; !scriptdom.loaded) {

				run(script);
				scriptdom.onload = scriptdom.onreadystatechange = null;
			}
		};

		document.getElementsByTagName('head')[0].appendChild(scriptdom);
	}

	return {
		load: function(url){
			var arg = arguments,
				len = arg.length,
				i = 1,
				script = getScript(url),
				loaded = script.loaded;

			for (; i &lt; len; i++){
				var fun = arg[i];
				if (typeof fun === 'function'){
					if (loaded) {
						fun();
					}else{
						script.funs.push(fun);
					}
				}
			}
		}
	};
}();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://foxling.org/js-ajax-dom/async-loading-js/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>js在IE下获取background-position的问题</title>
		<link>http://foxling.org/js-ajax-dom/get-background-position-fix/</link>
		<comments>http://foxling.org/js-ajax-dom/get-background-position-fix/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 14:30:31 +0000</pubDate>
		<dc:creator>FoxLing</dc:creator>
				<category><![CDATA[JS/AJAX/DOM]]></category>
		<category><![CDATA[backgroundPosition]]></category>
		<category><![CDATA[IE Bug]]></category>

		<guid isPermaLink="false">http://foxling.org/?p=538</guid>
		<description><![CDATA[通过 jQuery 获取 background-position 的值时，在 IE 中返回 undefined 通过测试，发现无论是写在样式表中，还是写在元素style属性里，在 IE ( 6, 7, 8 ) 里获取background-position的值时，均返回undefined。 针对IE的这个bug，写了如下方法获取background-position的值： 请忽略getCSS方法，这是一个简易的获取css的方法，并不完善，了解不同浏览器获取CSS的方法 var getCSS = function(){ var rdashAlpha = /-([a-z])/ig, fcamelCase = function( all, letter ) { return letter.toUpperCase(); }; return function(el, name){ if (typeof el === 'string') el = document.getElementById(el); var cssValue, camelCase = name.replace(rdashAlpha, fcamelCase); if (el.currentStyle){ [...]]]></description>
			<content:encoded><![CDATA[<p>通过 jQuery 获取 background-position 的值时，在 IE 中返回 undefined<br />
通过测试，发现无论是写在样式表中，还是写在元素style属性里，在 IE ( 6, 7, 8 ) 里获取background-position的值时，均返回undefined。</p>
<p>针对IE的这个bug，写了如下方法获取background-position的值：<br />
请忽略getCSS方法，这是一个简易的获取css的方法，并不完善，<a href="http://foxling.org/js-ajax-dom/javascript-get-attribute-css/">了解不同浏览器获取CSS的方法</a></p>
<pre>
var getCSS = function(){
	var rdashAlpha = /-([a-z])/ig,
		fcamelCase = function( all, letter ) {
			return letter.toUpperCase();
		};
	return function(el, name){
		if (typeof el === 'string') el = document.getElementById(el);

		var cssValue,
			camelCase = name.replace(rdashAlpha, fcamelCase);

		if (el.currentStyle){
			cssValue = el.currentStyle[camelCase];
		}else if(window.getComputedStyle){
			cssValue = window.getComputedStyle(el,null)[camelCase];
		}
		return cssValue;
	};
}();

var getBackgroundPosition = function (){
	var s = getCSS(document.body, 'background-position') === undefined;
	return function(el){
		if (s){
			return getCSS(el, 'background-positionX') + ' ' + getCSS(el, 'background-positionY');
		}else{
			return getCSS(el, 'background-position');
		}
	};
}();
</pre>
<p><a href="/examples/2010/04/get-background-position/" class="view-example">猛击DEMO可以看到效果</a></p>
]]></content:encoded>
			<wfw:commentRss>http://foxling.org/js-ajax-dom/get-background-position-fix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Math.PI与++运算符</title>
		<link>http://foxling.org/js-ajax-dom/js-constant/</link>
		<comments>http://foxling.org/js-ajax-dom/js-constant/#comments</comments>
		<pubDate>Sun, 18 Apr 2010 07:50:33 +0000</pubDate>
		<dc:creator>FoxLing</dc:creator>
				<category><![CDATA[JS/AJAX/DOM]]></category>
		<category><![CDATA[Math.PI]]></category>
		<category><![CDATA[Readonly]]></category>
		<category><![CDATA[常量]]></category>

		<guid isPermaLink="false">http://foxling.org/?p=528</guid>
		<description><![CDATA[遇到一道题目： var a = Math.PI++, b = ++Math.PI; alert(a); alert(b); alert(Math.PI); 不加思索的写下： 3.14 4.14 3.14 后来经常提醒才想到Math.PI是常量，修改一个常量的值，会抛出错误。 而上面的操作中，b = ++Math.PI 可以理解为将Math.PI递增加1，并且赋值给变量 b; 这时候开始迟疑了： 在javascript中，给常量赋值是否会抛出错误呢？ 复制代码执行一下，奇怪了，的确和我刚开始不加思索的结果那样，并没有抛出错误。 为什么在javascript中可以对常量进行这样的计算呢？ 翻开ECMAScript规范： This property has the attributes { DontEnum, DontDelete, ReadOnly } 继续找到 ReadOnly 定义： The property is a read-only property. Attempts by ECMAScript code to write to the property will [...]]]></description>
			<content:encoded><![CDATA[<p>遇到一道题目：</p>
<pre>
var a = Math.PI++, b = ++Math.PI;
alert(a);
alert(b);
alert(Math.PI);
</pre>
<p>不加思索的写下：<br />
3.14<br />
4.14<br />
3.14</p>
<p>后来经常提醒才想到Math.PI是常量，修改一个常量的值，会抛出错误。<br />
而上面的操作中，<code>b = ++Math.PI</code> 可以理解为将Math.PI递增加1，并且赋值给变量 b;<br />
这时候开始迟疑了：<br />
 在javascript中，给常量赋值是否会抛出错误呢？<br />
<span id="more-528"></span></p>
<p><a href="/examples/2010/04/readonly.html" class="view-example">复制代码执行一下</a>，奇怪了，的确和我刚开始不加思索的结果那样，并没有抛出错误。<br />
为什么在javascript中可以对常量进行这样的计算呢？</p>
<p><a href="http://bclary.com/2004/11/07/#a-15.8.1.6">翻开ECMAScript规范</a>：</p>
<blockquote><p>This property has the attributes { DontEnum, DontDelete, ReadOnly }</p></blockquote>
<p>继续找到 <a href="http://bclary.com/2004/11/07/#a-8.6.1">ReadOnly</a> 定义：</p>
<blockquote><p>The property is a read-only property. Attempts by ECMAScript code to write to the property will be ignored. (Note, however, that in some cases the value of a property with the ReadOnly attribute may change over time because of actions taken by the host environment; therefore “ReadOnly” does not mean “constant and unchanging”!)</p></blockquote>
<p>对该属性的写入将被忽略。<br />
既然写入被忽略了，那 <code>b = ++Math.PI</code> 为什么是4.14而不是3.14呢。</p>
<p><a href="http://bclary.com/2004/11/07/#a-11.4.4">继续翻看++运算符</a></p>
<blockquote><p>
The production UnaryExpression : ++ UnaryExpression is evaluated as follows:<br />
1. Evaluate UnaryExpression.<br />
2. Call GetValue(Result(1)).<br />
3. Call ToNumber(Result(2)).<br />
4. Add the value 1 to Result(3), using the same rules as for the + operator (see 11.6.3).<br />
5. Call PutValue(Result(1), Result(4)).<br />
6. Return Result(4).
</p></blockquote>
<p>看来并不是给 Math.PI 加上 1 再赋值给 b<br />
而是在Result(3)上加上1，在第5步时，赋值给Math.PI(被忽略)<br />
第6步，返回第4步的值。而不是返回Math.PI</p>
<p>现在，对于开头出现的结果不再感到迷惑了。<br />
遇到问题，不仅仅是需要了解他的正确结果，最好是能了解正确结果是如何得来的。</p>
]]></content:encoded>
			<wfw:commentRss>http://foxling.org/js-ajax-dom/js-constant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>浏览器本地存储(1)</title>
		<link>http://foxling.org/js-ajax-dom/broswer-local-storage/</link>
		<comments>http://foxling.org/js-ajax-dom/broswer-local-storage/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 15:23:34 +0000</pubDate>
		<dc:creator>FoxLing</dc:creator>
				<category><![CDATA[JS/AJAX/DOM]]></category>
		<category><![CDATA[globalStorage]]></category>
		<category><![CDATA[localStorage]]></category>
		<category><![CDATA[sessionStorage]]></category>
		<category><![CDATA[WebStorage]]></category>
		<category><![CDATA[本地存储]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://foxling.org/?p=519</guid>
		<description><![CDATA[浏览器存储方式主要下面几种： Cookie4096字节；缺点：存储量小，请求头附带cookie带来性能问题。 Flash Share Object默认支持100k，跨浏览器存储最好的方式，毕竟现在没有安装flash插件的用户是很少的；缺点：需要加载一个swf文件，个别用户不支持flash。有一个基于jQuery的插件叫 jStore ，就是通过Flash Share Object实现的。 IE的 UserData最少也能支持640k，IE8后已经支持DOM Storage；缺点：IE only。 DOM Storage默认支持5M存储量；缺点：IE7，IE6不支持。 Google Gears功能最强；缺点：但需要安装软件，而且，安装的用户是较少的。 这里主要学习 IE 的 UserData 和 DOM Storage DOM Storage 支持：Firefox, Chrome, Opera, Safari, IE8+ 关于Web Storage的w3c文档，请移步 http://dev.w3.org/html5/webstorage/ DOM Storage 分为两种， sessionStorage 和 localStorage，顾名思义，sessionStorage是指在当前窗口会话中持续保存的数据，哪怕你在不同的网站中跳转也不会清除，但关闭窗口后就没了；localStorage是在本地永久存储的。 方法： key(index) 根据索引获取值 getItem(key) 获取 key 的值 setItem(key, data) 设置 key 的值 removeItem(key) 删除 key [...]]]></description>
			<content:encoded><![CDATA[<h3>浏览器存储方式主要下面几种：</h3>
<ul>
<li>Cookie<br />4096字节；缺点：存储量小，请求头附带cookie带来性能问题。</li>
<li>Flash Share Object<br />默认支持100k，跨浏览器存储最好的方式，毕竟现在没有安装flash插件的用户是很少的；缺点：需要加载一个swf文件，个别用户不支持flash。<br />有一个基于jQuery的插件叫 <a href="http://eric.garside.name/docs.html?p=jstore">jStore</a> ，就是通过Flash Share Object实现的。</li>
<li>IE的 UserData<br />最少也能支持640k，IE8后已经支持DOM Storage；缺点：IE only。</li>
<li>DOM Storage<br />默认支持5M存储量；缺点：IE7，IE6不支持。</li>
<li>Google Gears<br />功能最强；缺点：但需要安装软件，而且，安装的用户是较少的。</li>
</ul>
<p>这里主要学习 IE 的 UserData 和 DOM Storage<br />
<span id="more-519"></span></p>
<h3>DOM Storage</h3>
<p>支持：Firefox, Chrome, Opera, Safari, IE8+<br />
关于Web Storage的w3c文档，请移步 <a href="http://dev.w3.org/html5/webstorage/">http://dev.w3.org/html5/webstorage/</a><br />
DOM Storage 分为两种， sessionStorage 和 localStorage，顾名思义，sessionStorage是指在当前窗口会话中持续保存的数据，哪怕你在不同的网站中跳转也不会清除，但关闭窗口后就没了；localStorage是在本地永久存储的。</p>
<p>方法：</p>
<ul>
<li>key(index) 根据索引获取值</li>
<li>getItem(key) 获取 key 的值</li>
<li>setItem(key, data) 设置 key 的值</li>
<li>removeItem(key) 删除 key</li>
<li>clear() 清除所有的key</li>
</ul>
<p>属性：</p>
<ul>
<li>length 当前存储的个数</li>
</ul>
<h3>IE UserData</h3>
<p>支持：IE5+<br />
关于UserData更详细的文档，请看<a href="http://msdn.microsoft.com/en-us/library/ms531424.aspx">http://msdn.microsoft.com/en-us/library/ms531424.aspx</a><br />
通过给 xml 或者 html 标签添加 behavior 来支持 userData<br />
例如：<br />
<code>&lt;input style="behavior:url('#default#userData')" id="userData"&gt;</code><br />
或者，通过脚本来设置：<br />
<code>object.style.behavior = "url('#default#userData')"</code><br />
<code>object.addBehavior ("#default#userData")</code></p>
<p>方法：</p>
<ul>
<li>getAttribute()  获取指定的属性值。</li>
<li>load(object)  从 userData 存储区载入存储的对象数据。</li>
<li>removeAttribute()  移除对象的指定属性。</li>
<li>save(object)  将对象数据存储到一个 userData 存储区。</li>
<li>setAttribute()  设置指定的属性值。</li>
</ul>
<p>属性：</p>
<ul>
<li>expires  设置或者获取 userData behavior 保存数据的失效日期，不设置则为永久。</li>
<li>XMLDocument 获取 XML 的引用。</li>
</ul>
<h3>兼容的解决方法</h3>
<p>这是我写的一个通用的本地存储的插件，缺点：数据不能跨浏览器，比如在IE里保存的，只能在IE里读取：<br />
测试通过的浏览器：IE6, IE7, IE8, Firefox, Chrome, Safari, Opera</p>
<p>支持的方法：</p>
<ul>
<li>get(key) 读取key的值</li>
<li>set(key, value) 设置key的值</li>
<li>del(key) 删除key</li>
<li>support 检测是否支持本地存储</li>
</ul>
<p>使用示例：<br />
<code>if ( Storage.support() ) Storage.set('username', 'foxling');</code></p>
<p><a href="/examples/2010/04/localStorage/index.html" class="view-example">Demo猛击这里</a></p>
<pre>
var Storage = function(win, doc){
		var hasSupport = true,
			store = win.localStorage,
			STORE_NAME = 'localstorage',
			obj,
			support = function (){ return hasSupport },
			error = function(){ throw new Error("don't support localStorage") };

		if (store &#038;&#038; store.getItem){
			obj = {
				set : function(key, value){
					return store.setItem(key, value);
				},
				get : function(key){
					return store.getItem(key);
				},
				del : function(key){
					return store.removeItem(key);
				}
			};
		}else{
			store = doc.documentElement;
			try{
				store.addBehavior('#default#userdata');
				store.save(STORE_NAME);
			}catch(e){
				hasSupport = false;
			}
			if (hasSupport){
				obj = {
					set : function(key, value){
						store.setAttribute(key, value);
						store.save(STORE_NAME);
					},
					get : function(key){
						store.load(STORE_NAME);
						return store.getAttribute(key);
					},
					del : function(key){
						store.removeAttribute(key);
						store.save(STORE_NAME);
					}
				};

			}
		}
		if (!obj){
			obj = {
				set:error,
				get:error,
				del:error
			};
		}
		obj.support = support;
		return obj;
	}(window, document);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://foxling.org/js-ajax-dom/broswer-local-storage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript Array 性能测试</title>
		<link>http://foxling.org/js-ajax-dom/javascript-array-performance/</link>
		<comments>http://foxling.org/js-ajax-dom/javascript-array-performance/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 14:00:57 +0000</pubDate>
		<dc:creator>FoxLing</dc:creator>
				<category><![CDATA[JS/AJAX/DOM]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[push]]></category>
		<category><![CDATA[性能]]></category>

		<guid isPermaLink="false">http://foxling.eblhost.com/?p=500</guid>
		<description><![CDATA[array.push优化 原生的方法arr.push() 通过arr[arr.length]直接赋值 把方法二写成一个函数方便调用 测试结果请猛击这里： /examples/2010/03/array-performance/push.html 测试结果： 给arr[arr.length]直接赋值比push方法快 函数调用增加了开销，特别是在IE6和opera下表现明显 Chrome应该是做了优化，相差不大 待续(也许) =，=&#8230;&#8230;.]]></description>
			<content:encoded><![CDATA[<h3>array.push优化</h3>
<ul>
<li>原生的方法arr.push()</li>
<li>通过arr[arr.length]直接赋值</li>
<li>把方法二写成一个函数方便调用</li>
</ul>
<p>测试结果请猛击这里：<br />
<a href="/examples/2010/03/array-performance/push.html">/examples/2010/03/array-performance/push.html</a></p>
<p>测试结果：</p>
<ul>
<li>给arr[arr.length]直接赋值比push方法快</li>
<li>函数调用增加了开销，特别是在IE6和opera下表现明显</li>
<li>Chrome应该是做了优化，相差不大</li>
</ul>
<p>待续(也许) =，=&#8230;&#8230;.</p>
]]></content:encoded>
			<wfw:commentRss>http://foxling.org/js-ajax-dom/javascript-array-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TextArea光标位置插入文字</title>
		<link>http://foxling.org/js-ajax-dom/cross-browser-cursor-position-in-textarea/</link>
		<comments>http://foxling.org/js-ajax-dom/cross-browser-cursor-position-in-textarea/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 07:06:03 +0000</pubDate>
		<dc:creator>FoxLing</dc:creator>
				<category><![CDATA[JS/AJAX/DOM]]></category>
		<category><![CDATA[moveEnd]]></category>
		<category><![CDATA[moveStart]]></category>
		<category><![CDATA[selection]]></category>
		<category><![CDATA[selectionEnd]]></category>
		<category><![CDATA[selectionStart]]></category>
		<category><![CDATA[TextArea]]></category>
		<category><![CDATA[光标位置]]></category>

		<guid isPermaLink="false">http://foxling.org/?p=439</guid>
		<description><![CDATA[需要实现：在光标位置处插入文字，以及获取焦点后光标位置处于文字末尾。 以前一直没有做过，今天了解了一下后实现并记录在此。 各浏览器TextArea获得焦点后的光标位置情况： textarea.focus() FireFox: 所有文字结束处 IE: 文字开头 Opera: 文字开头 Chrome: 文字开头 Safari: 文字开头 IE支持document.selection Firefox，Chrome,Safari以及Opera都有selectionStart和selectionEnd属性 针对浏览器的特性进行判断并实现，代码如下： function insertText(obj,str) { if (document.selection) { var sel = document.selection.createRange(); sel.text = str; } else if (typeof obj.selectionStart === 'number' &#038;&#038; typeof obj.selectionEnd === 'number') { var startPos = obj.selectionStart, endPos = obj.selectionEnd, cursorPos = startPos, tmpStr = [...]]]></description>
			<content:encoded><![CDATA[<p>需要实现：在光标位置处插入文字，以及获取焦点后光标位置处于文字末尾。<br />
以前一直没有做过，今天了解了一下后实现并记录在此。</p>
<p>各浏览器TextArea获得焦点后的光标位置情况：</p>
<pre>textarea.focus()</pre>
<ul>
<li>FireFox: 所有文字结束处</li>
<li>IE: 文字开头</li>
<li>Opera: 文字开头</li>
<li>Chrome: 文字开头</li>
<li>Safari: 文字开头</li>
</ul>
<p>IE支持document.selection<br />
Firefox，Chrome,Safari以及Opera都有selectionStart和selectionEnd属性<br />
针对浏览器的特性进行判断并实现，代码如下：</p>
<pre>
function insertText(obj,str) {
	if (document.selection) {
		var sel = document.selection.createRange();
		sel.text = str;
	} else if (typeof obj.selectionStart === 'number' &#038;&#038; typeof obj.selectionEnd === 'number') {
		var startPos = obj.selectionStart,
			endPos = obj.selectionEnd,
			cursorPos = startPos,
			tmpStr = obj.value;
		obj.value = tmpStr.substring(0, startPos) + str + tmpStr.substring(endPos, tmpStr.length);
		cursorPos += str.length;
		obj.selectionStart = obj.selectionEnd = cursorPos;
	} else {
		obj.value += str;
	}
}
function moveEnd(obj){
	obj.focus();
	var len = obj.value.length;
	if (document.selection) {
		var sel = obj.createTextRange();
		sel.moveStart('character',len);
		sel.collapse();
		sel.select();
	} else if (typeof obj.selectionStart == 'number' &#038;&#038; typeof obj.selectionEnd == 'number') {
		obj.selectionStart = obj.selectionEnd = len;
	}
}
</pre>
<p><a href="/examples/cursor_position_in_textarea/index.html">Demo猛击这里</a></p>
<p>关于IE TextRange 对象的方法与属性介绍：<br />
<a href="http://msdn.microsoft.com/zh-cn/library/ms535872%28en-us,VS.85%29.aspx" target="_blank">http://msdn.microsoft.com/zh-cn/library/ms535872%28en-us,VS.85%29.aspx</a></p>
<p>TextArea对象的属性：<a href="https://developer.mozilla.org/en/DOM/TextArea" target="_blank">https://developer.mozilla.org/en/DOM/TextArea</a></p>
]]></content:encoded>
			<wfw:commentRss>http://foxling.org/js-ajax-dom/cross-browser-cursor-position-in-textarea/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>小技巧，跨域关闭iframe</title>
		<link>http://foxling.org/js-ajax-dom/remove-iframe-cross-domain/</link>
		<comments>http://foxling.org/js-ajax-dom/remove-iframe-cross-domain/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 13:35:52 +0000</pubDate>
		<dc:creator>FoxLing</dc:creator>
				<category><![CDATA[JS/AJAX/DOM]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[跨域]]></category>

		<guid isPermaLink="false">http://foxling.cn/?p=420</guid>
		<description><![CDATA[示例 DEMO猛击这里 解决方法 直接看代码吧： function Dialog(){ this.panel = document.createElement('div'); this.panel.id = 'bmPanel'; this.panel.style.position = 'absolute'; this.panel.style.right = '0px'; this.panel.style.right = this.scrollTop() + 'px'; this.panel.style.zIndex = 100000; this.panel.style.margin = '10px'; this.panel.style.width = '200px'; this.panel.style.height = '200px'; this.panel.style.border = '5px solid #CCC'; this.panel.innerHTML = '&#60;iframe id="bmIframe" ' + 'token="1" onload="c = this.getAttribute(\'token\'); if (c==3) {this.parentNode.parentNode.removeChild(this.parentNode)} this.setAttribute(\'token\',++c);"' + [...]]]></description>
			<content:encoded><![CDATA[<h3>示例</h3>
<p><a href="/examples/close-iframe/remove-iframe.html">DEMO猛击这里</a></p>
<h3>解决方法</h3>
<p>直接看代码吧：</p>
<pre>
function Dialog(){
	this.panel = document.createElement('div');
	this.panel.id = 'bmPanel';
	this.panel.style.position = 'absolute';
	this.panel.style.right = '0px';
	this.panel.style.right = this.scrollTop() + 'px';
	this.panel.style.zIndex = 100000;
	this.panel.style.margin = '10px';
	this.panel.style.width = '200px';
	this.panel.style.height = '200px';
	this.panel.style.border = '5px solid #CCC';
	this.panel.innerHTML = '&lt;iframe id="bmIframe" '
		+ 'token="1" onload="c = this.getAttribute(\'token\'); if (c==3) {this.parentNode.parentNode.removeChild(this.parentNode)} this.setAttribute(\'token\',++c);"'
		+ 'name="bmIframe" src="main.html" scrolling="no" frameborder="0" style="width:100%; height:100%; '
		+ 'border:1px; padding:0px; margin:0px"&gt;&lt;/iframe&gt;';
}

Dialog.prototype.show = function(){
	document.body.appendChild(this.panel);
}

Dialog.prototype.scrollTop = function (){
	return document.documentElement &#038;&#038; document.documentElement.scrollTop || document.body.scrollTop;
}
</pre>
<p>注意iframe这一行：</p>
<pre>
onload="c = this.getAttribute(\'token\'); if (c==3) {this.parentNode.parentNode.removeChild(this.parentNode)} this.setAttribute(\'token\',++c);"
</pre>
<p>iframe里的关闭按钮链接一个简单的页面，通过不停地提交表单触发load事件，让token累加：</p>
<pre>
&lt;body onload="document.getElementById('close').submit()"&gt;
	&lt;form id="close" action="closeing.html" method="get"&gt;&lt;/form&gt;
&lt;/body&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://foxling.org/js-ajax-dom/remove-iframe-cross-domain/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>玩转嘀咕网的嘀咕秀(Widget)</title>
		<link>http://foxling.org/html-css-xml/digu-show-js-widget/</link>
		<comments>http://foxling.org/html-css-xml/digu-show-js-widget/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 16:19:46 +0000</pubDate>
		<dc:creator>FoxLing</dc:creator>
				<category><![CDATA[HTML/CSS/XML]]></category>
		<category><![CDATA[JS/AJAX/DOM]]></category>
		<category><![CDATA[杂七杂八]]></category>
		<category><![CDATA[Widget]]></category>
		<category><![CDATA[嘀咕秀]]></category>
		<category><![CDATA[嘀咕网]]></category>

		<guid isPermaLink="false">http://foxling.cn/?p=283</guid>
		<description><![CDATA[一直郁闷嘀咕网没有开发JS的博客插件，今天终于看到这款APP出来啦，嘀咕秀：http://www.digushow.com。 一共提供了三种Widget，Flash版的，图片版，以及JS版。 图片版一般是用于论坛签名，效果如下： 其实，任何支持HTML代码，或者支持图片的地方，都可以加上你的图片签名，如果你要在你的网页中插入图片签名，只需要添加如下代码： &#60;img src="http://digushow.com/sign/foxling/bbs_sign.png" alt="Foxling's digu" /&#62; 其中，foxling改为你的用户名，alt的属性改成你的说明。 如果是要在支持UBB代码的论坛里做签名，使用下面的代码： [img]http://digushow.com/sign/foxling/bbs_sign.png[/img] Flash版提供了5种颜色可以选择，不过我都不喜欢，定制性较差~但大多数博客提供商都不支持JS，Flash就是一个不错的选择了。 嘀咕秀JS版 对于众多自建博客来说，JS版应该算是最好的选择了，CSS样式完全自主控制，如果熟悉JS的话，HTML结构也可以由自己定制，JS的链接代码： &#60;div id="diguShow"&#62;正在加载嘀咕...&#60;/div&#62; &#60;script src="http://digushow.com/js/digushow.js" type="text/javascript"&#62; &#60;/script&#62;&#60;script src="http://digushow.com/api/digushow.jsp?callback=diguShowCallback&#038;username=foxling&#038;count=5" type="text/javascript"&#62;&#60;/script&#62; 有三个可定义的参数，callback后面会说到，先说后两个参数： username:嘀咕用户名 count:读取的嘀咕数目 JS加载的效果如下 正在加载嘀咕&#8230; 在PJBlog和WordPress里添加嘀咕秀JS模块 在Wordpress和Pjblog里添加JS模块都是比较简单的，PJ里可以添加模块，写入HTML代码完成，在WordPress里添加也是非常容易，有多种方法： 1.添加到边栏：后台-外观-小工具，添加一个文本工具，然后进行编辑，填入标题，然后把上面的JS代码复制进去，保存即可。 2.添加到内容栏：写一篇新文章，在HTML代码里输入上面的JS代码，然后把文章置顶~ 3.添加到自定义位置：修改你的主题里的index.php文件，把JS代码插入到相应的位置。 我是用第2种方法~可以在首页看到我的嘀咕秀模块。 自定义嘀咕秀JS版的CSS样式 嘀咕秀JS版没有自带任何CSS样式，这样嘀友们可以自己无限发挥~~ JS生成的HTML代码格式如下，生成的代码结构比较简单，并且加上了ID，只需要写相应的CSS即可。 &#60;div id="diguShow"&#62; &#60;ul id="diguShow_List"&#62; &#60;li&#62;求Window空间，让我挂个东东吧。&#60;a href="http://digu.com/jump?aid=detail&#38;twId=169480" class="diguShow_time"&#62;11小时前&#60;/a&#62;&#60;/li&#62; &#60;/ul&#62; &#60;p id="diguShow_More"&#62; &#60;a target="_blank" href="http://www.digu.com/foxling"&#62;进入&#60;strong&#62;FoxLing&#60;/strong&#62;的嘀咕主页&#187;&#60;/a&#62; &#60;/p&#62; &#60;/div&#62; 在主题的style.css里写入CSS(我稍微写了一点样式，不过还是按照我博客简洁的风格)，给每条嘀咕加上了一个小icon，显得更有条理点，可以在我的博客看到效果： /*DiguShow*/ #diguShow_List [...]]]></description>
			<content:encoded><![CDATA[<p>一直郁闷嘀咕网没有开发JS的博客插件，今天终于看到这款APP出来啦，嘀咕秀：<a href="http://www.digushow.com/">http://www.digushow.com</a>。<br />
一共提供了三种Widget，Flash版的，图片版，以及JS版。<br />
图片版一般是用于论坛签名，效果如下：</p>
<p style="text-align:center"><img src="http://digushow.com/sign/foxling/bbs_sign.png" alt="Foxling's digu" /></p>
<p>其实，任何支持HTML代码，或者支持图片的地方，都可以加上你的图片签名，如果你要在你的网页中插入图片签名，只需要添加如下代码：</p>
<pre>
&lt;img src="http://digushow.com/sign/foxling/bbs_sign.png" alt="Foxling's digu" /&gt;
</pre>
<p>其中，foxling改为你的用户名，alt的属性改成你的说明。<br />
如果是要在支持UBB代码的论坛里做签名，使用下面的代码：</p>
<pre>
[img]http://digushow.com/sign/foxling/bbs_sign.png[/img]
</pre>
<p><span id="more-283"></span></p>
<p>Flash版提供了5种颜色可以选择，不过我都不喜欢，定制性较差~但大多数博客提供商都不支持JS，Flash就是一个不错的选择了。</p>
<div style="text-align:center"><img alt="allowscriptaccess|sameDomain||src|http://www.digushow.com/style/images/sign.swf?mid=foxling&#038;style=2||width|180||height|400" class="flashItem" src="http://res.foxling.cn/images/loadflash.png" /></div>
<h3>嘀咕秀JS版</h3>
<p>对于众多自建博客来说，JS版应该算是最好的选择了，CSS样式完全自主控制，如果熟悉JS的话，HTML结构也可以由自己定制，JS的链接代码：</p>
<pre>
&lt;div id="diguShow"&gt;正在加载嘀咕...&lt;/div&gt;
&lt;script src="http://digushow.com/js/digushow.js" type="text/javascript"&gt;
&lt;/script&gt;&lt;script src="http://digushow.com/api/digushow.jsp?callback=diguShowCallback&#038;username=foxling&#038;count=5" type="text/javascript"&gt;&lt;/script&gt;
</pre>
<p>有三个可定义的参数，callback后面会说到，先说后两个参数：<br />
username:嘀咕用户名<br />
count:读取的嘀咕数目</p>
<h3>JS加载的效果如下</h3>
<div id="diguShow">正在加载嘀咕&#8230;</div>
<p><script src="http://digushow.com/js/digushow.js" type="text/javascript"></script><script src="http://digushow.com/api/digushow.jsp?callback=diguShowCallback&#038;username=foxling&#038;count=5" type="text/javascript"></script></p>
<h3>在PJBlog和WordPress里添加嘀咕秀JS模块</h3>
<p>在Wordpress和Pjblog里添加JS模块都是比较简单的，PJ里可以添加模块，写入HTML代码完成，在WordPress里添加也是非常容易，有多种方法：<br />
1.添加到边栏：后台-外观-小工具，添加一个文本工具，然后进行编辑，填入标题，然后把上面的JS代码复制进去，保存即可。<br />
2.添加到内容栏：写一篇新文章，在HTML代码里输入上面的JS代码，然后把文章置顶~<br />
3.添加到自定义位置：修改你的主题里的index.php文件，把JS代码插入到相应的位置。<br />
我是用第2种方法~可以在首页看到我的嘀咕秀模块。</p>
<h3>自定义嘀咕秀JS版的CSS样式</h3>
<p>嘀咕秀JS版没有自带任何CSS样式，这样嘀友们可以自己无限发挥~~</p>
<p>JS生成的HTML代码格式如下，生成的代码结构比较简单，并且加上了ID，只需要写相应的CSS即可。</p>
<pre>
&lt;div id="diguShow"&gt;
    &lt;ul id="diguShow_List"&gt;
        &lt;li&gt;求Window空间，让我挂个东东吧。&lt;a href="http://digu.com/jump?aid=detail&amp;twId=169480" class="diguShow_time"&gt;11小时前&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p id="diguShow_More"&gt;
        &lt;a target="_blank" href="http://www.digu.com/foxling"&gt;进入&lt;strong&gt;FoxLing&lt;/strong&gt;的嘀咕主页&raquo;&lt;/a&gt;
    &lt;/p&gt;
&lt;/div&gt;
</pre>
<p>在主题的style.css里写入CSS(我稍微写了一点样式，不过还是按照我博客简洁的风格)，给每条嘀咕加上了一个小icon，显得更有条理点，可以在我的博客看到效果：</p>
<pre>
/*DiguShow*/
#diguShow_List {list-style:none;margin:10px 0;padding:0;}
#diguShow_List li {
background:url(/wp-content/themes/sandbox/diguico.png) no-repeat 0 0;
padding-left:17px;
line-height:16px;
margin-bottom:8px;
}
.diguShow_time {color:#999;}
#diguShow_More {text-align:right;margin:0 0 10px 0;}
</pre>
<h3>加入Loading图标</h3>
<p>嘀咕秀是在网页加载完后才会加载JS，这点比较好，不会因为网络的原因导致页面卡住~<br />
在加载的时候，显示：正在加载嘀咕&#8230;<br />
可以加入一个Loading图标，这样显得更爽点~<br />
Loading图标生成网站：<a href="http://www.ajaxload.info/">http://www.ajaxload.info/</a>，提供各种样式的Loading图标，可以自定义前景色和背景色。</p>
<pre>
将默认代码里的
&lt;div id="diguShow"&gt;正在加载嘀咕...&lt;/div&gt;
替换成
&lt;div id="diguShow" style="background:url(/wp-content/themes/sandbox/ajax-loader.gif) no-repeat left center;padding:5px 0 5px 20px;"&gt;
正在加载嘀咕...
&lt;/div&gt;
</pre>
<h3>更强的自定义</h3>
<p>如果你对JS比较熟悉，可以完全重写JS回调函数，输出你需要的HTML结构。<br />
嘀咕秀是通过JSONP的方式传入函数名，返回相应的格式，解决跨域问题。<br />
上面提到的callback参数就是处理数据要用到的JS函数名，给函数传递了一个参数，是JSON格式的数据。<br />
服务端传回来的JS代码如下：</p>
<pre>
diguShowCallback(
{
user:{userId:10013552,
nickname:"FoxLing",
signPicName:"http://121.14.39.139:80/file/10/01/35/52/default/SIGN10013552_24x24.jpg",
homepage:"http:\/\/www.digu.com\/foxling"},
status:[{created_at:"3小时前",
text:"嘀咕",
id:181855,
picPath:[]}]
}
);
</pre>
<p>写好了JS函数后，将JS代码里的这一句替换成你自己写的JS函数的文件链接：</p>
<pre>
&lt;script src="http://digushow.com/js/digushow.js" type="text/javascript"&gt;&lt;/script&gt;
</pre>
<p>完工！</p>
<p>&#8212;&#8212;&#8212;&#8211;2009-09-08 更新&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
嘀咕秀更名为无敌秀，目前可以使用<br />
CSS的ID和Class名有所改动，改动如下：</p>
<pre>
/*Wudishow*/
#wudiShow_List {list-style:none;margin:10px 0;padding:0;}
#wudiShow_List li {
background:url(/wp-content/themes/sandbox/diguico.png) no-repeat 0 0;
padding-left:17px;
line-height:16px;
margin-bottom:8px;
}
.wudiShow_time {color:#999;}
#wudiShow_More {text-align:right;margin:0 0 10px 0;}
</pre>
<p>如果你还想对无敌秀的JS下刀，可以下载这个地址的js文件进行修改：</p>
<p>http://www.wudishow.com/js/wudishow.source.js</p>
<p>目前可以在我的博客首页右侧栏看到效果。</p>
]]></content:encoded>
			<wfw:commentRss>http://foxling.org/html-css-xml/digu-show-js-widget/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

