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

<channel>
	<title>影の域 &#187; JavaScript</title>
	<atom:link href="http://www.zfkun.com/index.php/category/code/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://www.zfkun.com</link>
	<description>关注web前端,追逐html5脚步,体会code人生</description>
	<lastBuildDate>Mon, 23 Apr 2012 15:09:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>KISSY DataLazyLoad组件之事件BUG</title>
		<link>http://www.zfkun.com/461.html</link>
		<comments>http://www.zfkun.com/461.html#comments</comments>
		<pubDate>Fri, 24 Feb 2012 10:58:48 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[dataLazyload]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[kissy]]></category>
		<category><![CDATA[resize]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/?p=461</guid>
		<description><![CDATA[正在随手弄一Photo App， 为了性能和效率，不得不使用LazyLoad，至此，为此BUG的浮现做好了铺垫。
为图快速制作出原型，暂且使用KISSY辅助开发，App自身只有一个重要需求： 弹性、自适应。
所以，很自然的对 windows 对象做了 Resize Event 的监听处理。 %*……（*&#038;*%%*……*（，(此处省略1000字)，coding-complete &#038;& unit-test-ok !
然后，准备添加 LazyLoad支持以提高体验和性能，降低成本。（殊不知，杯具就此发生） <a href="http://www.zfkun.com/461.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>正在随手弄一Photo App， 为了性能和效率，不得不使用LazyLoad，至此，为此BUG的浮现做好了铺垫。</p>
<p>为图快速制作出原型，暂且使用KISSY辅助开发，App自身只有一个重要需求： 弹性、自适应。</p>
<p>所以，很自然的对 windows 对象做了 Resize Event 的监听处理。<span style="color: #33cccc;"> %*……（*&amp;*%%*……*（，(此处省略<span style="color: #ff0000;">1000</span>字)</span>，coding-complete &amp;&amp; unit-test-ok !</p>
<p>然后，准备添加 LazyLoad支持以提高体验和性能，降低成本。（殊不知，杯具就此发生）</p>
<p><span style="color: #33cccc;">）*）*（）……&amp;（……&amp;*%&amp;**（此处省略<span style="color: #ff0000;">1000</span>字）</span>，coding-complete &amp;&amp; unit-test-ok !</p>
<p>准备 save &amp;&amp; comit, 随着不经意的窗口Scroll 到底部 &amp; Resize ，我hold住了。。。。。</p>
<p>自适应能力貌似费了，<span style="color: #33cccc;"> &amp;（*（）*——（——*）…………*（*（此处省略<span style="color: #ff0000;">1W</span>字）</span></p>
<p>好吧，我知道，一般都是我的问题，遂，加入以下调试代码块辅助检查：</p>
<pre name="code" class="js">window.addEventListener('resize', function(){ console.info('Native Resize Event fire !!') }, false);</pre>
<p>。。。结果出乎意料，冇反应。</p>
<p>直觉告诉，应该是KISSY在跟我开玩笑。</p>
<p>可是，想不通，为什么窗口在冇完全Scroll到底之前（或者说最后一个图片未被LazyLoad加载之前），一切都那么和谐有序呢？</p>
<p>看来，Source 我不得不再一次的偷窥你了。 &#8211; -！</p>
<p>（&amp;（*（）（——）（——…………*（*&amp;（此处省略1W字）</p>
<p>经过排查，问题不在 KISSY.js 核心文件，so, 问题就极有可能存在与 DataLazyLoad 组件本身鸟。  - -!</p>
<p>终于，我找到了让我撕心裂肺的你，你藏的如此诡异，以至于无心者很难察觉你的存在：</p>
<pre name="code" class="js">var self = this, resizeHandler,
    // 加载延迟项
    loadItems = function () {
        self._loadItems();
        if (self._getItemsLength() === 0) {
            Event.remove(win, SCROLL, loader);
            Event.remove(win, RESIZE, resizeHandler);
        }
    },
    // 加载函数
    loader = S.buffer(loadItems, DURATION, this);

// scroll 和 resize 时，加载图片
Event.on(win, SCROLL, loader);
Event.on(win, RESIZE, function () { self.threshold = self._getThreshold(); loader(); });</pre>
<p>从以上代码块，可以看出悲催的 resizeHandler 变量忘记赋值鸟！！！造成 Event.remove(win, RESIZE, resizeHandler) 的影响扩大到了全局，说白了，就是所有的resize 监听器都被瞬间释放鸟，世界清静了。。。。</p>
<p>既然，code里寻你千百行，我也不能让你就在那变量定义处。</p>
<p>fix 就很明了了：</p>
<pre name="code" class="js">Event.on(win, RESIZE, resizeHandler = function () { self.threshold = self._getThreshold(); loader(); });</pre>
<p>为了直观，提供2个简易DEMO来对比。</p>
<p><a title="原始带bug" href="http://www.zfkun.com//demo/kissy/KISSY_DataLazyLoad_bug.html" target="_blank">原始BUG</a>     <a title="修正后无BUG" href="http://www.zfkun.com//demo/kissy/KISSY_DataLazyLoad_bug_fixed.html" target="_blank">修正后</a></p>

	标签：<a href="http://www.zfkun.com/tag/bug" title="bug" rel="tag">bug</a>, <a href="http://www.zfkun.com/tag/datalazyload" title="dataLazyload" rel="tag">dataLazyload</a>, <a href="http://www.zfkun.com/tag/event" title="event" rel="tag">event</a>, <a href="http://www.zfkun.com/tag/kissy" title="kissy" rel="tag">kissy</a>, <a href="http://www.zfkun.com/tag/resize" title="resize" rel="tag">resize</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/159.html" title="如何在事件代理中正确使用 focus 和 blur 事件 (2011 年 01 月 13 日)" data-comment="0">如何在事件代理中正确使用 focus 和 blur 事件</a></li>
	<li><a href="http://www.zfkun.com/275.html" title="[转]IE6、IE7、IE8 CSS Bug兼容解决记录 (2011 年 06 月 14 日)" data-comment="1">[转]IE6、IE7、IE8 CSS Bug兼容解决记录</a></li>
	<li><a href="http://www.zfkun.com/344.html" title="WordPress 中文Tag 显示404错误的BUG修正 (2011 年 07 月 07 日)" data-comment="0">WordPress 中文Tag 显示404错误的BUG修正</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/461.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>移动 Web 开发平台 Rexsee 开源</title>
		<link>http://www.zfkun.com/445.html</link>
		<comments>http://www.zfkun.com/445.html#comments</comments>
		<pubDate>Fri, 28 Oct 2011 09:30:04 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[open]]></category>
		<category><![CDATA[Rexsee]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/?p=445</guid>
		<description><![CDATA[国内移动Web开发平台Rexsee正式开源，其开发者社区也于本周上线。访问社区可以查看详细开发手册、API说明与示例以及全部源码，并可在线编译免费生成移动应用客户端。 <a href="http://www.zfkun.com/445.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em>国内移动Web开发平台Rexsee正式开源，其开发者社区也于本周上线。访问社区可以查看详细开发手册、API说明与示例以及全部源码，并可在线编译免费生成移动应用客户端。</em></p>
<p>伴随着HTML5的发展以及Web App的广受认可，基于Web的移动应用开发已经受到了技术厂商与开发者的普遍关注。大量的Web框架纷纷转投移动应用领域，近期反响最大的无疑是由 ExtJS、jQTouch 以及 Raphael合并而成的Sencha，以及被Adobe收购的PhoneGap。Mozilla也于上月宣布计划构建 WebAPI，用于在浏览器中调用移动设备功能。</p>
<p>基于类似的技术理念，国内的Rexsee团队已提供了整体的移动应用“开发平台”，并于今年5月开始面向企业级应用市场推广。</p>
<p>Rexsee产品以Webkit为内核，全面支持HTML5。通过扩展超过1500个API，以Javascript实现对移动终端的功能调用，强化HTML5在浏览器之外的移动终端功能实现。开发者可以使用HTML、CSS和Javascript快速实现移动应用，并通过原生化应用转换功能，直接生成应用程序。</p>
<p>不同于国际范围的其他移动Web开发框架，Rexsee并不过度追求跨平台特性。在深度支持Android原生功能的前提下，采用全部同步的开发方式，并在执行效率上有显著提升。</p>
<p>Rexsee的开源策略旨在让更多的开发人员可以迅速的进入到移动互联网领域，基于标准化的Web开发方式快速实现移动应用。结合之前所积累的大量应用，Rexsee开发者社区在上线第一天，就已有246个应用得以审核推出，并且还在持续增加。</p>
<p>作为国内唯一开源的移动Web开发平台，Rexsee定位于服务移动应用开发者的技术平台提供方，力图为移动应用创新发展打造更加广泛坚实的开发者基础。</p>
<p>&nbsp;</p>
<p>原文： <a href="http://www.oschina.net/news/22624/raxsee-opensource">http://www.oschina.net/news/22624/raxsee-opensource</a></p>

	标签：<a href="http://www.zfkun.com/tag/android" title="android" rel="tag">android</a>, <a href="http://www.zfkun.com/tag/ios" title="ios" rel="tag">ios</a>, <a href="http://www.zfkun.com/tag/open" title="open" rel="tag">open</a>, <a href="http://www.zfkun.com/tag/rexsee" title="Rexsee" rel="tag">Rexsee</a>, <a href="http://www.zfkun.com/tag/source" title="source" rel="tag">source</a>, <a href="http://www.zfkun.com/tag/web-2" title="web" rel="tag">web</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/388.html" title="window.open() 之句柄保持和重连 (2011 年 07 月 14 日)" data-comment="0">window.open() 之句柄保持和重连</a></li>
	<li><a href="http://www.zfkun.com/454.html" title="Path UI by CSS3 (2011 年 12 月 06 日)" data-comment="0">Path UI by CSS3</a></li>
	<li><a href="http://www.zfkun.com/366.html" title="Market Enabler &#8211; Android越狱改区利器 (2011 年 07 月 10 日)" data-comment="2">Market Enabler &#8211; Android越狱改区利器</a></li>
	<li><a href="http://www.zfkun.com/377.html" title="Google+ for Android 安装 (2011 年 07 月 10 日)" data-comment="0">Google+ for Android 安装</a></li>
	<li><a href="http://www.zfkun.com/372.html" title="apk文件的MIME类型 (2011 年 07 月 10 日)" data-comment="0">apk文件的MIME类型</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/445.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]利用跨域资源共享（CORS）实现ajax跨域调用</title>
		<link>http://www.zfkun.com/394.html</link>
		<comments>http://www.zfkun.com/394.html#comments</comments>
		<pubDate>Fri, 15 Jul 2011 05:14:06 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[cors]]></category>
		<category><![CDATA[credentialed]]></category>
		<category><![CDATA[crossdomain]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[orign]]></category>
		<category><![CDATA[preflighted]]></category>
		<category><![CDATA[XDomainRequest]]></category>
		<category><![CDATA[XMLHttpRequest]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=394</guid>
		<description><![CDATA[几年前，网站开发者都因为ajax的同源策略而撞了南墙。当我们惊叹于XMLHttpRequest对象跨浏览器支持所带来的巨大进步时，我们很快发现没有一个方法可以使我们用JavaScript实现请求跨域访问，对此我们哀叹不已。每个人在他们自己的网站上建立代理来摆脱这种限制。虽然开发者利用服务器代理和其它技巧避开了这种限制，而在社区的抗议者允许ajax在本地跨域调用。许多人还没意识到当前几乎所有的浏览器（Internet Explorer 8+， Firefox 3.5+， Safari 4+和 Chrome）都可通过名为Cross-Origin Resource Sharing的协议支持ajax跨域调用。 <a href="http://www.zfkun.com/394.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>几年前，网站开发者都因为ajax的<a title="Same origin policy for Javascript" href="https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript" target="_blank">同源策略</a>而撞了南墙。当我们惊叹于XMLHttpRequest对象跨浏览器支持所带来的巨大进步时，我们很快发现没有一个方法可以使我们用<strong>JavaScript实现请求跨域</strong>访问，对此我们哀叹不已。每个人在他们自己的网站上建立代理（which was the onset of a new host of open redirect problems）来摆脱这种限制。虽然开发者利用服务器代理和其它技巧避开了这种限制，而在社区的抗议者允许ajax在本地跨域调用。许多人还没意识到当前几乎所有的浏览器（Internet Explorer 8+， Firefox 3.5+， Safari 4+和 Chrome）都可通过名为<strong>Cross-Origin Resource Sharing</strong>的协议支持ajax跨域调用。</p>
<h3>跨域资源共享（CORS）</h3>
<p><a title="" href="http://www.w3.org/TR/access-control/" target="_blank">Cross-Origin Resource Sharing</a> (<strong>CORS</strong>)是W3c工作草案，它定义了在跨域访问资源时浏览器和服务器之间如何通信。CORS背后的基本思想是使用自定义的HTTP头部允许浏览器和服务器相互了解对方，从而决定请求或响应成功与否。</p>
<p>对一个简单的请求，没有自定义头部，要么使用GET，要么使用POST，它的主体是text/plain,请求用一个名叫Orgin的额外的头部发送。Origin头部包含请求页面的头部（协议，域名，端口），这样服务器可以很容易的决定它是否应该提供响应。</p>
<blockquote><p>Origin: http://www.nczonline.net</p></blockquote>
<p>如果服务器确定请求被通过，它将发送一个Access-Control-Allow-Origin头部响应发送请求的同一个源，如果是一个公共资源，则返回“*”。如：</p>
<blockquote><p>Access-Control-Allow-Origin: http://www.nczonline.net</p></blockquote>
<p>如果头部丢失，或者源不匹配，那么浏览器将拒绝请求。如果一切顺利，浏览器将处理请求。注意，请求和响应都不包括cookie信息。</p>
<p>先前提到的所有浏览器都支持这些简单的请求。FF3.5 +，Safari 4和chrome通过使用XMLHttpRequest对象支持其使用。当尝试在不同域打开一个资源时，不需任何代码，这个行为会自动触发。如：</p>
<pre name="code" class="js">var xhr = new XMLHttpRequest();
xhr.open("get", "http://www.nczonline.net/some_resource/", true);
xhr.onload = function(){  //instead of onreadystatechange
    //do something
};
xhr.send(null);</pre>
<p>在IE8中也是一样，用同样的方式你需要使用<a title="XDomainRequest Object" href="http://msdn.microsoft.com/en-us/library/cc288060%28VS.85%29.aspx" target="_blank">XDomainRequest object</a>。</p>
<pre name="code" class="js">var xdr = new XDomainRequest();
xdr.open("get", "http://www.nczonline.net/some_resource/");
xdr.onload = function(){
    //do something
};
xdr.send();</pre>
<p>Mozilla小组在他们关于<a title="" href="http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/" target="_blank">CORS的留言</a>中建议应该检查withCredentials属性的存在性，从而决定浏览器是否通过XHR支持CORS。你可以合并<strong>XDomainRequest </strong>对象的存在性来支持所有的浏览器：</p>
<pre name="code" class="js">function createCORSRequest(method, url){
    var xhr = new XMLHttpRequest();
    if ("withCredentials" in xhr){
        xhr.open(method, url, true);
    } else if (typeof XDomainRequest != "undefined"){
        xhr = new XDomainRequest();
        xhr.open(method, url);
    } else {
        xhr = null;
    }
    return xhr;
}

var request = createCORSRequest("get", "http://www.nczonline.net/");
if (request){
    request.onload = function(){
        //do something with request.responseText
    };
    request.send();
}</pre>
<p>Firefox, Safari, 和Chrome的XMLHttpRequest对象与IE的XDomainRequest对象有着相似的充分的接口，这些模式运行的很好。常见的接口属性/方法:</p>
<ul>
<li>abort()——用来终止已在进程中请求。</li>
<li>onerror()——替代onreadystatechange方法来探测错误。</li>
<li>onload()——替代onreadystatechange方法来探测成功。</li>
<li>responseText——用来取得响应地文本。</li>
<li>send()——用来发送请求。</li>
</ul>
<h3>Preflighted请求</h3>
<p>除了GET或POST，通过一种称之为<strong>preflighted</strong>请求的服务器透明验证机制，CORS允许使用自定义的头部和方法，以及不同主体内容类型。当你尝试使用高级选项中的一个来试着建立一个请求时，这时就建立了一个preflighted请求。该请求使用可选的方法，并发送如下头部：</p>
<ul>
<li>Origin——与简单请求相同。</li>
<li>Access-Control-Request-Method——请求将要使用的方法。</li>
<li>Access-Control-Request-Headers——（可选）一个逗号分开的正被使用的自定义头部列表。</li>
</ul>
<p>例子假定一个头部自定义为NCZ的POST请求：</p>
<blockquote><p>Origin: http://www.nczonline.net<br />
Access-Control-Request-Method: POST<br />
Access-Control-Request-Headers: NCZ</p></blockquote>
<p>在请求期间，服务器能决定是否允许这类请求。服务器通过在响应中发送以下头部来与浏览器通信。</p>
<ul>
<li>Access-Control-Allow-Origin——与简单请求相同。</li>
<li>Access-Control-Allow-Methods——用逗号分开的可接受的方法列表。</li>
<li>Access-Control-Allow-Headers——用逗号分开的服务器可接受的头部列表。</li>
<li>Access-Control-Max-Age——preflighted 请求应该被缓存的时间。</li>
</ul>
<p>如：</p>
<blockquote><p>Access-Control-Allow-Origin: http://www.nczonline.net<br />
Access-Control-Allow-Methods: POST, GET<br />
Access-Control-Allow-Headers: NCZ<br />
Access-Control-Max-Age: 1728000</p></blockquote>
<p>preflighted 请求一旦作出，结果将按响应中规定的时间缓存下来；第一次做出这样的请求，你将引发一次额外的HTTP请求。</p>
<p>Firefox 3.5+, Safari 4+和Chrome都支持preflighted 请求，IE8则不支持。</p>
<h3>Credentialed请求</h3>
<p>默认状态下，跨域请求不提供证书（cookie、HTTP身份验证、客户端SSL证书）。你可以规定一个请求应该通过设置withCredentials属性为true来发送证书。如果服务器允许credentialed请求，那么它将用下面的头部作出响应：</p>
<p>如果一个<strong>credentialed</strong>请求被发送，这个头部不会作为响应地一部分被发送。浏览器不会将响应传递给JavaScript(responseText是一个空字符串，状态为0，onerror()被调用)。注意，服务器也能发送这个HTTP头部作为preflight响应的一部分，以此来表明该源允许发送credentialed请求。</p>
<blockquote><p>Access-Control-Allow-Credentials: true</p></blockquote>
<p>IE8不支持withCredentials属性，Firefox 3.5+, Safari 4+和Chrome都支持它。</p>
<h3>结论</h3>
<p>在现代web浏览器中对跨域AJAX调用有许多可靠地支持，然而，大多数开发者仍没意识这些强大的功能力。只需在JavaScript和服务器端做一点额外的工作以保证正确的头部被发送即可使用它。在允许高级请求和credentialed请求方面，IE8的执行有些滞后，但希望它对CORS的支持将会继续改进。如果你想了解更多，我强烈建议你检查<a title="" href="http://arunranga.com/examples/access-control/" target="_blank">Arun Ranganathan的示例页</a>。</p>
<h3>相关阅读</h3>
<ul>
<li><a title="Cross-domain XHR removed from Firefox 3" href="http://www.nczonline.net/blog/2008/04/27/cross-domain-xhr-removed-from-firefox-3/" target="_blank">Cross-domain XHR removed from Firefox 3</a></li>
<li><a title="Firefox 3.5/Firebug XMLHttpRequest and readystatechange bug" href="http://www.nczonline.net/blog/2009/07/09/firefox-35firebug-xmlhttprequest-and-readystatechange-bug/" target="_blank">Firefox 3.5/Firebug XMLHttpRequest and readystatechange bug</a></li>
<li><a title="Mentioned in Microsoft whitepaper" href="http://www.nczonline.net/blog/2008/07/05/mentioned-in-microsoft-whitepaper/" target="_blank">Mentioned in Microsoft whitepaper</a></li>
<li><a title="XMLHttp Requests For Ajax" href="http://www.nczonline.net/blog/2006/03/14/xmlhttp-requests-for-ajax/" target="_blank">XMLHttp Requests For Ajax</a></li>
<li><a title="Firebug" href="http://www.nczonline.net/blog/2006/03/05/firebug/" target="_blank">Firebug</a></li>
<li><a title="Web definitions: DOM, Ajax, and more" href="http://www.nczonline.net/blog/2009/09/29/web-definitions-dom-ajax-and-more/" target="_blank">Web definitions: DOM, Ajax, and more</a></li>
</ul>
<p><strong>原文地址：</strong><a title="cross domain ajax with cross origin resource sharing" href="http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/" target="_blank">http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/</a></p>

	标签：<a href="http://www.zfkun.com/tag/ajax" title="ajax" rel="tag">ajax</a>, <a href="http://www.zfkun.com/tag/cors" title="cors" rel="tag">cors</a>, <a href="http://www.zfkun.com/tag/credentialed" title="credentialed" rel="tag">credentialed</a>, <a href="http://www.zfkun.com/tag/crossdomain" title="crossdomain" rel="tag">crossdomain</a>, <a href="http://www.zfkun.com/tag/javascript" title="JavaScript" rel="tag">JavaScript</a>, <a href="http://www.zfkun.com/tag/js" title="js" rel="tag">js</a>, <a href="http://www.zfkun.com/tag/orign" title="orign" rel="tag">orign</a>, <a href="http://www.zfkun.com/tag/preflighted" title="preflighted" rel="tag">preflighted</a>, <a href="http://www.zfkun.com/tag/xdomainrequest" title="XDomainRequest" rel="tag">XDomainRequest</a>, <a href="http://www.zfkun.com/tag/xmlhttprequest" title="XMLHttpRequest" rel="tag">XMLHttpRequest</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/147.html" title="前端资源文件缓存清除一法 (2010 年 11 月 25 日)" data-comment="0">前端资源文件缓存清除一法</a></li>
	<li><a href="http://www.zfkun.com/80.html" title="[转]Google Closure: 糟糕的JavaScript (2010 年 01 月 19 日)" data-comment="0">[转]Google Closure: 糟糕的JavaScript</a></li>
	<li><a href="http://www.zfkun.com/388.html" title="window.open() 之句柄保持和重连 (2011 年 07 月 14 日)" data-comment="0">window.open() 之句柄保持和重连</a></li>
	<li><a href="http://www.zfkun.com/115.html" title="Comet—“服务器推”技术 (2010 年 03 月 03 日)" data-comment="0">Comet—“服务器推”技术</a></li>
	<li><a href="http://www.zfkun.com/154.html" title="随机颜色 (2011 年 01 月 12 日)" data-comment="0">随机颜色</a></li>
	<li><a href="http://www.zfkun.com/59.html" title="腾讯TT、遨游浏览器检测 (2010 年 01 月 16 日)" data-comment="0">腾讯TT、遨游浏览器检测</a></li>
	<li><a href="http://www.zfkun.com/55.html" title="绝对震撼!10款动感图片展示js代码 (2010 年 01 月 16 日)" data-comment="0">绝对震撼!10款动感图片展示js代码</a></li>
	<li><a href="http://www.zfkun.com/176.html" title="原生JSON.parse解析异常问题 (2011 年 03 月 18 日)" data-comment="0">原生JSON.parse解析异常问题</a></li>
	<li><a href="http://www.zfkun.com/226.html" title="Windows7下搭建Node.js环境 (2011 年 04 月 06 日)" data-comment="1">Windows7下搭建Node.js环境</a></li>
	<li><a href="http://www.zfkun.com/109.html" title="Understanding and Solving Internet Explorer Leak Patterns (2010 年 02 月 28 日)" data-comment="0">Understanding and Solving Internet Explorer Leak Patterns</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/394.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>window.open() 之句柄保持和重连</title>
		<link>http://www.zfkun.com/388.html</link>
		<comments>http://www.zfkun.com/388.html#comments</comments>
		<pubDate>Thu, 14 Jul 2011 09:21:50 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[open]]></category>
		<category><![CDATA[opener]]></category>
		<category><![CDATA[references]]></category>
		<category><![CDATA[window]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=388</guid>
		<description><![CDATA[window.open()是挺常用的弹窗方式，大部分时候用在一些会话框提示、上传、第三方应用交互等，这时若需要面对资源保持的问题时，就需要一些特殊的技巧来fix。 <a href="http://www.zfkun.com/388.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>window.open()是挺常用的弹窗方式，大部分时候用在一些会话框提示、上传、第三方应用交互等，这时若需要面对资源保持的问题时，就需要一些特殊的技巧来fix。</p>
<p>通常window.open 子页面的方式为：</p>
<p>childWinHandler = window.open(&#8216;child.html&#8217;, &#8216;childWinName&#8217;, &#8216;height=100,width=100&#8242;);</p>
<p>这种方式的弹窗，在保证父页面不会被重定向 或 reload的前提下，就不用担心子页面窗口的句柄引用问题。</p>
<p>因为父亲页面中的 childWinHandler 变量存储着 子页面窗口句柄的对象引用。</p>
<p>但，若父页面因为某些原因临时重定向走了而后再回来了（或 reload/refresh了），这时子页面窗口句柄对象的引用就彻底丢失了。</p>
<p>如果，当前应用是个第三方登录接入或者级别较重要的应用的话，这样的问题可能会带来很多不必要的麻烦。</p>
<p>so, 如何解决呢？</p>
<p>google + 试验，以下是个值得参考的方案（支持 IE6+，FF,  Chrome, Safari 等）</p>
<p>&nbsp;</p>
<div class="wp-caption alignnone" style="width: 695px"><a href="http://photo.staticsdo.com/a1/158/432/455/59905-1224118696-8.jpg"><img title="window.open() 之句柄保持和重连" src="http://photo.staticsdo.com/a1/158/432/455/59905-1224118696-8.jpg" alt="window.open() 之句柄保持和重连" width="685" height="307" /></a><p class="wp-caption-text">window.open() 之句柄保持和重连</p></div>
<p>&nbsp;</p>
<p><a title="window.open()之句柄保持和重连 - DEMO演示" href="http://www.zfkun.com/demo/window-open-reconnect/demo.html" target="_blank">【点击查看DEMO】</a></p>
<p>&nbsp;</p>
<p>原理很简单：</p>
<p>在 window.open(&#8216;child.html&#8217;, &#8216;子窗口名&#8217;,'窗口参数&#8217;) 子页面前，先 window.open(”, &#8216;子窗口名&#8217;,'窗口参数&#8217;)  空页面，</p>
<p>注意第一个参数是 空字符串，这样调用后，只需要通过判断 返回的句柄对象的 location.href 是否为子页面地址，</p>
<p>就可以判断出当前窗口句柄保持的是否是之前的子页面窗口。</p>
<p>若是，则无需再open，直接focus即可。</p>
<p>若不是，则放心的重新open子页面窗口，即可。</p>
<p>&nbsp;</p>
<p>问题：</p>
<p>经过测试</p>
<p>IE6，在保证父页面不close的前提下，一切工作正常。但是父亲页面要是关闭后再重新打开，这时无法让子页面focus置顶，而且</p>
<p>这时以后若关闭子页面父页面内的 openWinHandler 变量的访问直接抛异常，导致无法走通open流程。</p>
<p>而 chrome 稍稍比IE6好一些起码不抛异常，只是父窗口关闭后，就好像再也找不到之前的那个窗口句柄，会再新开子窗口，貌似引用资源被释放一样。</p>
<p>其他浏览器，由于时间有限，就没仔细测试，也许还有遗漏的地方，若发现请反馈告诉我，谢谢。</p>
<p>&nbsp;</p>
<p>总结：</p>
<p>在某些条件下，这种方式不乏是个折中的可参考方案。</p>
<p>参考：</p>
<p><a href="http://josephj.com/entry.php?id=367">http://josephj.com/entry.php?id=367</a></p>
<p><a href="http://www.daniweb.com/web-development/javascript-dhtml-ajax/threads/48485/page2">http://www.daniweb.com/web-development/javascript-dhtml-ajax/threads/48485/page2</a></p>
<p>&nbsp;</p>

	标签：<a href="http://www.zfkun.com/tag/javascript" title="JavaScript" rel="tag">JavaScript</a>, <a href="http://www.zfkun.com/tag/js" title="js" rel="tag">js</a>, <a href="http://www.zfkun.com/tag/open" title="open" rel="tag">open</a>, <a href="http://www.zfkun.com/tag/opener" title="opener" rel="tag">opener</a>, <a href="http://www.zfkun.com/tag/references" title="references" rel="tag">references</a>, <a href="http://www.zfkun.com/tag/window" title="window" rel="tag">window</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/394.html" title="[转]利用跨域资源共享（CORS）实现ajax跨域调用 (2011 年 07 月 15 日)" data-comment="0">[转]利用跨域资源共享（CORS）实现ajax跨域调用</a></li>
	<li><a href="http://www.zfkun.com/80.html" title="[转]Google Closure: 糟糕的JavaScript (2010 年 01 月 19 日)" data-comment="0">[转]Google Closure: 糟糕的JavaScript</a></li>
	<li><a href="http://www.zfkun.com/154.html" title="随机颜色 (2011 年 01 月 12 日)" data-comment="0">随机颜色</a></li>
	<li><a href="http://www.zfkun.com/59.html" title="腾讯TT、遨游浏览器检测 (2010 年 01 月 16 日)" data-comment="0">腾讯TT、遨游浏览器检测</a></li>
	<li><a href="http://www.zfkun.com/55.html" title="绝对震撼!10款动感图片展示js代码 (2010 年 01 月 16 日)" data-comment="0">绝对震撼!10款动感图片展示js代码</a></li>
	<li><a href="http://www.zfkun.com/445.html" title="移动 Web 开发平台 Rexsee 开源 (2011 年 10 月 28 日)" data-comment="0">移动 Web 开发平台 Rexsee 开源</a></li>
	<li><a href="http://www.zfkun.com/176.html" title="原生JSON.parse解析异常问题 (2011 年 03 月 18 日)" data-comment="0">原生JSON.parse解析异常问题</a></li>
	<li><a href="http://www.zfkun.com/147.html" title="前端资源文件缓存清除一法 (2010 年 11 月 25 日)" data-comment="0">前端资源文件缓存清除一法</a></li>
	<li><a href="http://www.zfkun.com/226.html" title="Windows7下搭建Node.js环境 (2011 年 04 月 06 日)" data-comment="1">Windows7下搭建Node.js环境</a></li>
	<li><a href="http://www.zfkun.com/109.html" title="Understanding and Solving Internet Explorer Leak Patterns (2010 年 02 月 28 日)" data-comment="0">Understanding and Solving Internet Explorer Leak Patterns</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/388.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows7下搭建Node.js环境</title>
		<link>http://www.zfkun.com/226.html</link>
		<comments>http://www.zfkun.com/226.html#comments</comments>
		<pubDate>Wed, 06 Apr 2011 08:34:18 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[cygwin]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[node]]></category>
		<category><![CDATA[nodejs]]></category>
		<category><![CDATA[win7]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=226</guid>
		<description><![CDATA[1. 下载并安装Cygwin 及Node.js安装依赖的附加组件 cygwin下载:  http://cygwin.com/setup.exe (下载点最好选择台湾或日本的临近点，速度快) 附加组件选择: Devel : gcc-g++:    C++ compiler gcc-mingw-g++:   Mingw32 support headers and libraries for GCC C++ gcc4-g++:    G++ subpackage git:   Fast Version Control System – core files  (github方式下载时用) make:   The &#8230; <a href="http://www.zfkun.com/226.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>1. 下载并安装Cygwin 及Node.js安装依赖的附加组件</p>
<p>cygwin下载:  <a title="http://cygwin.com/setup.exe" href="http://cygwin.com/setup.exe">http://cygwin.com/setup.exe</a> (下载点最好选择台湾或日本的临近点，速度快)</p>
<p>附加组件选择:</p>
<p>Devel :<br />
<strong> gcc-g++</strong>:    C++ compiler<br />
<strong> gcc-mingw-g++</strong>:   Mingw32 support headers and libraries for GCC C++<br />
<strong>gcc4-g++</strong>:    G++ subpackage<br />
<strong>git</strong>:   Fast Version Control System – core files  (github方式下载时用)<br />
<strong>make</strong>:   The GNU version of the &#8216;make&#8217; utility<br />
<strong>openssl-devel</strong>:   The OpenSSL development environment<br />
<strong>pkg-config</strong>:   A utility used to retrieve information about installed libraries<br />
<strong>zlib-devel</strong>:   The zlib compression/decompression library (development)</p>
<p>Editor:<br />
<strong> vim</strong>:   Vi IMproved &#8211; enhanced vi editor</p>
<p>Python:<br />
全部</p>
<p>Web:<br />
<strong>wget</strong>:   Utility to retrieve files from the WWW via HTTP and FTP<br />
<strong>curl</strong>:   Multi-protocol file transfer command-line tool</p>
<p>2.  由于操作系统为 windows 7 (Windows Vista以后版本)，需要在ash模式下执行rebaseall才能保证 node.js的编译通过</p>
<p>a. 进入 cygwin安装目录/bin/<br />
b. 运行ash.exe<br />
c.  执行./rebaseall -v 命令<br />
d. 正常情况下就OK通过，而我编译出现错误，提示系统临时目录无写入 权限<br />
e.  我编译出现错误，提示系统临时目录无写入权限，遂，手动修改了 rebaseall 文件的 83行处代码，如下：</p>
<pre class="sh"># TmpDir="${TMP:-${TEMP:-/tmp}}"
TmpDir="D:/servers/cygwin_local/temp"</pre>
<p>3. 启动cygwin下载 node.js源码编译并安装</p>
<pre class="shell">$ cd /
$ git clone git://github.com/joyent/node.git
$ cd node
$ ./configure
$ make
$ make install</pre>
<p>4.  设置DNS</p>
<p>cygwin内部使用windows的DNS查询，且node.js采用c-ares函数库，而c-ares函数库读取的  /etc/resolv.conf 里的nameserver配置，</p>
<p>所以需要手动建立 /etc/resolv.conf , 并增加以下nameserver 来让node.js执行网络操作时正常运行：</p>
<pre class="shell">$ vi /ect/resolv.conf

nameserver 8.8.8.8
nameserver 8.8.4.4</pre>
<p>5. 测试node.js环境</p>
<p>查看下 node安装信息：</p>
<pre class="shell">node --version</pre>
<p>写个简单的 Http Server来测试下node.js环境，保存一下代码为/worksapce/test.js：</p>
<pre class="js">var http = require('http'), port = 8888;

http.createServer(function (request, response) {
response.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8;' });
response.end('&lt;h1&gt;你好世界！&lt;/h1&gt;');
}).listen(port);

console.log('服务已启动 http://127.0.0.1:' + port + '/');
$ node /workspace/test.js</pre>
<p>开打浏览器访问 http://127.0.0.1:8888  查看效果</p>

	标签：<a href="http://www.zfkun.com/tag/cygwin" title="cygwin" rel="tag">cygwin</a>, <a href="http://www.zfkun.com/tag/js" title="js" rel="tag">js</a>, <a href="http://www.zfkun.com/tag/node" title="node" rel="tag">node</a>, <a href="http://www.zfkun.com/tag/nodejs" title="nodejs" rel="tag">nodejs</a>, <a href="http://www.zfkun.com/tag/win7" title="win7" rel="tag">win7</a>, <a href="http://www.zfkun.com/tag/windows" title="windows" rel="tag">windows</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/51.html" title="windows7 7068 X86三版本及下载 (2010 年 01 月 16 日)" data-comment="0">windows7 7068 X86三版本及下载</a></li>
	<li><a href="http://www.zfkun.com/449.html" title="Thinkpad 全系列驱动程序官方安装光盘下载 (2011 年 11 月 17 日)" data-comment="0">Thinkpad 全系列驱动程序官方安装光盘下载</a></li>
	<li><a href="http://www.zfkun.com/154.html" title="随机颜色 (2011 年 01 月 12 日)" data-comment="0">随机颜色</a></li>
	<li><a href="http://www.zfkun.com/59.html" title="腾讯TT、遨游浏览器检测 (2010 年 01 月 16 日)" data-comment="0">腾讯TT、遨游浏览器检测</a></li>
	<li><a href="http://www.zfkun.com/55.html" title="绝对震撼!10款动感图片展示js代码 (2010 年 01 月 16 日)" data-comment="0">绝对震撼!10款动感图片展示js代码</a></li>
	<li><a href="http://www.zfkun.com/277.html" title="微软MSDN windows 7 with sp1 中英文各版本x86x64下载地址 (2011 年 06 月 25 日)" data-comment="1">微软MSDN windows 7 with sp1 中英文各版本x86x64下载地址</a></li>
	<li><a href="http://www.zfkun.com/176.html" title="原生JSON.parse解析异常问题 (2011 年 03 月 18 日)" data-comment="0">原生JSON.parse解析异常问题</a></li>
	<li><a href="http://www.zfkun.com/147.html" title="前端资源文件缓存清除一法 (2010 年 11 月 25 日)" data-comment="0">前端资源文件缓存清除一法</a></li>
	<li><a href="http://www.zfkun.com/394.html" title="[转]利用跨域资源共享（CORS）实现ajax跨域调用 (2011 年 07 月 15 日)" data-comment="0">[转]利用跨域资源共享（CORS）实现ajax跨域调用</a></li>
	<li><a href="http://www.zfkun.com/80.html" title="[转]Google Closure: 糟糕的JavaScript (2010 年 01 月 19 日)" data-comment="0">[转]Google Closure: 糟糕的JavaScript</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/226.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>HTML5 canvas 初级入门教程</title>
		<link>http://www.zfkun.com/220.html</link>
		<comments>http://www.zfkun.com/220.html#comments</comments>
		<pubDate>Sun, 20 Mar 2011 11:38:24 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[js]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=220</guid>
		<description><![CDATA[HTML5 canvas 即HTML5画布，是一个现代浏览器都支持的HTML5非插件绘图的功能，本文将展示如何通过HTML5 canvas API操作canvas元素、绘制图形、改变绘图颜色以及删除图形，让我们开始进入这很酷的新技术的短暂旅行吧。 <a href="http://www.zfkun.com/220.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>HTML5 canvas 即HTML5画布，是一个现代浏览器都支持的HTML5非插件绘图的功能，本文将展示如何通过HTML5 canvas API操作canvas元素、绘制图形、改变绘图颜色以及删除图形，让我们开始进入这很酷的新技术的短暂旅行吧。</p>
<h2>canvas元素简介</h2>
<p>使用canvas元素相当简单，它只是一个单纯的HTML标签，外加宽高两个特性。</p>
<pre name="code" class="html">&lt;canvas width="500" height="500"&gt;
&lt;!-- 在这里插入向后兼容的内容，不支持canvas的浏览器可以解析和显示 --&gt;
&lt;/canvas&gt;</pre>
<p>上面的代码在页面中插入了一个透明的画布，canvas元素内部的内容可以在不支持canvas功能的浏览器下显示你想给你的用户提供的信息，联想下&lt;noscript&gt;元素就可以。</p>
<h2>浏览器支持</h2>
<p>很重要的一点就是浏览器对canvas的支持还是相当不错的，所有现代浏览器都支持它，包括最新版的IE9：</p>
<blockquote><p>Internet Explorer 9.0+<br />
Safari 3.0+<br />
Firefox 3.0+<br />
Chrome 3.0+<br />
Opera 10.0+<br />
iOS 1.0+<br />
Android 1.0+</p></blockquote>
<p>有趣的是，你可以在IE8以及更低版本的IE浏览器下使用canvas功能，借助<a title="ExplorerCanas" href="http://code.google.com/p/explorercanvas/" target="_blank">ExplorerCanvas 插件</a>。</p>
<h2>画布尺寸</h2>
<p>当定义canvas元素的尺寸时，最好通过HTML设置它的width和height特性，因为通过CSS设置宽高会导致画布按比例缩放到你设置的值，这背后有它的逻辑原因：在canvas元素的内部存在一个名为2d渲染环境（2d redering context）的对象，所以，通过CSS设置画布尺寸会引起奇怪的效果。</p>
<h2>探索2d 渲染环境</h2>
<p>我们上面提到的canvas元素只是canvas功能的一部分，另一部分是2d渲染环境，它可以让你实现很酷的看得到的东西。</p>
<p>需要完全理清的是：当你使用canvas，你不是在canvas元素上画图，事实上你是在canvas元素内部的2d渲染环境上。</p>
<h2>坐标系统</h2>
<p>如果你曾经使用过2d绘图编程语言（比如ActionScript、Processing等），你应该会了解基于屏幕（screen-based）的坐标系统。canvas内部的2d渲染环境并没有什么不同之处，它采用标准的笛卡尔坐标系统，原点位于屏幕左上角，向右移动会增加x坐标的值，向下移动会增加y坐标的值，很容易理解。</p>
<p><a href="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444647417_e731191271.jpg" target="_blank"><img class="aligncenter size-full wp-image-354" title="canvas unit" src="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444647417_e731191271.jpg" alt="" width="500" height="353" /></a></p>
<p>通常坐标系统的单位是屏幕的1像素。</p>
<h2>操作2d渲染环境</h2>
<p>需要利用Javascript提供的API来获取2d渲染环境对象，该方法为：getContext()，看下简单的例子：</p>
<pre name="code" class="html">&lt;canvas id="csser-com-Canvas" width="500" height="500"&gt;
   &lt;!-- 向后兼容的内容 --&gt;
&lt;/canvas&gt;
&lt;script&gt;
var canvas = document.getElementById("csser-com-Canvas");
var c = canvas.getContext("2d");
&lt;/script&gt;</pre>
<p>通过调用canvas对象的getContext()方法，c变量就包含了指向2d渲染环境的引用，这意味着你现在已经完成了在画布上绘图的一切准备，接下来可以开始绘图了。</p>
<h2>绘制矩形</h2>
<p>获得了2d渲染环境对象，就可以通过调用API提供的大量方法来进行绘图了，一个最基本的方法就是fillRect()，通过它可以绘制一个填充颜色的矩形（颜色默认值为黑色）。</p>
<p>在c变量的下面增加以下代码：</p>
<pre name="code" class="js">c.fillRect(0, 0, 50, 50);</pre>
<p>这将在画布左上角绘制绘制一个黑色背景的正方形：</p>
<p><a href="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444673295_e0f869e948_m.jpg" target="_blank"><img class="aligncenter size-full wp-image-355" title="canvas fillRect" src="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444673295_e0f869e948_m.jpg" alt="canvas fillRect" width="58" height="60" /></a></p>
<p>在调用fillRect()方法时传入了4个参数：</p>
<ul>
<li>第一个是基于原点的x坐标位置</li>
<li>第二个是基于原点的y坐标位置</li>
<li>第三个是宽度</li>
<li>第四个是高度</li>
</ul>
<p>fillRect的伪代码看起来应该像这个样子：</p>
<pre name="code" class="js">c.fillRect(x, y, width, height);</pre>
<p>很酷的是，不仅可以绘制填充的矩形，你还可以绘制线框矩形，使用strokeRect()方法，绘制四周产生描边效果的矩形，如：</p>
<pre name="code" class="js">c.strokeRect(50, 50, 100, 100);</pre>
<p>strokeRect的参数与fillRect是一致的，绘制的结果如下：</p>
<p><a href="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444673313_94f0bb9556_m.jpg" target="_blank"><img class="aligncenter size-full wp-image-356" title="canvas strokeRect" src="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444673313_94f0bb9556_m.jpg" alt="canvas strokeRect" width="160" height="160" /></a></p>
<p>利用canvas绘图，简单、优美，所有的方法都很易懂，但是当放在一起使用可以让你画出很漂亮的图形。</p>
<h2>绘制路径</h2>
<p>矩形是唯一一个可以通过单个API方法绘制的图形，先把它放在一边，我们来学习下路径（Paths）绘制。使用路径，可以绘制线条、连续的曲线以及复合图形。</p>
<p>绘制一个简单的路径需要利用一些AIP方法：</p>
<blockquote><p>beginPath 开始一个新路径<br />
moveTo 移动路径的绘图起点<br />
lineTo 从moveTo定义的点开始绘制连续的路径，或者从上一次的lineTo的终点开始绘制。<br />
closePath 连接最后的点和最初的点并关闭路径绘制<br />
fill 用颜色填充路径<br />
stroke 描变路径</p></blockquote>
<p>尝试执行下面的代码：</p>
<pre name="code" class="js">c.beginPath();
c.moveTo(50, 50);
c.lineTo(50, 250);
c.lineTo(250, 250);
c.closePath;
c.fill();</pre>
<p>执行结果为：</p>
<p><a href="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5445275668_000b7c58f1_m.jpg" target="_blank"><img class="aligncenter size-full wp-image-357" title="canvas paths" src="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5445275668_000b7c58f1_m.jpg" alt="canvas paths" width="208" height="207" /></a></p>
<p>你可以用同样的方法绘制你希望的图形，canvas还包含更高级的路径绘制，比如圆弧（可以绘制圆形）和贝塞尔曲线（用于绘制很酷的曲线效果），总之，绘制路径要比绘制矩形复杂的多。</p>
<h2>改变颜色</h2>
<p>到目前为止，我们的示例所绘制的都是填充或描边的黑色，canvas也提供了一些属性用于改变绘制图形的颜色，它们是fillStyle和strokeStyle，它们的语法都是可以自解释的，所以我们直接来改变一个矩形的填充颜色：</p>
<pre name="code" class="js">c.fillStyle = "rgb(255, 0, 0)";
c.fillRect(50, 50, 100, 100);</pre>
<p>结果：</p>
<p><a href="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5445275680_58dc82498b_m.jpg" target="_blank"><img class="aligncenter size-full wp-image-358" title="canvas fillStyle" src="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5445275680_58dc82498b_m.jpg" alt="canvas fillStyle" width="107" height="107" /></a></p>
<p>或者，你可以改变描边的颜色：</p>
<pre name="code" class="js">c.strokeStyle = "rgb(255, 0, 0)";
c.strokeRect(50, 50, 100, 100);</pre>
<p>结果：</p>
<p><a href="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5445275718_085b9c4e07_m.jpg" target="_blank"><img class="aligncenter size-full wp-image-359" title="canvas strokeStyle" src="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5445275718_085b9c4e07_m.jpg" alt="canvas strokeStyle" width="109" height="109" /></a></p>
<p>fillStyle和strokeStyle属性很漂亮的一点就是，它们都支持普通CSS颜色值，这意味着你可以使用RGB、RGBA、HSA、颜色名称以及十六进制颜色值。</p>
<p>还有一点需要指出的是，改变画布中的颜色值不会影响已经绘制的任何图形，例如，如果你绘制了一个黑色的矩形，然后设置填充为红色，接着绘制了另一个矩形，这时第一个矩形仍然为黑色。</p>
<h2>改变线宽</h2>
<p>除了可以改变颜色，还可以利用lineWidth属性改变描边线条的宽度，按照上面的例子，改变线条宽度：</p>
<pre name="code" class="js">c.lineWidth = 20;
c.strokeStyle = "#f00";
c.strokeRect(50, 50, 100, 100);</pre>
<p>结果：</p>
<p><a href="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444673423_370c8a9c4e_m.jpg" target="_blank"><img class="aligncenter size-full wp-image-360" title="canvas lineWidth" src="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444673423_370c8a9c4e_m.jpg" alt="canvas lineWidth" width="133" height="133" /></a></p>
<p>同样的可以改变路径的线宽：</p>
<pre name="code" class="js">c.lineWidth = 20;
c.beginPath();
c.moveTo(50, 50);
c.lineTo(50, 250);
c.lineTo(250, 250);
c.closePath();
c.stroke();</pre>
<p>结果：</p>
<p><a href="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444673489_5a79a07697_m.jpg" target="_blank"><img class="aligncenter size-full wp-image-361" title="canvas lineWidth paths" src="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444673489_5a79a07697_m.jpg" alt="canvas lineWidth paths" width="240" height="240" /></a></p>
<p>还有一些其它的改变线条的方式，比如lineCap设置线条的末端，lineJoin设置线条的角。</p>
<h2>删除图形</h2>
<p>最后我们来了解下如何删除已经绘制的图形，删除图形只需Javascript API提供的一个名为clearRect的方法，其原理是使参数指定的矩形区域背景变为透明。</p>
<p>本文示例画布长宽分别为500像素，要想删除整个画布图形，可以这样做：</p>
<pre name="code" class="js">c.fillRect(50, 50, 100, 100);
c.clearRect(0, 0, 500, 500);</pre>
<p>上面的代码执行后，你会什么都看不到，事实上填充的矩形已经绘制，只是瞬间被删除了，所以你看不到它。</p>
<p>如果你不清楚画布的具体宽高，清除整个画布可以这样：</p>
<pre name="code" class="js">c.clearRect(0, 0, canvas.width, canvas.height);</pre>
<h2>删除画布中的区域</h2>
<p>如果你不想删除整个画布的图形，而仅仅删除画布中的一个区域，假如，你绘制了一个黑色的正方形，旁边绘制了一个红色的正方形：</p>
<pre name="code" class="js">c.fillRect(50, 50, 100, 100);
c.fillStyle = "#f00";
c.fillRect(200, 50, 100, 100);</pre>
<p>看起来是这个样子：</p>
<p><a href="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444673565_a360d6e213_m.jpg" target="_blank"><img class="aligncenter size-full wp-image-362" title="canvas clearRect" src="http://www.zfkun.com/blog/wp-content/uploads/2011/03/5444673565_a360d6e213_m.jpg" alt="canvas clearRect" width="240" height="104" /></a></p>
<p>接下来你可以通过clearRect删除黑色背景的正方形而只保留红色正方形：</p>
<pre name="code" class="js">c.clearRect(50, 50, 100, 100);</pre>
<p>注意传入clearRect的参数能确保能覆盖要被删除的图形的区域。</p>
<p>原文：<a href="http://net.tutsplus.com/tutorials/javascript-ajax/canvas-from-scratch-introducing-canvas/" target="_blank">Canvas From Scratch: Introducing Canvas</a></p>

	标签：<a href="http://www.zfkun.com/tag/api" title="api" rel="tag">api</a>, <a href="http://www.zfkun.com/tag/canvas" title="canvas" rel="tag">canvas</a>, <a href="http://www.zfkun.com/tag/html" title="html" rel="tag">html</a>, <a href="http://www.zfkun.com/tag/html5" title="html5" rel="tag">html5</a>, <a href="http://www.zfkun.com/tag/js" title="js" rel="tag">js</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/157.html" title="MooTools Upgrade from 1.2 to 1.3 (2011 年 01 月 13 日)" data-comment="0">MooTools Upgrade from 1.2 to 1.3</a></li>
	<li><a href="http://www.zfkun.com/html5" title="HTML5 (2011 年 06 月 03 日)" data-comment="0">HTML5</a></li>
	<li><a href="http://www.zfkun.com/154.html" title="随机颜色 (2011 年 01 月 12 日)" data-comment="0">随机颜色</a></li>
	<li><a href="http://www.zfkun.com/59.html" title="腾讯TT、遨游浏览器检测 (2010 年 01 月 16 日)" data-comment="0">腾讯TT、遨游浏览器检测</a></li>
	<li><a href="http://www.zfkun.com/55.html" title="绝对震撼!10款动感图片展示js代码 (2010 年 01 月 16 日)" data-comment="0">绝对震撼!10款动感图片展示js代码</a></li>
	<li><a href="http://www.zfkun.com/176.html" title="原生JSON.parse解析异常问题 (2011 年 03 月 18 日)" data-comment="0">原生JSON.parse解析异常问题</a></li>
	<li><a href="http://www.zfkun.com/147.html" title="前端资源文件缓存清除一法 (2010 年 11 月 25 日)" data-comment="0">前端资源文件缓存清除一法</a></li>
	<li><a href="http://www.zfkun.com/394.html" title="[转]利用跨域资源共享（CORS）实现ajax跨域调用 (2011 年 07 月 15 日)" data-comment="0">[转]利用跨域资源共享（CORS）实现ajax跨域调用</a></li>
	<li><a href="http://www.zfkun.com/80.html" title="[转]Google Closure: 糟糕的JavaScript (2010 年 01 月 19 日)" data-comment="0">[转]Google Closure: 糟糕的JavaScript</a></li>
	<li><a href="http://www.zfkun.com/226.html" title="Windows7下搭建Node.js环境 (2011 年 04 月 06 日)" data-comment="1">Windows7下搭建Node.js环境</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/220.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何检测HTML表单已经发生改变</title>
		<link>http://www.zfkun.com/218.html</link>
		<comments>http://www.zfkun.com/218.html#comments</comments>
		<pubDate>Sun, 20 Mar 2011 11:36:46 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[change]]></category>
		<category><![CDATA[defaultChecked]]></category>
		<category><![CDATA[defaultSelected]]></category>
		<category><![CDATA[defaultValue]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[检测]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=218</guid>
		<description><![CDATA[表单是Web应用不可缺少的功能，它是服务器端与浏览器端数据交换的最基本的方法。你应该已经读过很多关于HTML5和Javascript的表单标签和数据验证的文章，今天我们来讨论下如何检查表单数据是否被改变了。 <a href="http://www.zfkun.com/218.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>表单是Web应用不可缺少的功能，它是服务器端与浏览器端数据交换的最基本的方法。你应该已经读过很多关于HTML5和Javascript的表单标签和数据验证的文章，今天我们来讨论下如何检查表单数据是否被改变了。</p>
<h2>为什么要检查表单数据被改变？</h2>
<p>有很多理由需要检测表单数据是否有修改，让我们来看一个很常见的场景，如果用户修改了一个或多个表单域的值，当用户跳离当前页面时，你会给出用户类似“你的修改尚未保存”的提示。你甚至可以给出用户是否保存数据（比如Ajax）的选项。另外的情况，如果表单项没有被修改，这时略去冗余的表单验证和数据发送将会增强用户体验。</p>
<h2>Javascript onchange事件</h2>
<p>为HTML表单元素添加onchange事件处理器是一种可行的方法，这也是用的最多的，但是onchange的实现有一些问题存在：</p>
<ol>
<li>如果用户改变表单域的值，然后再修改回原始值，程序仍将认为表单的修改已经发生。</li>
<li>如果表单项的值是通过Javascript动态修改的，onchange事件不会被自动触发。</li>
<li>为每一个表单元素增加onchange事件会引起性能问题，特别是较大的表单。</li>
<li>如果将表单元素从DOM中增加或移除，你需要相应的注册或移除事件侦听。</li>
<li>checkbox和radio的onchange事件在某些浏览器下不能按预期工作（你应该知道是哪个浏览器）。</li>
<li>除了onchange，还有更简单有效的方案。</li>
</ol>
<h2>比较默认值</h2>
<p>幸运的是，我们不需要为了复杂的事件处理而写过多的废话，每个表单元素都有与该对象相关联的默认值，即页面加载完后表单控件显示或者默认的数据值，该值可与用户操作后的值进行对比以得出表单域的值是否发生了改变。</p>
<p>有点麻烦的是，不同类型的表单元素的默认值属性（properties）不尽相同（做些判断好了，并不影响什么）</p>
<h2>input和textarea</h2>
<p>让我们从简单的元素开始，所有的textarea对象和除了checkbox、radio之外的 input对象都有一个名为defaultValue的属性，我们可以对比文本域的当前值和默认值是否相同以决定文本域的修改是否发生。</p>
<pre>&lt;!-- name input --&gt;
&lt;input type="text" id="name" name="name" value="www.csser.com" /&gt;
&lt;script&gt;
var name = document.getElementById("name");
if (n.value != n.defaultValue) alert("#name has changed");
&lt;/script&gt;</pre>
<p><strong>小提示</strong>：HTML4或XHTML中，文本域类型为text、hidden、password或file的对象有defaultValue属性。HTML5新的表单类型也有defaultValue属性并且可以用相同的方式检测默认值是否改变过，这些新表单元素包含email、tel、url、range、date、color和search。</p>
<h2>checkbox和radio</h2>
<p>checkbox和radio对象有一个defaultChecked属性，其取值为true或false，我们可以通过对比当前选中状态与默认选中状态进行比较，如：</p>
<pre>&lt;!-- newsletter opt-in --&gt;
&lt;input type="checkbox" id="optin" name="optin" checked="checked" /&gt;
&lt;script&gt;
var optin = document.getElementById("optin");
if (n.checked != n.defaultChecked) alert("#optin has changed by csser");
&lt;/script&gt;</pre>
<p>注意checkbox和radio对象也有defaultValue属性，但它仅被分配给元素的value特性（attribute）而不能标识当前的选中状态。</p>
<h2>下拉列表select</h2>
<p>select控件通常用于提供一个下拉列表供用户选择，相比上面提到的控件，select有一点复杂，select元素本身并不具有默认值属性，它的默认值存在于其option元素集合内。当页面加载完毕，默认选中的option拥有selected特性，也就是这个option对象拥有defaultSelected属性且值为true。</p>
<p>我们可以从select节点的selectedIndex属性取得当前选中的option的索引值，如果该option对象的defaultSelected属性为false，那么select控件的值一定被修改了，如：</p>
<pre>&lt;!-- job title select box --&gt;
&lt;select id="job" name="job"&gt;
   &lt;option&gt;web designer&lt;/option&gt;
   &lt;option selected="selected"&gt;csser.com developer&lt;/option&gt;
   &lt;option&gt;graphic artist&lt;/option&gt;
   &lt;option&gt;IT professional&lt;/option&gt;
   &lt;option&gt;other&lt;/option&gt;
&lt;/select&gt;
&lt;script&gt;
var job = document.getElementById("job");
if (!job.options[job.selectedIndex].defaultSelected) alert("#job has changed");
&lt;/script&gt;</pre>
<p>上面的代码在单选下拉列表并且有一个option拥有selected特性时运行正常，但我们需要留意一些陷阱：</p>
<ol>
<li>如果没有option被赋予selected特性，浏览器会将第一个设为默认选中，但其defaultSelected属性值却为false</li>
<li>如果两个或更多option拥有selected特性（这不合逻辑，但是可能的），每个option都会拥有defaultSelected属性且值为true，但是浏览器仅能得到最后一个的默认值。</li>
<li>多重选择控件允许用户选择任意个option：</li>
</ol>
<pre>&lt;!-- skills multi-select box --&gt;
&lt;select id="skills" name="skills" multiple="multiple"&gt;
   &lt;option selected="selected"&gt;HTML&lt;/option&gt;
   &lt;option selected="selected"&gt;CSSer&lt;/option&gt;
   &lt;option selected="selected"&gt;JavaScript&lt;/option&gt;
   &lt;option&gt;PHP&lt;/option&gt;
&lt;/select&gt;</pre>
<p>多选下拉列表并不常用，因为用多个checkbox可以提供更友好的界面，但是，如果使用多选下拉列表，多个option具有defaultSelected属性且值为true，select节点的selectedIndex属性已经无效，所以需要循环每一个option才能判断其selected属性是否与其defaultSelected属性相匹配。下面的代码可以解决这个问题：</p>
<pre>var  skills = document.getElementById("skills"),c = false, def = 0, o, ol, opt;
for (o = 0, ol = n.options.length; o &lt; ol; o++) {
   opt = skills.options[o];
   c = c || (opt.selected != opt.defaultSelected);
   if (opt.defaultSelected) def = o;
}
if (c &amp;&amp; !skills.multiple) c = (def != skills.selectedIndex);
if (c) alert("#skills has changed");</pre>
<p>上面这些就是本文介绍的如何检测一个表单值是否改变的内容。</p>
<p>&nbsp;</p>
<p>原文：<a href="http://blogs.sitepoint.com/2011/02/18/detect-html-form-changes/" target="_blank">How to Check That an HTML Form Has Been Changed</a></p>

	标签：<a href="http://www.zfkun.com/tag/change" title="change" rel="tag">change</a>, <a href="http://www.zfkun.com/tag/defaultchecked" title="defaultChecked" rel="tag">defaultChecked</a>, <a href="http://www.zfkun.com/tag/defaultselected" title="defaultSelected" rel="tag">defaultSelected</a>, <a href="http://www.zfkun.com/tag/defaultvalue" title="defaultValue" rel="tag">defaultValue</a>, <a href="http://www.zfkun.com/tag/form" title="form" rel="tag">form</a>, <a href="http://www.zfkun.com/tag/%e6%a3%80%e6%b5%8b" title="检测" rel="tag">检测</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/59.html" title="腾讯TT、遨游浏览器检测 (2010 年 01 月 16 日)" data-comment="0">腾讯TT、遨游浏览器检测</a></li>
	<li><a href="http://www.zfkun.com/216.html" title="Javascript浏览器另类探测技巧 (2011 年 03 月 20 日)" data-comment="0">Javascript浏览器另类探测技巧</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/218.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript浏览器另类探测技巧</title>
		<link>http://www.zfkun.com/216.html</link>
		<comments>http://www.zfkun.com/216.html#comments</comments>
		<pubDate>Sun, 20 Mar 2011 11:22:34 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[detector]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[opera]]></category>
		<category><![CDATA[safari]]></category>
		<category><![CDATA[检测]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=216</guid>
		<description><![CDATA[下面是一些另类的但挺高效的浏览器探测技巧，主要利用了各浏览器的私有特征完成。 <a href="http://www.zfkun.com/216.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h1><span style="font-size: x-small;"><span class="Apple-style-span" style="font-weight: normal;">下面是一些另类的但挺高效的浏览器探测技巧，主要利用了各浏览器的私有特征完成。</span></span></h1>
<p>进入正题：</p>
<pre name="code" class="js">//Firefox detector 2/3 by DoctorDan(slackers论坛)
FF=/a/[-1]=='a'
//Firefox 3
FF3=(function x(){})[-5]=='x'
//Firefox 2
FF2=(function x(){})[-6]=='x'
//IE
IE='\v'=='v'
//Safari
Saf=/a/.__proto__=='//'
//Chrome
Chr=/source/.test((/a/.toString+''))
//Opera by me
Op=/^function \(/.test([].sort)
//IE6
try {IE6=@cc_on @_jscript_version &lt;= 5.7&amp;&amp;@_jscript_build&lt;10000} catch(e){IE6=false;}
</pre>
<h3>整合到一行：</h3>
<pre name="code" class="js">B=(function x(){})[-5]=='x'?'FF3':(function x(){})[-6]=='x'?'FF2':/a/</pre>
<p>原文链接:       <a href="http://www.thespanner.co.uk/2009/01/29/detecting-browsers-javascript-hacks/" target="_blank">Detecting browsers javascript hacks</a></p>

	标签：<a href="http://www.zfkun.com/tag/browser" title="browser" rel="tag">browser</a>, <a href="http://www.zfkun.com/tag/detector" title="detector" rel="tag">detector</a>, <a href="http://www.zfkun.com/tag/hack" title="hack" rel="tag">hack</a>, <a href="http://www.zfkun.com/tag/javascript" title="JavaScript" rel="tag">JavaScript</a>, <a href="http://www.zfkun.com/tag/opera" title="opera" rel="tag">opera</a>, <a href="http://www.zfkun.com/tag/safari" title="safari" rel="tag">safari</a>, <a href="http://www.zfkun.com/tag/%e6%a3%80%e6%b5%8b" title="检测" rel="tag">检测</a>, <a href="http://www.zfkun.com/tag/%e6%b5%8f%e8%a7%88%e5%99%a8" title="浏览器" rel="tag">浏览器</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/59.html" title="腾讯TT、遨游浏览器检测 (2010 年 01 月 16 日)" data-comment="0">腾讯TT、遨游浏览器检测</a></li>
	<li><a href="http://www.zfkun.com/218.html" title="如何检测HTML表单已经发生改变 (2011 年 03 月 20 日)" data-comment="0">如何检测HTML表单已经发生改变</a></li>
	<li><a href="http://www.zfkun.com/394.html" title="[转]利用跨域资源共享（CORS）实现ajax跨域调用 (2011 年 07 月 15 日)" data-comment="0">[转]利用跨域资源共享（CORS）实现ajax跨域调用</a></li>
	<li><a href="http://www.zfkun.com/80.html" title="[转]Google Closure: 糟糕的JavaScript (2010 年 01 月 19 日)" data-comment="0">[转]Google Closure: 糟糕的JavaScript</a></li>
	<li><a href="http://www.zfkun.com/417.html" title="WordPress Rewrite SEO 之404方式折腾笔记 (2011 年 07 月 17 日)" data-comment="1">WordPress Rewrite SEO 之404方式折腾笔记</a></li>
	<li><a href="http://www.zfkun.com/388.html" title="window.open() 之句柄保持和重连 (2011 年 07 月 14 日)" data-comment="0">window.open() 之句柄保持和重连</a></li>
	<li><a href="http://www.zfkun.com/366.html" title="Market Enabler &#8211; Android越狱改区利器 (2011 年 07 月 10 日)" data-comment="2">Market Enabler &#8211; Android越狱改区利器</a></li>
	<li><a href="http://www.zfkun.com/211.html" title="JavaScript Memory Leak Detector (v2) (2011 年 03 月 20 日)" data-comment="0">JavaScript Memory Leak Detector (v2)</a></li>
	<li><a href="http://www.zfkun.com/142.html" title="IE6+和FF的CSS Hack (2010 年 04 月 23 日)" data-comment="0">IE6+和FF的CSS Hack</a></li>
	<li><a href="http://www.zfkun.com/182.html" title="add bookmark for ie &#038; ff &#038; opera (2011 年 03 月 20 日)" data-comment="0">add bookmark for ie &#038; ff &#038; opera</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/216.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript Memory Leak Detector (v2)</title>
		<link>http://www.zfkun.com/211.html</link>
		<comments>http://www.zfkun.com/211.html#comments</comments>
		<pubDate>Sun, 20 Mar 2011 10:58:12 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[资源共享]]></category>
		<category><![CDATA[detector]]></category>
		<category><![CDATA[IEJsLeaksDetector]]></category>
		<category><![CDATA[leak]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[v2]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=211</guid>
		<description><![CDATA[JavaScript Memory Leak Detector (download) is a debugging tool to detect memory leaks and enforce best practices in JavaScript code when working with version of Internet Explorer older than IE8. <a href="http://www.zfkun.com/211.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h4>Introduction</h4>
<div>JavaScript Memory Leak Detector (<em><a title="IEJSLeaksDetector2.0.1.1.zip" href="http://joinmicrosofteurope.com/files/IEJSLeaksDetector2.0.1.1.zip">download</a></em>) is a debugging tool to detect memory leaks and enforce best practices in JavaScript code when working with version of Internet Explorer older than IE8.</p>
<p>As described in detail in this <a href="http://msdn.microsoft.com/en-us/library/bb250448.aspx">MSDN article</a> the JScript garbage collector in previous versions of Internet Explorer manages the lifetime of JScript objects but not of DOM objects. As a result, the JScript garbage collector cannot break circular references between DOM objects and JScript objects, and memory leaks may occur.</div>
<div>
<ul>
<li>In IE6, these circular references are broken when the Internet Explorer process terminates (and leaks are very frequent).</li>
<li>In IE7, these circular references are broken when users navigate away from the page.</li>
<li>In IE8 the problem is completely mitigated. (Read <a href="http://code.msdn.microsoft.com/Release/ProjectReleases.aspx?ProjectName=ie8whitepapers&amp;ReleaseId=578">here</a> for more details).</li>
</ul>
</div>
<p>Programmers who need to support older versions of the Internet Explorer browser should still try to pay attention to programming patterns such as JScript closures, as they could cause memory leaks.</p>
<p>The leak detector works hosting an IE WebBrowser control and intercepting the execution of JavaScript inside IE. It monitors al the DOM elements in the markup of a web document that somehow interact with JavaScript and presents a list of potentially leaked objects to the user, together with information about the scripts loaded in the page and, if possible, a hint to the instruction that may have caused the leak.</p>
<h4>Installation notes</h4>
<p>IEJSLeaksDetector is a plain, native, Windows application and does not require any particular setup (the executable can be just unzipped and run).<br />
It only runs in 32 bit versions of Windows. 64 bits editions are not supported yet.</p>
<p>There are only two installation steps required to make sure that the tool works correctly:</p>
<p>1. The tool requires that the <strong>pdm.dll</strong> script installer is installed in the machine. This DLL is normally installed with any version of Microsoft Visual Studio.In case you are unable to install Visual Studio in the target machine, a simpler way to install pdm.dll is by installing the <strong>Microsoft Script Debugger</strong>, freely downloadable <a href="http://www.microsoft.com/downloads/details.aspx?familyid=2f465be0-94fd-4569-b3c4-dffdf19ccd99&amp;displaylang=en">here</a>.</p>
<p>2. The tool also requires Internet Explorer script debugging to be enabled to work correctly. Verify that the check box “Disable script debugging (Other)” is unchecked, in IE (&#8216;Tools&#8217; menu -&gt; Internet Options -&gt; &#8216;Advanced&#8217; tab -&gt; &#8216;Browsing&#8217; section) as shown in figure.</p>
<p><img src="http://blogs.msdn.com/photos/gpdepix/images/7108465/original.aspx" alt="" width="380" height="474" /></p>
<h4>How to use the tool</h4>
<p>The user can start the memory profiling of a web application navigating to the desired URL. A new tab is opened with a WebBrowser control and a tree view shows all the documents and scripts that compose the current page.<br />
When the user has finished to interact with the page he can click the “Stop” button, which causes the tool to close the control and track possible leaks.<br />
Memory leaks are listed specifying the DOM object&#8217;s type and a list of “attached” JavaScript objects whose circular reference could be the cause of the leak. The tool also shows the call stack correponding to a memory leak, which represents the state of the script at the moment when the JavaScript object was attached to the DOM object. Finally, a script window highlights the exact point in the JavaScript code where the memory leak originated.<br />
More information can be found in the docs enclosed with the <a href="http://joinmicrosofteurope.com/files/IEJSLeaksDetector2.0.1.1.zip">binaries</a>.</p>
<p><img title="Javascript leaks detector" src="http://blogs.msdn.com/photos/gpdepix/images/9856180/original.aspx" alt="Javascript leaks detector" width="985" height="778" /></p>
<p>&nbsp;</p>

	标签：<a href="http://www.zfkun.com/tag/detector" title="detector" rel="tag">detector</a>, <a href="http://www.zfkun.com/tag/iejsleaksdetector" title="IEJsLeaksDetector" rel="tag">IEJsLeaksDetector</a>, <a href="http://www.zfkun.com/tag/leak" title="leak" rel="tag">leak</a>, <a href="http://www.zfkun.com/tag/memory" title="memory" rel="tag">memory</a>, <a href="http://www.zfkun.com/tag/v2" title="v2" rel="tag">v2</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/109.html" title="Understanding and Solving Internet Explorer Leak Patterns (2010 年 02 月 28 日)" data-comment="0">Understanding and Solving Internet Explorer Leak Patterns</a></li>
	<li><a href="http://www.zfkun.com/216.html" title="Javascript浏览器另类探测技巧 (2011 年 03 月 20 日)" data-comment="0">Javascript浏览器另类探测技巧</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/211.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>欺骗IE不出现Flash激活框的小发现</title>
		<link>http://www.zfkun.com/205.html</link>
		<comments>http://www.zfkun.com/205.html#comments</comments>
		<pubDate>Sun, 20 Mar 2011 10:43:08 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[falsh]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[激活框]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=205</guid>
		<description><![CDATA[大家都知道欺骗IE不出现Flash激活框的方法很简单 只要在页面上面引入一个js文件，然后用js来控制flash的html代码输出即可。 但是如果我们的脚本是动态加载的就会有两种情况，看以下代码 &#160; var s = docuemnt.createElement(“script”); s.src = src; docuemnt.getElementsByTagName(“head”)[0].appendChild(s); var s = docuemnt.createElement(“script”); docuemnt.getElementsByTagName(“head”)[0].appendChild(s); s.src = src; 一眼看下去这两断代码执行结果上面差不多。但是有一段代码无法欺骗IE，引入的js输出flash会出现激活框。 这两断唯一区别就是 先给 script 对象的src赋值 再 append到head。还是先append再赋值。我做了实验，只有先给 script 的src 赋值再 append 到页面上面就可以欺骗IE了。 标签：falsh, ie, 激活框 相关推荐 [转]IE6、IE7、IE8 CSS Bug兼容解决记录 Understanding &#8230; <a href="http://www.zfkun.com/205.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>大家都知道欺骗IE不出现Flash激活框的方法很简单 只要在页面上面引入一个js文件，然后用js来控制flash的html代码输出即可。</p>
<p>但是如果我们的脚本是动态加载的就会有两种情况，看以下代码</p>
<p>&nbsp;</p>
<div>
<div></div>
<div id="code2465">var s = docuemnt.createElement(“script”);<br />
s.src = src;<br />
docuemnt.getElementsByTagName(“head”)[0].appendChild(s);</div>
</div>
<div>
<div></div>
<div id="code44527">var s = docuemnt.createElement(“script”);<br />
docuemnt.getElementsByTagName(“head”)[0].appendChild(s);<br />
s.src = src;</div>
</div>
<p>一眼看下去这两断代码执行结果上面差不多。但是有一段代码无法欺骗IE，引入的js输出flash会出现激活框。</p>
<p><strong>这两断唯一区别就是 先给 script 对象的src赋值 再 append到head。还是先append再赋值。我做了实验，只有先给 script 的src 赋值再 append 到页面上面就可以欺骗IE了。 </strong></p>

	标签：<a href="http://www.zfkun.com/tag/falsh" title="falsh" rel="tag">falsh</a>, <a href="http://www.zfkun.com/tag/ie" title="ie" rel="tag">ie</a>, <a href="http://www.zfkun.com/tag/%e6%bf%80%e6%b4%bb%e6%a1%86" title="激活框" rel="tag">激活框</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/275.html" title="[转]IE6、IE7、IE8 CSS Bug兼容解决记录 (2011 年 06 月 14 日)" data-comment="1">[转]IE6、IE7、IE8 CSS Bug兼容解决记录</a></li>
	<li><a href="http://www.zfkun.com/109.html" title="Understanding and Solving Internet Explorer Leak Patterns (2010 年 02 月 28 日)" data-comment="0">Understanding and Solving Internet Explorer Leak Patterns</a></li>
	<li><a href="http://www.zfkun.com/142.html" title="IE6+和FF的CSS Hack (2010 年 04 月 23 日)" data-comment="0">IE6+和FF的CSS Hack</a></li>
	<li><a href="http://www.zfkun.com/182.html" title="add bookmark for ie &#038; ff &#038; opera (2011 年 03 月 20 日)" data-comment="0">add bookmark for ie &#038; ff &#038; opera</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/205.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XHR与浏览器导航冲突解决方案</title>
		<link>http://www.zfkun.com/199.html</link>
		<comments>http://www.zfkun.com/199.html#comments</comments>
		<pubDate>Sun, 20 Mar 2011 09:45:11 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[history]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[xhr]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=199</guid>
		<description><![CDATA[最早没有 xhr 的时候，要想得到无刷新的用户体验，唯一的方法就是隐藏帧技术（frame） ,发展到现在的 iframe，这个技术仍然有它的使用场景，即在文件上传以及 简单情况下浏览器的前进后退导航功能 上。 <a href="http://www.zfkun.com/199.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>历史：</p>
<p>最早没有 xhr 的时候，要想得到无刷新的用户体验，唯一的方法就是隐藏帧技术（frame） ,发展到现在的 iframe，这个技术仍然有它的使用场景，即在文件上传以及 简单情况下浏览器的前进后退导航功能 上。</p>
<p>&nbsp;</p>
<p>使用：</p>
<p>当一个页面嵌入一个iframe时，当javascript变动iframe的 src（或者操作document open 与  close），会在浏览器上生成一条历史记录，点击后退的话，主页面没有变化，但是iframe会加载历史记录中的上一条src（或者文档），因此可以解 决传统用户体验的浏览器导航部分。</p>
<p>&nbsp;</p>
<p>适用范围：</p>
<p>一般用于界面切换，当界面有大的变化，且没有修改或删除操作时 ，可以由用户点击浏览器的返回操作来达到上一个操作界面。</p>
<p>&nbsp;</p>
<p>技术描述：(firefox 适用，ie不适用)</p>
<p>&nbsp;</p>
<p>主页面 javascript 设置里面的 iframe 的 src （向服务器传递信息），当iframe 加载完毕后，在iframe的页面调用主页面的回调函数，达到更新主页面的作用，并向浏览器添加一条历史记录。当用户点击后退后，iframe会加载历史记录的上一条页面，重新调用上一个页面所应该的主页面callback，修改主页面到上一个功能界面，达到是主页面回退的效果.  iframe 一般是设置样式 display:none，排除在文档流中，不参与用户界面。</p>
<p>&nbsp;</p>
<p>示例 (firefox 适用)：</p>
<p>&nbsp;</p>
<p>主页面 ：index.html</p>
<pre title="XHR与浏览器导航冲突解决方案">&lt;iframe id='i' style='display:none'&gt;&lt;/iframe&gt;
&lt;div id='d'&gt;&lt;/div&gt;
&lt;div id='d2'&gt;&lt;/div&gt;
&lt;input type='button' onclick='bclick();' value='change'/&gt;
&lt;script&gt;
	var ii=0;
	function callback(str){
		//alert(ii);
		document.getElementById('d').innerHTML='iframe call back :'+str;
	}

	function bclick() {
		document.getElementById('d2').innerHTML='mimic ajax '+ii;
		document.getElementById('i').src='iframe.html?i='+(ii++);
	}

	window.onload=function(){
		document.getElementById('i').src='iframe.html';
	}
	&lt;/script&gt;</pre>
<p>&nbsp;</p>
<p>隐藏帧页面 :iframe.html</p>
<pre title="XHR与浏览器导航冲突解决方案">&lt;script&gt;
	window.onload=function(){
		parent.callback(window.location);

	}
&lt;/script&gt;</pre>
<p>&nbsp;</p>
<p><strong>实战（多浏览器解决方案） </strong></p>
<p>&nbsp;</p>
<p>根据 advanced dom scripting 以及 YUI <strong>YAHOO.util.History </strong> 提出的方案，可以解决浏览器导航问题以及书签功能。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>对于 firefox,ie8 可以直接给url添加 hash ，则firefox,ie8会把变动的 url加到浏览器history中，而ie6,7 则不会。 </strong></p>
<p>&nbsp;</p>
<p><strong> firefox </strong></p>
<p>&nbsp;</p>
<p>每次操作添加 hash 到 url，并后台 setInterval 监控 url hash 的变化，根据当前的hash 进行 ajax 操作，（ 用户点击后退只会改变hash值。  ）</p>
<p>&nbsp;</p>
<p><strong>updated 2010-12-29 : </strong></p>
<p>firefox chrome 已经支持 <a href="http://www.w3.org/TR/html5/history.html" target="_blank">hashchange</a> 事件，不再需要定时器监控了，监听事件即可。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong> ie 6,7 </strong></p>
<p>&nbsp;</p>
<p>设 置隐藏的iframe，每次操作用脚本设置iframe的内容 (注意：如果仅仅设置 src 参数 ?x=xx 不同，ie6,7  并不会产生历史纪录，必须src不同，直接脚本产生 iframe  新document（open,write,close）也可以产生历史纪录)，将当前hash 插入到生成的iframe内容中，后台监控  setInterval  iframe 内容中 hash 的变化，如果变化（ 用户点击后退会使当前页面iframe的内容变化   ），则提取hash值，添加到主页面url，执行相关ajax 操作。</p>
<p>&nbsp;</p>
<p><strong>YUI BHM 相关操作：</strong></p>
<pre title="XHR与浏览器导航冲突解决方案">/**
     * Update the IFrame with our new state.
     *
     * @method _updateIFrame
     * @private
     * @return {boolean} true if successful. false otherwise.
     */
    function _updateIFrame (fqstate) {

        var html, doc;

        html = '&lt;html&gt;&lt;body&gt;&lt;div id="state"&gt;' + fqstate + '&lt;/div&gt;&lt;/body&gt;&lt;/html&gt;';

        try {
            doc = _histFrame.contentWindow.document;
            doc.open();
            doc.write(html);
            doc.close();
            return true;
        } catch (e) {
            return false;
        }
    }</pre>
<p>&nbsp;</p>
<p>关键是 <strong>open() ,close() 会增加历史</strong> ，之后可以将数据附在 doc 上，后退的话数据就会回来，但是注意 close() 后会触发 iframe load 事件，yui3 采用 hash 来存储数据：</p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; font-size: 12px; line-height: 18px; white-space: pre;">HistoryHash._updateIframe = function (hash, replace) {</span></p>
<pre title="XHR与浏览器导航冲突解决方案">        var iframeDoc      = iframe.contentWindow.document,
            iframeLocation = iframeDoc.location;

        iframeDoc.open().close();

        if (replace) {
            iframeLocation.replace(hash.charAt(0) === '#' ? hash : '#' + hash);
        } else {
            iframeLocation.hash = hash;
        }
    };</pre>
<p>&nbsp;</p>
<p><strong>ie8 </strong></p>
<p>&nbsp;</p>
<p>很简单，由于有相关事件直接监控 Hash 变动即可 ，不用像firefox一样轮循查看 ：</p>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; font-size: 12px; line-height: 18px; white-space: pre;">if (YAHOO.env.ua.ie) {</span></p>
<pre title="XHR与浏览器导航冲突解决方案">            if (typeof document.documentMode === "undefined" || document.documentMode &lt; <img src='http://www.zfkun.com/blog/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> {

                // IE &lt; 8 or IE8 in quirks mode or IE7 standards mode
                //利用 iframe 来生成历史纪录
                _checkIframeLoaded();

            } else {

                // IE8 in IE8 standards mode
                //直接利用特有事件
                YAHOO.util.Event.on(top, "hashchange",
                    function () {
                        var hash = _getHash();
                        _handleFQStateChange(hash);
                        _storeStates();
                    });

                _initialized = true;
                YAHOO.util.History.onLoadEvent.fire();

            }

        } else {
            //其他浏览器，轮训hash值变化
            // Start the thread that will have the responsibility to
            // periodically check whether a navigate operation has been
            // requested on the main window. This will happen when
            // YAHOO.util.History.navigate has been called or after
            // the user has hit the back/forward button.

            // On Safari 1.x and 2.0, the only way to catch a back/forward
            // operation is to watch history.length... We basically exploit
            // what I consider to be a bug (history.length is not supposed
            // to change when going back/forward in the history...) This is
            // why, in the following thread, we first compare the hash,
            // because the hash thing will be fixed in the next major
            // version of Safari. So even if they fix the history.length
            // bug, all this will still work!
            counter = history.length;

            // On Gecko and Opera, we just need to watch the hash...
            hash = _getHash();

            setInterval(function () {

                var state, newHash, newCounter;

                newHash = _getHash();
                newCounter = history.length;
                if (newHash !== hash) {
                    hash = newHash;
                    counter = newCounter;
                    _handleFQStateChange(hash);
                    _storeStates();
                } else if (newCounter !== counter &amp;&amp; YAHOO.env.ua.webkit) {
                    hash = newHash;
                    counter = newCounter;
                    state = _fqstates[counter - 1];
                    _handleFQStateChange(state);
                    _storeStates();
                }

            }, 50);</pre>
<p><strong>书签问题： </strong></p>
<p>&nbsp;</p>
<p>多个浏览器都可以通过，添加书签附带了当前页面的hash值。载入书签时，首先读取Hash值进入相应的ajax操作。</p>
<h1><strong>demo:</strong></h1>
<p>&nbsp;</p>
<p><strong>updated : 2010-12-29</strong></p>
<p>&nbsp;</p>
<p>由于 ie&gt;7 以及 firefox ,chrome 都已经支持 hashchange 事件以及历史存储，那么实际上难点就是 ie6,7 下使用 iframe 来记录导航历史 ：</p>
<p>&nbsp;</p>
<p><a href="http://lite-ext.googlecode.com/svn/trunk/lite-ext/playground/hash_history/test.html" target="_blank">simple hashchange for ie6,7 @ google code</a></p>
<p>&nbsp;</p>
<p>kissy 采用先进的事件补丁技术<a href="https://github.com/yiminghe/kissy/blob/master/src/event/event-hashchange.js" target="_blank">优雅地解决了这个问题</a> ，在任何浏览器下都可以<a href="http://lite-ext.googlecode.com/svn/trunk/lite-ext/playground/hash_history/kissy.html" target="_blank">直接</a> ：</p>
<pre title="XHR与浏览器导航冲突解决方案">    function t() {
        alert("current hash :" + window.location.hash);
    }
    KISSY.Event.on(window, "hashchange", t);</pre>
<p>即可 ！</p>
<p>&nbsp;</p>
<p>PS：<strong>html5 提出了新的标准</strong> ，目前 chrome 下已经实现：</p>
<p>&nbsp;</p>
<p><a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html" target="_blank">session history and navigation</a></p>
<p>&nbsp;</p>
<p>github 也做了尝试：</p>
<p>&nbsp;</p>
<p><a href="http://stackoverflow.com/questions/4371705/how-to-rewrite-url-without-refresh-like-github-com" target="_blank">how to rewrite url without refresh like github</a></p>
<p>&nbsp;</p>
<p>PS2: 如果不想使得修改 hash 而引起浏览器增加历史记录，可使用 <a href="http://msdn.microsoft.com/en-us/library/ms536712%28v=vs.85%29.aspx" target="_blank">location.replace(&#8216;#xx&#8217;)</a> ，对于 ie6,7 模拟的iframe，情况则只需要只修改 body 的 innerHtml :</p>
<p>iframe.contentWindow.document.body.innerHTML=&#8217;#xx&#8217;</p>
<p>&nbsp;</p>

	标签：<a href="http://www.zfkun.com/tag/hash" title="hash" rel="tag">hash</a>, <a href="http://www.zfkun.com/tag/history" title="history" rel="tag">history</a>, <a href="http://www.zfkun.com/tag/iframe" title="iframe" rel="tag">iframe</a>, <a href="http://www.zfkun.com/tag/xhr" title="xhr" rel="tag">xhr</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/167.html" title="判断 iframe 是否加载完成的完美方法 (2011 年 01 月 13 日)" data-comment="0">判断 iframe 是否加载完成的完美方法</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/199.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Repaint 跟踪浏览器的渲染</title>
		<link>http://www.zfkun.com/196.html</link>
		<comments>http://www.zfkun.com/196.html#comments</comments>
		<pubDate>Sun, 20 Mar 2011 09:32:35 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[MozAfterPaint]]></category>
		<category><![CDATA[reflow]]></category>
		<category><![CDATA[repaint]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=196</guid>
		<description><![CDATA[前端优化，从很久就开始了。随着研究的深入，关注的点就越来越多。最近也有不少的前端开发同学在研究浏览器的Reflow和Repaint  <a href="http://www.zfkun.com/196.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>前端优化，从很久就开始了。随着研究的深入，关注的点就越来越多。最近也有不少的前端开发同学在研究浏览器的<a title="分析Reflow和Repaint的文章" href="http://www.stubbornella.org/content/2009/03/27/reflows-repaints-css-performance-making-your-javascript-slow/">Reflow和Repaint</a> . 引用以为Yahoo前端开发工程师的分析</p>
<blockquote>
<div>repaint(重绘)是在一个元素的外观被改变，但没有改变布局的情况下发生，如改变visibility、outline、前景色。</div>
<div>“According to <a title="Opera" href="http://dev.opera.com/articles/view/efficient-javascript/?page=3#reflow">Opera</a> , repaint is expensive because the browser must verify the visibility of all other nodes in the DOM tree.”</div>
<div>当repaint发生时，浏览器会验证DOM树上的所有其它结点的visibility属性。</div>
<div>reflow(回流)是导致DOM脚本执行低效的关键因素之一。页面上任何一个结点触发reflow，都会导致它的子结点及祖先结点重新渲染。</div>
<div><a href="http://blog.360.yahoo.com/blog-sOW1QOA9crUyOdXFxOeK4xc-?cq=1&amp;p=213" target="_blank">文本出自</a></div>
</blockquote>
<div>而 Firefox 3.5 给我们提供了一个很好的观察 Repaint 的接口 <a href="https://developer.mozilla.org/en/Gecko-Specific_DOM_Events" target="_blank">MozAfterPaint</a>. 通过这个事件，我们可以看到我们网页的渲染情况是如何，这样会给我们分析reflow带来帮助。</div>
<div>下面的例子需要 <a href="http://www.mozilla.com/en-US/firefox/all-beta.html" target="_blank">firefox 3.5 beta</a></div>
<div></div>
<div><a href="http://www.pjhome.net/web/paint_tester.html" target="_blank"><img src="http://www.pjhome.net/images/icons/page_white_code.gif" alt="" />监听网页的重绘情况</a></div>
<p>&nbsp;</p>

	标签：<a href="http://www.zfkun.com/tag/mozafterpaint" title="MozAfterPaint" rel="tag">MozAfterPaint</a>, <a href="http://www.zfkun.com/tag/reflow" title="reflow" rel="tag">reflow</a>, <a href="http://www.zfkun.com/tag/repaint" title="repaint" rel="tag">repaint</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/196.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ECMAScript 5与HTML5的支持情况</title>
		<link>http://www.zfkun.com/192.html</link>
		<comments>http://www.zfkun.com/192.html#comments</comments>
		<pubDate>Sun, 20 Mar 2011 09:14:50 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[ecmascript5]]></category>
		<category><![CDATA[html5]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=192</guid>
		<description><![CDATA[ECMAScript 5与HTML5离我们越来越近了，触摸屏相关的API开发中，未来的web世界更加多姿多彩。 <a href="http://www.zfkun.com/192.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>ECMAScript 5与HTML5离我们越来越近了，触摸屏相关的API开发中，未来的web世界更加多姿多彩。</p>
<p>Object.getPrototypeOf<br />
支持浏览器：firefox3.6 chrome4</p>
<p>http://codereview.chromium.org/518056</p>
<p>Object.getOwnPropertyDescriptor<br />
支持浏览器：IE8 chrome4</p>
<p>http://code.google.com/p/chromium/issues/detail?id=20345</p>
<p>Object.keys<br />
支持浏览器： chrome4</p>
<p>http://code.google.com/p/chromium/issues/detail?id=21767</p>
<p>Object.defineProperty<br />
支持浏览器： IE8</p>
<p>http://msdn.microsoft.com/en-us/library/dd548687(VS.85).aspx</p>
<p>https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/defineProperty</p>
<p>Object.create<br />
支持浏览器： chrome4</p>
<p>http://msdn.microsoft.com/en-us/library/dd548687(VS.85).aspx</p>
<p>Object.getOwnPropertyNames<br />
支持浏览器： chrome4</p>
<p>http://code.google.com/p/v8/source/detail?r=3620</p>
<p>关于Object的扩展，可以看John Resig的这一篇博文《ECMAScript 5 Objects and Properties》</p>
<p>JSON<br />
支持浏览器： IE8 chrome1+ safari3+ firefox3+</p>
<p>JSON.parse( text, translate )<br />
JSON.stringify( obj, translate )<br />
String.prototype.toJSON<br />
Boolean.prototype.toJSON<br />
Number.prototype.toJSON<br />
Date.prototype.toJSON</p>
<p>http://blog.mozilla.com/webdev/2009/02/12/native-json-in-firefox-31/</p>
<p>http://blogs.msdn.com/ie/archive/2008/09/10/native-json-in-ie8.aspx</p>
<p>Date.now<br />
支持浏览器： chrome4 firefox2+ safari4</p>
<p>http://trac.webkit.org/changeset/33422</p>
<p>https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Date/now</p>
<p>Date.prototype.toISOString<br />
支持浏览器： chrome4 firefox3.6 safari4</p>
<p>https://bugs.webkit.org/show_bug.cgi?id=26594</p>
<p>String.prototype.trim<br />
支持浏览器： chrome1+ firefox3+</p>
<p>https://bugs.webkit.org/show_bug.cgi?id=26590</p>
<p>http://code.google.com/p/v8/issues/detail?id=465</p>
<p>https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects/String/Trim</p>
<p>“Array extras”<br />
Array.prototype.{indexOf,lastIndexOf,every,some,forEach,map,filter,reduce,reduceRight}</p>
<p>IE8全部不支持，Opera不支持reduce,reduceRight，chrome与safari与firefox早就实现了</p>
<p>https://developer.mozilla.org/en/New_in_JavaScript_1.6#Array_extras</p>
<p>Array.isArray<br />
支持浏览器： chrome4</p>
<p>http://codereview.chromium.org/271072</p>
<p>ECMAScript 5 Getters and Setters<br />
这是旧有的javascript不能模拟的新特性！</p>
<p>o = {<br />
a:7,<br />
get b() { return this.a+1; },<br />
set c(x) { this.a = x/2; }<br />
};</p>
<p>https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Creating_New_Objects/Defining_Getters_and_Setters</p>
<p>支持浏览器：Firefox 2.0+, Safari 3.0+, Chrome 1.0+, Opera 9.5+</p>
<p>非标准，Firefox1.5里的旧方法</p>
<p>HTMLElement.prototype.__defineGetter__(“innerHTML”, function () {});<br />
HTMLElement.prototype.__defineSetter__(“innerHTML”, function (val) {});<br />
支持浏览器：Firefox 2.0+, Safari 3.0+, Google Chrome 1.0+, Opera 9.5+</p>
<p>标准</p>
<p>Object.defineProperty(document.body, “innerHTML”, { get : function () {} });<br />
MSDN文档：http://msdn.microsoft.com/en-us/library/dd229916(VS.85).aspx<br />
支持：IE8+ (只能对DOM使用)</p>
<p>HTML5 DOM Storage<br />
window.localStorage<br />
window.sessionStorage //可跨域，标签页关掉就清空<br />
支持浏览器：Firefox 3.5+, Safari 4.0+, IE 8.0+</p>
<p>http://www.w3.org/TR/webstorage/</p>
<p>http://www.quirksmode.org/dom/html5.html#localstorage</p>
<p>https://developer.mozilla.org/en/DOM/Storage</p>
<p>http://msdn.microsoft.com/en-us/library/cc197062(VS.85).aspx</p>
<p>HTML5 Offline Application Cache<br />
用一个manifest文件缓存静态资源（图片,css, js之类）在离线状态下使用，不是结构化数据</p>
<p>&lt;html manifest=”foo.manifest”&gt;<br />
&lt;h1&gt;Entry&lt;/h1&gt;<br />
&lt;/html&gt;<br />
支持浏览器：Firefox 3.5+</p>
<p>http://www.w3.org/TR/offline-webapps/#offline</p>
<p>https://developer.mozilla.org/en/Offline_resources_in_Firefox</p>
<p>HTML5 Web SQL Database Storage<br />
//2007年就实现了！<br />
var database = openDatabase(“Database Name”, “Database Version”);</p>
<p>database.executeSql(“SELECT * FROM test”, function(result1) {<br />
// do something with the results<br />
database.executeSql(“DROP TABLE test”, function(result2) {<br />
// do some more stuff<br />
alert(“My second database query finished executing!”);<br />
});<br />
});<br />
支持浏览器：Safari, iPhone OS 3, Opera 10.50，chrome4</p>
<p>http://webkit.org/blog/126/webkit-does-html5-client-side-database-storage/</p>
<p>http://www.weboshelp.net/getting-started-with-webos/156-palm-webos-html5-database-storage-tutorial/</p>
<p>HTML5 Web Workers<br />
实现多线程！？</p>
<p>var worker = new Worker(“worker.js”);<br />
// Watch for messages from the worker<br />
worker.onmessage = function(e){<br />
// The message from the client:<br />
e.data<br />
};</p>
<p>worker.postMessage(“start”);<br />
支持浏览器：firefox3.1+</p>
<p>http://www.w3.org/TR/workers/</p>
<p>https://developer.mozilla.org/En/Using_web_workers</p>
<p>日本人用它来实现的框架</p>
<p>HTML5 Geolocation<br />
支持浏览器：FF3.5+, iPhone OS 3<br />
&lt;!DOCTYPE html&gt;<br />
&lt;html lang=”en” xmlns=”http://www.w3.org/1999/xhtml”&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv=”Content-Type” content=”text/html;charset=utf-8&#8243; /&gt;<br />
&lt;meta name=”viewport” content=”width=620&#8243; /&gt;<br />
&lt;title&gt;HTML5 Demo: geolocation&lt;/title&gt;<br />
&lt;style&gt;<br />
body {<br />
font: normal 16px/20px Helvetica, sans-serif;<br />
background: rgb(237, 237, 236);<br />
margin: 0;<br />
margin-top: 40px;<br />
padding: 0;<br />
}</p>
<p>section, header, footer {<br />
display: block;<br />
}</p>
<p>#wrapper {<br />
width: 600px;<br />
margin: 0 auto;<br />
background: #fff url(images/shade.jpg) repeat-x center bottom;<br />
-moz-border-radius: 10px;<br />
-webkit-border-radius: 10px;<br />
border-top: 1px solid #fff;<br />
padding-bottom: 76px;<br />
}</p>
<p>h1 {<br />
padding-top: 10px;<br />
}</p>
<p>h2 {<br />
font-size: 100%;<br />
font-style: italic;<br />
}</p>
<p>header,<br />
article &gt; *,<br />
footer &gt; * {<br />
margin: 20px;<br />
}</p>
<p>footer &gt; * {<br />
margin: 20px;<br />
color: #999;<br />
}</p>
<p>#status {<br />
padding: 5px;<br />
color: #fff;<br />
background: #ccc;<br />
}</p>
<p>#status.fail {<br />
background: #c00;<br />
}</p>
<p>#status.success {<br />
background: #0c0;<br />
}<br />
&lt;/style&gt;<br />
&lt;script type=”text/javascript” src=”http://maps.google.com/maps/api/js?sensor=false”&gt;&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;section id=”wrapper”&gt;<br />
&lt;header&gt;</p>
<p>&lt;h1&gt;Geolocation&lt;/h1&gt;<br />
&lt;/header&gt;<br />
&lt;article&gt;<br />
&lt;p&gt;Finding your location: &lt;span id=”status”&gt;checking&#8230;&lt;/span&gt;&lt;/p&gt;<br />
&lt;/article&gt;<br />
&lt;footer&gt;&lt;a href=”http://www.cnblogs.com/rubylouvre/archive/2010/02/16/1668647.html”&gt;返回&lt;/a&gt;&lt;/footer&gt;<br />
&lt;/section&gt;</p>
<p>&lt;script&gt;<br />
function success(position) {<br />
var s = document.querySelector(&#8216;#status&#8217;);</p>
<p>if (s.className == &#8216;success&#8217;) {<br />
// not sure why we&#8217;re hitting this twice in FF, I think it&#8217;s to do with a cached result coming back<br />
return;<br />
}</p>
<p>s.innerHTML = “found you!”;<br />
s.className = &#8216;success&#8217;;</p>
<p>var mapcanvas = document.createElement(&#8216;div&#8217;);<br />
mapcanvas.id = &#8216;mapcanvas&#8217;;<br />
mapcanvas.style.height = &#8217;400px&#8217;;<br />
mapcanvas.style.width = &#8217;100%&#8217;;</p>
<p>document.querySelector(&#8216;article&#8217;).appendChild(mapcanvas);</p>
<p>var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);<br />
var myOptions = {<br />
zoom: 15,<br />
center: latlng,<br />
mapTypeControl: false,<br />
navigationControlOptions: {style: google.maps.NavigationControlStyle.SMALL},<br />
mapTypeId: google.maps.MapTypeId.ROADMAP<br />
};<br />
var map = new google.maps.Map(document.getElementById(“mapcanvas”), myOptions);</p>
<p>var marker = new google.maps.Marker({<br />
position: latlng,<br />
map: map,<br />
title:”You are here!”<br />
});<br />
}</p>
<p>function error(msg) {<br />
var s = document.querySelector(&#8216;#status&#8217;);<br />
s.innerHTML = typeof msg == &#8216;string&#8217; ? msg : “failed”;<br />
s.className = &#8216;fail&#8217;;</p>
<p>// console.log(arguments);<br />
}</p>
<p>if (navigator.geolocation) {<br />
navigator.geolocation.getCurrentPosition(success, error);<br />
} else {<br />
error(&#8216;not supported&#8217;);<br />
}</p>
<p>&lt;/script&gt;</p>
<p>&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>运行代码</p>
<p>http://www.w3.org/TR/geolocation-API/</p>
<p>https://developer.mozilla.org/En/Using_geolocation</p>
<p>HTML5 Drag and Drop<br />
原生拖放API<br />
&lt;!DOCTYPE html&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;meta content=”text/html; charset=UTF-8&#8243; http-equiv=”content-type”/&gt;<br />
&lt;title&gt;HTML5 Drag and drop demonstration&lt;/title&gt;<br />
&lt;style type=”text/css”&gt;<br />
* {<br />
margin: 0;<br />
padding: 0;<br />
}</p>
<p>body {<br />
margin: 50px;<br />
font-family: helvetica, arial;<br />
}</p>
<p>li {<br />
list-style: none;<br />
}</p>
<p>li a {<br />
text-decoration: none;<br />
color: #000;<br />
margin: 10px;<br />
width: 150px;<br />
border: 3px dashed #999;<br />
background: #eee;<br />
padding: 10px;<br />
display: block;<br />
}</p>
<p>*[draggable=true] {<br />
-moz-user-select:none;<br />
-khtml-user-drag: element;<br />
cursor: move;<br />
}</p>
<p>*:-khtml-drag {<br />
background-color: rgba(238,238,238, 0.5);<br />
}</p>
<p>a:hover:after {<br />
content: &#8216; (drag me)&#8217;;<br />
}</p>
<p>li.over {<br />
border-color: #333;<br />
background: #ccc;<br />
}</p>
<p>#bin {<br />
background: url(http://html5demos.com/images/bin.jpg) top right no-repeat;<br />
height: 250px;<br />
width: 166px;<br />
float: right;<br />
border: 5px solid #000;<br />
position: relative;<br />
}</p>
<p>#bin.over {<br />
background: url(images/bin.jpg) top left no-repeat;<br />
}</p>
<p>#bin p {<br />
font-weight: bold;<br />
text-align: center;<br />
position: absolute;<br />
bottom: 20px;<br />
width: 166px;<br />
font-size: 32px;<br />
color: #fff;<br />
text-shadow: #000 2px 2px 2px;<br />
}</p>
<p>&lt;/style&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;div id=”bin”&gt;&lt;/div&gt;<br />
&lt;ul&gt;<br />
&lt;li&gt;&lt;a id=”one” href=”#”&gt;one&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href=”#” id=”two”&gt;two&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href=”#” id=”three”&gt;three&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href=”#” id=”four”&gt;four&lt;/a&gt;&lt;/li&gt;<br />
&lt;li&gt;&lt;a href=”#” id=”five”&gt;five&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;<br />
&lt;script src=”http://files.cnblogs.com/rubylouvre/html5.js”&gt;&lt;/script&gt;<br />
&lt;script&gt;</p>
<p>var eat = ['yum!', 'gulp', 'burp!', 'nom'];<br />
var yum = document.createElement(&#8216;p&#8217;);<br />
var msie = /*@cc_on!@*/0;<br />
yum.style.opacity = 1;</p>
<p>var links = document.querySelectorAll(&#8216;li &gt; a&#8217;), el = null;<br />
for (var i = 0; i &lt; links.length; i++) {<br />
el = links[i];</p>
<p>el.setAttribute(&#8216;draggable&#8217;, &#8216;true&#8217;);</p>
<p>addEvent(el, &#8216;dragstart&#8217;, function (e) {<br />
e.dataTransfer.effectAllowed = &#8216;move&#8217;;<br />
e.dataTransfer.setData(&#8216;Text&#8217;, this.id); // required otherwise doesn&#8217;t work<br />
});<br />
}</p>
<p>var bin = document.querySelector(&#8216;#bin&#8217;);</p>
<p>addEvent(bin, &#8216;dragover&#8217;, function (e) {<br />
if (e.preventDefault) e.preventDefault(); // allows us to drop<br />
this.className = &#8216;over&#8217;;<br />
return false;<br />
});</p>
<p>// to get IE to work<br />
addEvent(bin, &#8216;dragenter&#8217;, function (e) {<br />
this.className = &#8216;over&#8217;;<br />
return false;<br />
});</p>
<p>addEvent(bin, &#8216;dragleave&#8217;, function () {<br />
this.className = ”;<br />
});</p>
<p>addEvent(bin, &#8216;drop&#8217;, function (e) {<br />
if (e.stopPropagation) e.stopPropagation(); // stops the browser from redirecting&#8230;why???</p>
<p>var el = document.getElementById(e.dataTransfer.getData(&#8216;Text&#8217;));</p>
<p>el.parentNode.removeChild(el);</p>
<p>// stupid nom text + fade effect<br />
bin.className = ”;<br />
yum.innerHTML = eat[parseInt(Math.random() * eat.length)];</p>
<p>var y = yum.cloneNode(true);<br />
bin.appendChild(y);</p>
<p>setTimeout(function () {<br />
var t = setInterval(function () {<br />
if (y.style.opacity &lt;= 0) {<br />
if (msie) { // don&#8217;t bother with the animation<br />
y.style.display = &#8216;none&#8217;;<br />
}<br />
clearInterval(t);<br />
} else {<br />
y.style.opacity -= 0.1;<br />
}<br />
}, 50);<br />
}, 250);</p>
<p>return false;<br />
});</p>
<p>&lt;/script&gt;</p>
<p>&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>运行代码</p>
<p>支持浏览器：IE8, Safari 4, FF3.5</p>
<p>IE8如果报错，请刷新当前页面……</p>
<p>http://www.w3.org/TR/html5/editing.html#dnd</p>
<p>https://developer.mozilla.org/En/DragDrop/Drag_and_Drop</p>
<p>HTML5 Video<br />
支持浏览器：Safari 4, FF3.5,chrome3+<br />
&lt;!DOCTYPE html&gt;<br />
&lt;html lang=”en” xmlns=”http://www.w3.org/1999/xhtml”&gt;<br />
&lt;head&gt;<br />
&lt;meta charset=utf-8 /&gt;<br />
&lt;title&gt;HTML5 Demo: video&lt;/title&gt;<br />
&lt;style&gt;<br />
body {<br />
font: normal 16px/20px Helvetica, sans-serif;<br />
background: rgb(237, 237, 236);<br />
margin: 0;<br />
margin-top: 40px;<br />
padding: 0;<br />
}</p>
<p>article, section, header, footer {<br />
display: block;<br />
}</p>
<p>#wrapper {<br />
width: 600px;<br />
margin: 0 auto;<br />
background: #fff url(http://html5demos.com/images/shade.jpg) repeat-x center bottom;<br />
-moz-border-radius: 10px;<br />
-webkit-border-radius: 10px;<br />
border-top: 1px solid #fff;<br />
padding-bottom: 76px;<br />
}</p>
<p>h1 {<br />
padding-top: 10px;<br />
}</p>
<p>h2 {<br />
font-size: 100%;<br />
font-style: italic;<br />
}</p>
<p>header,<br />
article &gt; *,<br />
footer a,<br />
footer p {<br />
margin: 20px;<br />
}</p>
<p>footer &gt; * {<br />
margin: 20px;<br />
color: #999;<br />
}</p>
<p>article {<br />
display: block;<br />
position: relative;<br />
}</p>
<p>&lt;/style&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;section id=”wrapper”&gt;<br />
&lt;header&gt;<br />
&lt;h1&gt;Video&lt;/h1&gt;<br />
&lt;/header&gt;<br />
&lt;article&gt;<br />
&lt;video&gt;<br />
&lt;source src=”http://html5demos.com/dizzy.mp4&#8243; /&gt;<br />
&lt;source src=”http://html5demos.com/dizzy.ogv” /&gt;<br />
&lt;/video&gt;<br />
&lt;p id=”controls”&gt;<br />
&lt;input type=”button” id=”play” value=”play”&gt;<br />
&lt;span id=”position”&gt;00:00&lt;/span&gt; / &lt;span id=”duration”&gt;loading&#8230;&lt;/span&gt;<br />
&lt;/p&gt;<br />
&lt;p&gt;Note that (at time of writing) &lt;a href=”http://webkit.org/” title=”The WebKit Open Source Project”&gt;Webkit nightly&lt;/a&gt; supports full screen mode, which will add a button above.&lt;/p&gt;<br />
&lt;/article&gt;<br />
&lt;footer&gt;&lt;a href=”http://www.cnblogs.com/rubylouvre/”&gt;返回&lt;/a&gt;&lt;/footer&gt;<br />
&lt;/section&gt;<br />
&lt;script src=”http://html5demos.com/h5utils.js”&gt;&lt;/script&gt;<br />
&lt;script&gt;<br />
var video = document.querySelector(&#8216;video&#8217;),<br />
togglePlay = document.querySelector(&#8216;#play&#8217;),<br />
position = document.querySelector(&#8216;#position&#8217;),<br />
ready = false,<br />
controls = document.querySelector(&#8216;#controls&#8217;),<br />
fullscreen = null;</p>
<p>addEvent(togglePlay, &#8216;click&#8217;, function () {<br />
if (ready) {<br />
video.playbackRate = 0.5;<br />
if (video.paused) {<br />
if (video.ended) video.currentTime = 0;<br />
video.play();<br />
this.value = “pause”;<br />
} else {<br />
video.pause();<br />
this.value = “play”;<br />
}<br />
}<br />
});</p>
<p>addEvent(video, &#8216;timeupdate&#8217;, function () {<br />
position.innerHTML = asTime(this.currentTime);<br />
});</p>
<p>addEvent(video, &#8216;ended&#8217;, function () {<br />
togglePlay.value = “play”;<br />
});</p>
<p>addEvent(video, &#8216;canplay&#8217;, function () {<br />
video.muted = true;<br />
ready = true;<br />
document.querySelector(&#8216;#duration&#8217;).innerHTML = asTime(this.duration);</p>
<p>// note: .webkitSupportsFullscreen is false while the video is loading, so we bind in to the canplay event<br />
if (video.webkitSupportsFullscreen) {<br />
fullscreen = document.createElement(&#8216;input&#8217;);<br />
fullscreen.setAttribute(&#8216;type&#8217;, &#8216;button&#8217;);<br />
fullscreen.setAttribute(&#8216;value&#8217;, &#8216;fullscreen&#8217;);<br />
controls.insertBefore(fullscreen, controls.firstChild);<br />
addEvent(fullscreen, &#8216;click&#8217;, function () {<br />
video.webkitEnterFullScreen();<br />
});<br />
}</p>
<p>});</p>
<p>function asTime(t) {<br />
t = Math.round(t);<br />
var s = t % 60;<br />
var m = Math.round(t / 60);</p>
<p>return two(m) + &#8216;:&#8217; + two(s);<br />
}</p>
<p>function two(s) {<br />
s += “”;<br />
if (s.length &lt; 2) s = “0&#8243; + s;<br />
return s;<br />
}<br />
&lt;/script&gt;</p>
<p>&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>运行代码</p>
<p>https://developer.mozilla.org/En/Using_audio_and_video_in_Firefox</p>
<p>http://webkit.org/blog/140/html5-media-support/</p>
<p>HTML5 audio<br />
支持浏览器：Safari 4, FF3.5,chrome3+<br />
&lt;!doctype html&gt;<br />
&lt;html dir=”ltr” lang=”zh-CN”&gt;<br />
&lt;head&gt;<br />
&lt;meta charset=”utf-8&#8243;/&gt;<br />
&lt;title&gt;阅读器&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body &gt;<br />
&lt;article id=”nativity-story-from-luke”<br />
xmlns:o=”http://www.bibletechnologies.net/2003/OSIS/namespace”&gt;<br />
&lt;style scoped=”"&gt;<br />
/*@namespace o “http://www.bibletechnologies.net/2003/OSIS/namespace”;<br />
o|verse[osisID]:before,<br />
verse[osisID]:before {<br />
content: ” ” attr(osisID);<br />
font-size:smaller;<br />
vertical-align:super;<br />
}*/<br />
#nativity-story-from-luke audio {<br />
display:block;<br />
margin-top:1em;<br />
margin-bottom:1em;<br />
width:100%;<br />
}<br />
#nativity-story-from-luke span[data-begin]::selection { background-color:yellow; }<br />
#nativity-story-from-luke span[data-begin]::-moz-selection { background-color:yellow; }<br />
#nativity-story-from-luke span[data-begin] {<br />
cursor:pointer;<br />
}<br />
#nativity-story-from-luke span[data-begin]:hover {<br />
background-color:#FFFFCA;<br />
}<br />
#nativity-story-from-luke .error {<br />
color:red;<br />
}<br />
#nativity-story-from-luke footer {<br />
line-height:1.1em;<br />
margin-top:1em;<br />
}<br />
html #nativity-story-from-luke h2 { /* for appearance on my site */<br />
font-size:1.3em;<br />
margin-top:0;<br />
padding-top:0.5em;<br />
margin-bottom:1em;<br />
}<br />
&lt;/style&gt;<br />
&lt;!&#8211;<br />
&lt;o:work osisWork=”ESV”&gt;<br />
&lt;o:title&gt;English Standard Version&lt;/o:title&gt;<br />
&lt;o:type type=”OSIS”&gt;Bible&lt;/o:type&gt;<br />
&lt;o:identifier type=”OSIS”&gt;Bible.en.Crossway.ESV.2001&lt;/o:identifier&gt;<br />
&lt;o:scope&gt;Luke.2.1-Luke.2.20&lt;/o:scope&gt;<br />
&lt;o:refSystem&gt;Bible&lt;/o:refSystem&gt;<br />
&lt;/o:work&gt;<br />
&lt;o:work osisWork=”bible”&gt;<br />
&lt;o:type type=”OSIS”&gt;Bible&lt;/o:type&gt;<br />
&lt;o:refSystem&gt;Bible&lt;/o:refSystem&gt;<br />
&lt;/o:work&gt;<br />
&#8211;&gt;</p>
<p>&lt;h2&gt;&lt;a href=”http://www.gnpcb.org/esv/search/?q=Luke+2%3A1-20&#8243; title=”View Luke 2:1-20 at the ESV Online” target=”_blank”&gt;Luke 2:1-20&lt;/a&gt; (&lt;a href=”http://www.esv.org”&gt;&lt;abbr title=”English Standard Version”&gt;ESV&lt;/abbr&gt;&lt;/a&gt;)&lt;/h2&gt;</p>
<p>&lt;audio controls=”" style=”width:100%; height:2em;”&gt;<br />
&lt;source src=”http://weston.ruter.net/projects/html5-audio-read-along/Luke.2.1-Luke.2.20.mp3&#8243; type=”audio/mp3&#8243; /&gt;<br />
&lt;source src=”http://weston.ruter.net/projects/html5-audio-read-along/Luke.2.1-Luke.2.20.ogg” type=”audio/ogg” /&gt;<br />
&lt;source src=”http://weston.ruter.net/projects/html5-audio-read-along/Luke.2.1-Luke.2.20.wav” type=”audio/wav” /&gt;<br />
&lt;em class=&#8217;error&#8217;&gt;&lt;strong&gt;Notice:&lt;/strong&gt; Your browser doesn&#8217;t appear to support HTML5 Audio. Please use try Firefox 3.5, Chrome, or Safari.&lt;/em&gt;<br />
&lt;/audio&gt;<br />
&lt;noscript&gt;<br />
&lt;p class=&#8217;error&#8217;&gt;&lt;em&gt;&lt;strong&gt;Notice:&lt;/strong&gt; You must have JavaScript enabled/available to try this HTML5 Audio read along. If you&#8217;re<br />
viewing this in a feed reader, try &lt;a href=”http://weston.ruter.net/projects/html5-audio-read-along/#nativity-story-from-luke”&gt;viewing outside&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;<br />
&lt;/noscript&gt;</p>
<p>&lt;!&#8211;&lt;h3&gt;The Birth of Jesus Christ&lt;/h3&gt;&#8211;&gt;<br />
&lt;p&gt;&lt;o:verse sID=”Luke.2.1&#8243; osisID=”Luke.2.1&#8243;/&gt;&lt;span data-dur=”0.154&#8243; data-begin=”0.775&#8243;&gt;In&lt;/span&gt; &lt;span data-dur=”0.28&#8243; data-begin=”0.929&#8243;&gt;those&lt;/span&gt; &lt;span data-dur=”0.29&#8243; data-begin=”1.218&#8243;&gt;days&lt;/span&gt; &lt;span data-dur=”0.131&#8243; data-begin=”1.508&#8243;&gt;a&lt;/span&gt; &lt;span data-dur=”0.525&#8243; data-begin=”1.639&#8243;&gt;decree&lt;/span&gt; &lt;span data-dur=”0.191&#8243; data-begin=”2.165&#8243;&gt;went&lt;/span&gt; &lt;span data-dur=”0.225&#8243; data-begin=”2.355&#8243;&gt;out&lt;/span&gt; &lt;span data-dur=”0.245&#8243; data-begin=”2.583&#8243;&gt;from&lt;/span&gt; &lt;span data-dur=”0.438&#8243; data-begin=”2.828&#8243;&gt;Caesar&lt;/span&gt; &lt;span data-dur=”0.637&#8243; data-begin=”3.267&#8243;&gt;Augustus&lt;/span&gt; &lt;span data-dur=”0.166&#8243; data-begin=”4.03&#8243;&gt;that&lt;/span&gt; &lt;span data-dur=”0.268&#8243; data-begin=”4.216&#8243;&gt;all&lt;/span&gt; &lt;span data-dur=”0.111&#8243; data-begin=”4.486&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.411&#8243; data-begin=”4.594&#8243;&gt;world&lt;/span&gt; &lt;span data-dur=”0.205&#8243; data-begin=”5.006&#8243;&gt;should&lt;/span&gt; &lt;span data-dur=”0.134&#8243; data-begin=”5.211&#8243;&gt;be&lt;/span&gt; &lt;span data-dur=”0.529&#8243; data-begin=”5.344&#8243;&gt;registered&lt;/span&gt;. &lt;o:verse eID=”Luke.2.1&#8243;/&gt;&lt;o:verse sID=”Luke.2.2&#8243; osisID=”Luke.2.2&#8243;/&gt;&lt;span data-dur=”0.201&#8243; data-begin=”6.675&#8243;&gt;This&lt;/span&gt; &lt;span data-dur=”0.124&#8243; data-begin=”6.876&#8243;&gt;was&lt;/span&gt; &lt;span data-dur=”0.11&#8243; data-begin=”7&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.321&#8243; data-begin=”7.11&#8243;&gt;first&lt;/span&gt; &lt;span data-dur=”0.762&#8243; data-begin=”7.431&#8243;&gt;registration&lt;/span&gt; &lt;span data-dur=”0.164&#8243; data-begin=”8.193&#8243;&gt;when&lt;/span&gt; &lt;span data-dur=”0.474&#8243; data-begin=”8.357&#8243;&gt;Quirinius&lt;/span&gt; &lt;span data-dur=”0.206&#8243; data-begin=”8.834&#8243;&gt;was&lt;/span&gt; &lt;span data-dur=”0.338&#8243; data-begin=”9.041&#8243;&gt;governor&lt;/span&gt; &lt;span data-dur=”0.082&#8243; data-begin=”9.379&#8243;&gt;of&lt;/span&gt; &lt;span data-dur=”0.477&#8243; data-begin=”9.46&#8243;&gt;Syria&lt;/span&gt;. &lt;o:verse eID=”Luke.2.2&#8243;/&gt;&lt;o:verse sID=”Luke.2.3&#8243; osisID=”Luke.2.3&#8243;/&gt;&lt;span data-dur=”0.119&#8243; data-begin=”10.676&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.24&#8243; data-begin=”10.794&#8243;&gt;all&lt;/span&gt; &lt;span data-dur=”0.186&#8243; data-begin=”11.034&#8243;&gt;went&lt;/span&gt; &lt;span data-dur=”0.087&#8243; data-begin=”11.22&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.139&#8243; data-begin=”11.307&#8243;&gt;be&lt;/span&gt; &lt;span data-dur=”0.592&#8243; data-begin=”11.446&#8243;&gt;registered&lt;/span&gt;, &lt;span data-dur=”0.251&#8243; data-begin=”12.284&#8243;&gt;each&lt;/span&gt; &lt;span data-dur=”0.093&#8243; data-begin=”12.572&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.134&#8243; data-begin=”12.665&#8243;&gt;his&lt;/span&gt; &lt;span data-dur=”0.275&#8243; data-begin=”12.799&#8243;&gt;own&lt;/span&gt; &lt;span data-dur=”0.467&#8243; data-begin=”13.074&#8243;&gt;town&lt;/span&gt;. &lt;o:verse eID=”Luke.2.3&#8243;/&gt;&lt;o:verse sID=”Luke.2.4&#8243; osisID=”Luke.2.4&#8243;/&gt;&lt;span data-dur=”0.184&#8243; data-begin=”14.369&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.358&#8243; data-begin=”14.553&#8243;&gt;Joseph&lt;/span&gt; &lt;span data-dur=”0.351&#8243; data-begin=”14.911&#8243;&gt;also&lt;/span&gt; &lt;span data-dur=”0.128&#8243; data-begin=”15.262&#8243;&gt;went&lt;/span&gt; &lt;span data-dur=”0.152&#8243; data-begin=”15.39&#8243;&gt;up&lt;/span&gt; &lt;span data-dur=”0.215&#8243; data-begin=”15.595&#8243;&gt;from&lt;/span&gt; &lt;span data-dur=”0.541&#8243; data-begin=”15.811&#8243;&gt;Galilee&lt;/span&gt;, &lt;span data-dur=”0.074&#8243; data-begin=”16.557&#8243;&gt;from&lt;/span&gt; &lt;span data-dur=”0.121&#8243; data-begin=”16.632&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.236&#8243; data-begin=”16.752&#8243;&gt;town&lt;/span&gt; &lt;span data-dur=”0.097&#8243; data-begin=”16.988&#8243;&gt;of&lt;/span&gt; &lt;span data-dur=”0.559&#8243; data-begin=”17.085&#8243;&gt;Nazareth&lt;/span&gt;, &lt;span data-dur=”0.154&#8243; data-begin=”17.966&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.575&#8243; data-begin=”18.12&#8243;&gt;Judea&lt;/span&gt;, &lt;span data-dur=”0.129&#8243; data-begin=”18.823&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.059&#8243; data-begin=”18.952&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.31&#8243; data-begin=”19.011&#8243;&gt;city&lt;/span&gt; &lt;span data-dur=”0.166&#8243; data-begin=”19.321&#8243;&gt;of&lt;/span&gt; &lt;span data-dur=”0.393&#8243; data-begin=”19.487&#8243;&gt;David&lt;/span&gt;, &lt;span data-dur=”0.161&#8243; data-begin=”20.029&#8243;&gt;which&lt;/span&gt; &lt;span data-dur=”0.109&#8243; data-begin=”20.19&#8243;&gt;is&lt;/span&gt; &lt;span data-dur=”0.307&#8243; data-begin=”20.321&#8243;&gt;called&lt;/span&gt; &lt;span data-dur=”0.642&#8243; data-begin=”20.628&#8243;&gt;Bethlehem&lt;/span&gt;, &lt;span data-dur=”0.317&#8243; data-begin=”21.76&#8243;&gt;because&lt;/span&gt; &lt;span data-dur=”0.116&#8243; data-begin=”22.077&#8243;&gt;he&lt;/span&gt; &lt;span data-dur=”0.104&#8243; data-begin=”22.193&#8243;&gt;was&lt;/span&gt; &lt;span data-dur=”0.166&#8243; data-begin=”22.297&#8243;&gt;of&lt;/span&gt; &lt;span data-dur=”0.059&#8243; data-begin=”22.463&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.412&#8243; data-begin=”22.522&#8243;&gt;house&lt;/span&gt; &lt;span data-dur=”0.155&#8243; data-begin=”22.935&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.384&#8243; data-begin=”23.09&#8243;&gt;lineage&lt;/span&gt; &lt;span data-dur=”0.175&#8243; data-begin=”23.474&#8243;&gt;of&lt;/span&gt; &lt;span data-dur=”0.421&#8243; data-begin=”23.648&#8243;&gt;David&lt;/span&gt;, &lt;o:verse eID=”Luke.2.4&#8243;/&gt;&lt;o:verse sID=”Luke.2.5&#8243; osisID=”Luke.2.5&#8243;/&gt;&lt;span data-dur=”0.127&#8243; data-begin=”24.714&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.172&#8243; data-begin=”24.84&#8243;&gt;be&lt;/span&gt; &lt;span data-dur=”0.53&#8243; data-begin=”25.013&#8243;&gt;registered&lt;/span&gt; &lt;span data-dur=”0.125&#8243; data-begin=”25.543&#8243;&gt;with&lt;/span&gt; &lt;span data-dur=”0.515&#8243; data-begin=”25.668&#8243;&gt;Mary&lt;/span&gt;, &lt;span data-dur=”0.172&#8243; data-begin=”26.183&#8243;&gt;his&lt;/span&gt; &lt;span data-dur=”0.607&#8243; data-begin=”26.355&#8243;&gt;betrothed&lt;/span&gt;, &lt;span data-dur=”0.123&#8243; data-begin=”27.134&#8243;&gt;who&lt;/span&gt; &lt;span data-dur=”0.166&#8243; data-begin=”27.257&#8243;&gt;was&lt;/span&gt; &lt;span data-dur=”0.167&#8243; data-begin=”27.423&#8243;&gt;with&lt;/span&gt; &lt;span data-dur=”0.513&#8243; data-begin=”27.59&#8243;&gt;child&lt;/span&gt;. &lt;o:verse eID=”Luke.2.5&#8243;/&gt;&lt;o:verse sID=”Luke.2.6&#8243; osisID=”Luke.2.6&#8243;/&gt;&lt;span data-dur=”0.161&#8243; data-begin=”29.448&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.362&#8243; data-begin=”29.609&#8243;&gt;while&lt;/span&gt; &lt;span data-dur=”0.159&#8243; data-begin=”29.97&#8243;&gt;they&lt;/span&gt; &lt;span data-dur=”0.166&#8243; data-begin=”30.129&#8243;&gt;were&lt;/span&gt; &lt;span data-dur=”0.436&#8243; data-begin=”30.295&#8243;&gt;there&lt;/span&gt;, &lt;span data-dur=”0.159&#8243; data-begin=”31.072&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.431&#8243; data-begin=”31.231&#8243;&gt;time&lt;/span&gt; &lt;span data-dur=”0.277&#8243; data-begin=”31.662&#8243;&gt;came&lt;/span&gt; &lt;span data-dur=”0.161&#8243; data-begin=”31.939&#8243;&gt;for&lt;/span&gt; &lt;span data-dur=”0.093&#8243; data-begin=”32.1&#8243;&gt;her&lt;/span&gt; &lt;span data-dur=”0.107&#8243; data-begin=”32.193&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.233&#8243; data-begin=”32.299&#8243;&gt;give&lt;/span&gt; &lt;span data-dur=”0.352&#8243; data-begin=”32.522&#8243;&gt;birth&lt;/span&gt;. &lt;o:verse eID=”Luke.2.6&#8243;/&gt;&lt;o:verse sID=”Luke.2.7&#8243; osisID=”Luke.2.7&#8243;/&gt;&lt;span data-dur=”0.133&#8243; data-begin=”33.972&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.213&#8243; data-begin=”34.105&#8243;&gt;she&lt;/span&gt; &lt;span data-dur=”0.277&#8243; data-begin=”34.318&#8243;&gt;gave&lt;/span&gt; &lt;span data-dur=”0.253&#8243; data-begin=”34.596&#8243;&gt;birth&lt;/span&gt; &lt;span data-dur=”0.069&#8243; data-begin=”34.888&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.171&#8243; data-begin=”34.957&#8243;&gt;her&lt;/span&gt; &lt;span data-dur=”0.602&#8243; data-begin=”35.128&#8243;&gt;firstborn&lt;/span&gt; &lt;span data-dur=”0.56&#8243; data-begin=”35.73&#8243;&gt;son&lt;/span&gt; &lt;span data-dur=”0.166&#8243; data-begin=”36.491&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.342&#8243; data-begin=”36.657&#8243;&gt;wrapped&lt;/span&gt; &lt;span data-dur=”0.153&#8243; data-begin=”36.998&#8243;&gt;him&lt;/span&gt; &lt;span data-dur=”0.119&#8243; data-begin=”37.152&#8243;&gt;in&lt;/span&gt; &lt;span data-dur=”0.55&#8243; data-begin=”37.271&#8243;&gt;swaddling&lt;/span&gt; &lt;span data-dur=”0.542&#8243; data-begin=”37.82&#8243;&gt;cloths&lt;/span&gt; &lt;span data-dur=”0.154&#8243; data-begin=”38.644&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.287&#8243; data-begin=”38.798&#8243;&gt;laid&lt;/span&gt; &lt;span data-dur=”0.176&#8243; data-begin=”39.085&#8243;&gt;him&lt;/span&gt; &lt;span data-dur=”0.087&#8243; data-begin=”39.261&#8243;&gt;in&lt;/span&gt; &lt;span data-dur=”0.092&#8243; data-begin=”39.348&#8243;&gt;a&lt;/span&gt; &lt;span data-dur=”0.604&#8243; data-begin=”39.44&#8243;&gt;manger&lt;/span&gt;, &lt;span data-dur=”0.277&#8243; data-begin=”40.182&#8243;&gt;because&lt;/span&gt; &lt;span data-dur=”0.131&#8243; data-begin=”40.46&#8243;&gt;there&lt;/span&gt; &lt;span data-dur=”0.151&#8243; data-begin=”40.591&#8243;&gt;was&lt;/span&gt; &lt;span data-dur=”0.213&#8243; data-begin=”40.742&#8243;&gt;no&lt;/span&gt; &lt;span data-dur=”0.312&#8243; data-begin=”40.975&#8243;&gt;place&lt;/span&gt; &lt;span data-dur=”0.121&#8243; data-begin=”41.287&#8243;&gt;for&lt;/span&gt; &lt;span data-dur=”0.158&#8243; data-begin=”41.408&#8243;&gt;them&lt;/span&gt; &lt;span data-dur=”0.116&#8243; data-begin=”41.566&#8243;&gt;in&lt;/span&gt; &lt;span data-dur=”0.111&#8243; data-begin=”41.683&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.406&#8243; data-begin=”41.794&#8243;&gt;inn&lt;/span&gt;.&lt;o:verse eID=”Luke.2.7&#8243;/&gt;&lt;/p&gt;<br />
&lt;!&#8211;&lt;h3&gt;The Shepherds and the Angels&lt;/h3&gt;&#8211;&gt;<br />
&lt;p&gt;&lt;o:verse sID=”Luke.2.8&#8243; osisID=”Luke.2.8&#8243;/&gt;&lt;span data-dur=”0.144&#8243; data-begin=”43.166&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.089&#8243; data-begin=”43.309&#8243;&gt;in&lt;/span&gt; &lt;span data-dur=”0.102&#8243; data-begin=”43.398&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.329&#8243; data-begin=”43.5&#8243;&gt;same&lt;/span&gt; &lt;span data-dur=”0.406&#8243; data-begin=”43.829&#8243;&gt;region&lt;/span&gt; &lt;span data-dur=”0.146&#8243; data-begin=”44.236&#8243;&gt;there&lt;/span&gt; &lt;span data-dur=”0.082&#8243; data-begin=”44.382&#8243;&gt;were&lt;/span&gt; &lt;span data-dur=”0.495&#8243; data-begin=”44.463&#8243;&gt;shepherds&lt;/span&gt; &lt;span data-dur=”0.154&#8243; data-begin=”44.959&#8243;&gt;out&lt;/span&gt; &lt;span data-dur=”0.104&#8243; data-begin=”45.112&#8243;&gt;in&lt;/span&gt; &lt;span data-dur=”0.094&#8243; data-begin=”45.216&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.561&#8243; data-begin=”45.311&#8243;&gt;field&lt;/span&gt;, &lt;span data-dur=”0.295&#8243; data-begin=”45.954&#8243;&gt;keeping&lt;/span&gt; &lt;span data-dur=”0.334&#8243; data-begin=”46.249&#8243;&gt;watch&lt;/span&gt; &lt;span data-dur=”0.173&#8243; data-begin=”46.583&#8243;&gt;over&lt;/span&gt; &lt;span data-dur=”0.107&#8243; data-begin=”46.756&#8243;&gt;their&lt;/span&gt; &lt;span data-dur=”0.401&#8243; data-begin=”46.863&#8243;&gt;flock&lt;/span&gt; &lt;span data-dur=”0.124&#8243; data-begin=”47.264&#8243;&gt;by&lt;/span&gt; &lt;span data-dur=”0.374&#8243; data-begin=”47.388&#8243;&gt;night&lt;/span&gt;. &lt;o:verse eID=”Luke.2.8&#8243;/&gt;&lt;o:verse sID=”Luke.2.9&#8243; osisID=”Luke.2.9&#8243;/&gt;&lt;span data-dur=”0.144&#8243; data-begin=”48.751&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.176&#8243; data-begin=”48.895&#8243;&gt;an&lt;/span&gt; &lt;span data-dur=”0.409&#8243; data-begin=”49.071&#8243;&gt;angel&lt;/span&gt; &lt;span data-dur=”0.109&#8243; data-begin=”49.479&#8243;&gt;of&lt;/span&gt; &lt;span data-dur=”0.134&#8243; data-begin=”49.588&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.233&#8243; data-begin=”49.722&#8243;&gt;Lord&lt;/span&gt; &lt;span data-dur=”0.491&#8243; data-begin=”49.955&#8243;&gt;appeared&lt;/span&gt; &lt;span data-dur=”0.107&#8243; data-begin=”50.446&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.31&#8243; data-begin=”50.553&#8243;&gt;them&lt;/span&gt;, &lt;span data-dur=”0.126&#8243; data-begin=”51.164&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.186&#8243; data-begin=”51.29&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.49&#8243; data-begin=”51.476&#8243;&gt;glory&lt;/span&gt; &lt;span data-dur=”0.129&#8243; data-begin=”51.967&#8243;&gt;of&lt;/span&gt; &lt;span data-dur=”0.092&#8243; data-begin=”52.095&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.361&#8243; data-begin=”52.187&#8243;&gt;Lord&lt;/span&gt; &lt;span data-dur=”0.409&#8243; data-begin=”52.548&#8243;&gt;shone&lt;/span&gt; &lt;span data-dur=”0.436&#8243; data-begin=”52.957&#8243;&gt;around&lt;/span&gt; &lt;span data-dur=”0.23&#8243; data-begin=”53.393&#8243;&gt;them&lt;/span&gt;, &lt;span data-dur=”0.102&#8243; data-begin=”53.899&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.084&#8243; data-begin=”54.001&#8243;&gt;they&lt;/span&gt; &lt;span data-dur=”0.092&#8243; data-begin=”54.085&#8243;&gt;were&lt;/span&gt; &lt;span data-dur=”0.401&#8243; data-begin=”54.177&#8243;&gt;filled&lt;/span&gt; &lt;span data-dur=”0.3&#8243; data-begin=”54.578&#8243;&gt;with&lt;/span&gt; &lt;span data-dur=”0.481&#8243; data-begin=”54.878&#8243;&gt;fear&lt;/span&gt;. &lt;o:verse eID=”Luke.2.9&#8243;/&gt;&lt;o:verse sID=”Luke.2.10&#8243; osisID=”Luke.2.10&#8243;/&gt;&lt;span data-dur=”0.107&#8243; data-begin=”55.998&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.109&#8243; data-begin=”56.104&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.352&#8243; data-begin=”56.213&#8243;&gt;angel&lt;/span&gt; &lt;span data-dur=”0.23&#8243; data-begin=”56.565&#8243;&gt;said&lt;/span&gt; &lt;span data-dur=”0.102&#8243; data-begin=”56.795&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.248&#8243; data-begin=”56.897&#8243;&gt;them&lt;/span&gt;, &lt;q&gt;&lt;span data-dur=”0.327&#8243; data-begin=”57.858&#8243;&gt;Fear&lt;/span&gt; &lt;span data-dur=”0.381&#8243; data-begin=”58.185&#8243;&gt;not&lt;/span&gt;, &lt;span data-dur=”0.116&#8243; data-begin=”58.767&#8243;&gt;for&lt;/span&gt; &lt;span data-dur=”0.703&#8243; data-begin=”58.883&#8243;&gt;behold&lt;/span&gt;, &lt;span data-dur=”0.272&#8243; data-begin=”60.051&#8243;&gt;I&lt;/span&gt; &lt;span data-dur=”0.188&#8243; data-begin=”60.323&#8243;&gt;bring&lt;/span&gt; &lt;span data-dur=”0.238&#8243; data-begin=”60.512&#8243;&gt;you&lt;/span&gt; &lt;span data-dur=”0.248&#8243; data-begin=”60.75&#8243;&gt;good&lt;/span&gt; &lt;span data-dur=”0.593&#8243; data-begin=”60.998&#8243;&gt;news&lt;/span&gt; &lt;span data-dur=”0.178&#8243; data-begin=”61.749&#8243;&gt;of&lt;/span&gt; &lt;span data-dur=”0.372&#8243; data-begin=”61.927&#8243;&gt;great&lt;/span&gt; &lt;span data-dur=”0.622&#8243; data-begin=”62.299&#8243;&gt;joy&lt;/span&gt; &lt;span data-dur=”0.114&#8243; data-begin=”63.247&#8243;&gt;that&lt;/span&gt; &lt;span data-dur=”0.171&#8243; data-begin=”63.361&#8243;&gt;will&lt;/span&gt; &lt;span data-dur=”0.169&#8243; data-begin=”63.532&#8243;&gt;be&lt;/span&gt; &lt;span data-dur=”0.151&#8243; data-begin=”63.701&#8243;&gt;for&lt;/span&gt; &lt;span data-dur=”0.315&#8243; data-begin=”63.852&#8243;&gt;all&lt;/span&gt; &lt;span data-dur=”0.149&#8243; data-begin=”64.167&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.481&#8243; data-begin=”64.316&#8243;&gt;people&lt;/span&gt;. &lt;o:verse eID=”Luke.2.10&#8243;/&gt;&lt;o:verse sID=”Luke.2.11&#8243; osisID=”Luke.2.11&#8243;/&gt;&lt;span data-dur=”0.166&#8243; data-begin=”65.384&#8243;&gt;For&lt;/span&gt; &lt;span data-dur=”0.317&#8243; data-begin=”65.55&#8243;&gt;unto&lt;/span&gt; &lt;span data-dur=”0.121&#8243; data-begin=”65.867&#8243;&gt;you&lt;/span&gt; &lt;span data-dur=”0.173&#8243; data-begin=”65.988&#8243;&gt;is&lt;/span&gt; &lt;span data-dur=”0.287&#8243; data-begin=”66.162&#8243;&gt;born&lt;/span&gt; &lt;span data-dur=”0.302&#8243; data-begin=”66.449&#8243;&gt;this&lt;/span&gt; &lt;span data-dur=”0.316&#8243; data-begin=”66.751&#8243;&gt;day&lt;/span&gt; &lt;span data-dur=”0.074&#8243; data-begin=”67.067&#8243;&gt;in&lt;/span&gt; &lt;span data-dur=”0.069&#8243; data-begin=”67.142&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.28&#8243; data-begin=”67.211&#8243;&gt;city&lt;/span&gt; &lt;span data-dur=”0.173&#8243; data-begin=”67.491&#8243;&gt;of&lt;/span&gt; &lt;span data-dur=”0.461&#8243; data-begin=”67.664&#8243;&gt;David&lt;/span&gt; &lt;span data-dur=”0.087&#8243; data-begin=”68.34&#8243;&gt;a&lt;/span&gt; &lt;span data-dur=”0.689&#8243; data-begin=”68.426&#8243;&gt;Savior&lt;/span&gt;, &lt;span data-dur=”0.126&#8243; data-begin=”69.353&#8243;&gt;who&lt;/span&gt; &lt;span data-dur=”0.184&#8243; data-begin=”69.479&#8243;&gt;is&lt;/span&gt; &lt;span data-dur=”0.411&#8243; data-begin=”69.663&#8243;&gt;Christ&lt;/span&gt; &lt;span data-dur=”0.146&#8243; data-begin=”70.075&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.528&#8243; data-begin=”70.22&#8243;&gt;Lord&lt;/span&gt;. &lt;o:verse eID=”Luke.2.11&#8243;/&gt;&lt;o:verse sID=”Luke.2.12&#8243; osisID=”Luke.2.12&#8243;/&gt;&lt;span data-dur=”0.173&#8243; data-begin=”71.32&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.191&#8243; data-begin=”71.493&#8243;&gt;this&lt;/span&gt; &lt;span data-dur=”0.131&#8243; data-begin=”71.684&#8243;&gt;will&lt;/span&gt; &lt;span data-dur=”0.104&#8243; data-begin=”71.815&#8243;&gt;be&lt;/span&gt; &lt;span data-dur=”0.035&#8243; data-begin=”71.919&#8243;&gt;a&lt;/span&gt; &lt;span data-dur=”0.461&#8243; data-begin=”71.954&#8243;&gt;sign&lt;/span&gt; &lt;span data-dur=”0.162&#8243; data-begin=”72.415&#8243;&gt;for&lt;/span&gt; &lt;span data-dur=”0.436&#8243; data-begin=”72.577&#8243;&gt;you&lt;/span&gt;: &lt;span data-dur=”0.119&#8243; data-begin=”73.352&#8243;&gt;you&lt;/span&gt; &lt;span data-dur=”0.094&#8243; data-begin=”73.471&#8243;&gt;will&lt;/span&gt; &lt;span data-dur=”0.399&#8243; data-begin=”73.565&#8243;&gt;find&lt;/span&gt; &lt;span data-dur=”0.141&#8243; data-begin=”73.963&#8243;&gt;a&lt;/span&gt; &lt;span data-dur=”0.463&#8243; data-begin=”74.105&#8243;&gt;baby&lt;/span&gt; &lt;span data-dur=”0.416&#8243; data-begin=”74.818&#8243;&gt;wrapped&lt;/span&gt; &lt;span data-dur=”0.146&#8243; data-begin=”75.234&#8243;&gt;in&lt;/span&gt; &lt;span data-dur=”0.602&#8243; data-begin=”75.381&#8243;&gt;swaddling&lt;/span&gt; &lt;span data-dur=”0.498&#8243; data-begin=”75.982&#8243;&gt;cloths&lt;/span&gt; &lt;span data-dur=”0.185&#8243; data-begin=”76.48&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.359&#8243; data-begin=”76.665&#8243;&gt;lying&lt;/span&gt; &lt;span data-dur=”0.092&#8243; data-begin=”77.024&#8243;&gt;in&lt;/span&gt; &lt;span data-dur=”0.074&#8243; data-begin=”77.116&#8243;&gt;a&lt;/span&gt; &lt;span data-dur=”0.617&#8243; data-begin=”77.19&#8243;&gt;manger&lt;/span&gt;.&lt;/q&gt; &lt;o:verse eID=”Luke.2.12&#8243;/&gt;&lt;o:verse sID=”Luke.2.13&#8243; osisID=”Luke.2.13&#8243;/&gt;&lt;span data-dur=”0.161&#8243; data-begin=”78.542&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.624&#8243; data-begin=”78.703&#8243;&gt;suddenly&lt;/span&gt; &lt;span data-dur=”0.173&#8243; data-begin=”79.327&#8243;&gt;there&lt;/span&gt; &lt;span data-dur=”0.206&#8243; data-begin=”79.501&#8243;&gt;was&lt;/span&gt; &lt;span data-dur=”0.196&#8243; data-begin=”79.706&#8243;&gt;with&lt;/span&gt; &lt;span data-dur=”0.136&#8243; data-begin=”79.902&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.478&#8243; data-begin=”80.038&#8243;&gt;angel&lt;/span&gt; &lt;span data-dur=”0.159&#8243; data-begin=”80.516&#8243;&gt;a&lt;/span&gt; &lt;span data-dur=”0.632&#8243; data-begin=”80.675&#8243;&gt;multitude&lt;/span&gt; &lt;span data-dur=”0.102&#8243; data-begin=”81.307&#8243;&gt;of&lt;/span&gt; &lt;span data-dur=”0.072&#8243; data-begin=”81.408&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.387&#8243; data-begin=”81.48&#8243;&gt;heavenly&lt;/span&gt; &lt;span data-dur=”0.389&#8243; data-begin=”81.867&#8243;&gt;host&lt;/span&gt; &lt;span data-dur=”0.47&#8243; data-begin=”82.657&#8243;&gt;praising&lt;/span&gt; &lt;span data-dur=”0.349&#8243; data-begin=”83.126&#8243;&gt;God&lt;/span&gt; &lt;span data-dur=”0.091&#8243; data-begin=”83.475&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.508&#8243; data-begin=”83.566&#8243;&gt;saying&lt;/span&gt;,&lt;o:verse eID=”Luke.2.13&#8243;/&gt;&lt;/p&gt;<br />
&lt;blockquote&gt;<br />
&lt;p&gt;&lt;o:verse sID=”Luke.2.14&#8243; osisID=”Luke.2.14&#8243;/&gt;&lt;span data-dur=”0.508&#8243; data-begin=”84.905&#8243;&gt;Glory&lt;/span&gt; &lt;span data-dur=”0.178&#8243; data-begin=”85.413&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.352&#8243; data-begin=”85.591&#8243;&gt;God&lt;/span&gt; &lt;span data-dur=”0.079&#8243; data-begin=”85.943&#8243;&gt;in&lt;/span&gt; &lt;span data-dur=”0.057&#8243; data-begin=”86.022&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.58&#8243; data-begin=”86.079&#8243;&gt;highest&lt;/span&gt;,&lt;br /&gt;<br />
&lt;span data-dur=”0.166&#8243; data-begin=”87.058&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.18&#8243; data-begin=”87.224&#8243;&gt;on&lt;/span&gt; &lt;span data-dur=”0.385&#8243; data-begin=”87.404&#8243;&gt;earth&lt;/span&gt; &lt;span data-dur=”0.338&#8243; data-begin=”88.025&#8243;&gt;peace&lt;/span&gt; &lt;span data-dur=”0.271&#8243; data-begin=”88.363&#8243;&gt;among&lt;/span&gt; &lt;span data-dur=”0.314&#8243; data-begin=”88.634&#8243;&gt;those&lt;/span&gt; &lt;span data-dur=”0.165&#8243; data-begin=”88.948&#8243;&gt;with&lt;/span&gt; &lt;span data-dur=”0.197&#8243; data-begin=”89.113&#8243;&gt;whom&lt;/span&gt; &lt;span data-dur=”0.156&#8243; data-begin=”89.31&#8243;&gt;he&lt;/span&gt; &lt;span data-dur=”0.16&#8243; data-begin=”89.466&#8243;&gt;is&lt;/span&gt; &lt;span data-dur=”0.715&#8243; data-begin=”89.626&#8243;&gt;pleased&lt;/span&gt;!&lt;o:verse eID=”Luke.2.14&#8243;/&gt;&lt;/p&gt;<br />
&lt;/blockquote&gt;<br />
&lt;p&gt;&lt;o:verse sID=”Luke.2.15&#8243; osisID=”Luke.2.15&#8243;/&gt;&lt;span data-dur=”0.145&#8243; data-begin=”91.824&#8243;&gt;When&lt;/span&gt; &lt;span data-dur=”0.117&#8243; data-begin=”91.969&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.396&#8243; data-begin=”92.086&#8243;&gt;angels&lt;/span&gt; &lt;span data-dur=”0.158&#8243; data-begin=”92.482&#8243;&gt;went&lt;/span&gt; &lt;span data-dur=”0.256&#8243; data-begin=”92.64&#8243;&gt;away&lt;/span&gt; &lt;span data-dur=”0.215&#8243; data-begin=”92.896&#8243;&gt;from&lt;/span&gt; &lt;span data-dur=”0.188&#8243; data-begin=”93.112&#8243;&gt;them&lt;/span&gt; &lt;span data-dur=”0.269&#8243; data-begin=”93.3&#8243;&gt;into&lt;/span&gt; &lt;span data-dur=”0.459&#8243; data-begin=”93.569&#8243;&gt;heaven&lt;/span&gt;, &lt;span data-dur=”0.065&#8243; data-begin=”94.204&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.489&#8243; data-begin=”94.269&#8243;&gt;shepherds&lt;/span&gt; &lt;span data-dur=”0.236&#8243; data-begin=”94.758&#8243;&gt;said&lt;/span&gt; &lt;span data-dur=”0.104&#8243; data-begin=”94.994&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.128&#8243; data-begin=”95.098&#8243;&gt;one&lt;/span&gt; &lt;span data-dur=”0.483&#8243; data-begin=”95.226&#8243;&gt;another&lt;/span&gt;, &lt;q&gt;&lt;span data-dur=”0.136&#8243; data-begin=”96.508&#8243;&gt;Let&lt;/span&gt; &lt;span data-dur=”0.176&#8243; data-begin=”96.644&#8243;&gt;us&lt;/span&gt; &lt;span data-dur=”0.139&#8243; data-begin=”96.82&#8243;&gt;go&lt;/span&gt; &lt;span data-dur=”0.165&#8243; data-begin=”96.959&#8243;&gt;over&lt;/span&gt; &lt;span data-dur=”0.156&#8243; data-begin=”97.124&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.479&#8243; data-begin=”97.281&#8243;&gt;Bethlehem&lt;/span&gt; &lt;span data-dur=”0.08&#8243; data-begin=”97.76&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.312&#8243; data-begin=”97.84&#8243;&gt;see&lt;/span&gt; &lt;span data-dur=”0.31&#8243; data-begin=”98.152&#8243;&gt;this&lt;/span&gt; &lt;span data-dur=”0.253&#8243; data-begin=”98.462&#8243;&gt;thing&lt;/span&gt; &lt;span data-dur=”0.093&#8243; data-begin=”98.715&#8243;&gt;that&lt;/span&gt; &lt;span data-dur=”0.134&#8243; data-begin=”98.808&#8243;&gt;has&lt;/span&gt; &lt;span data-dur=”0.516&#8243; data-begin=”98.942&#8243;&gt;happened&lt;/span&gt;, &lt;span data-dur=”0.208&#8243; data-begin=”99.642&#8243;&gt;which&lt;/span&gt; &lt;span data-dur=”0.113&#8243; data-begin=”99.85&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.24&#8243; data-begin=”99.964&#8243;&gt;Lord&lt;/span&gt; &lt;span data-dur=”0.13&#8243; data-begin=”100.203&#8243;&gt;has&lt;/span&gt; &lt;span data-dur=”0.225&#8243; data-begin=”100.333&#8243;&gt;made&lt;/span&gt; &lt;span data-dur=”0.281&#8243; data-begin=”100.558&#8243;&gt;known&lt;/span&gt; &lt;span data-dur=”0.085&#8243; data-begin=”100.839&#8243;&gt;to&lt;/span&gt; &lt;span data-dur=”0.353&#8243; data-begin=”100.924&#8243;&gt;us&lt;/span&gt;.&lt;/q&gt; &lt;o:verse eID=”Luke.2.15&#8243;/&gt;&lt;o:verse sID=”Luke.2.16&#8243; osisID=”Luke.2.16&#8243;/&gt;&lt;span data-dur=”0.128&#8243; data-begin=”101.996&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.169&#8243; data-begin=”102.124&#8243;&gt;they&lt;/span&gt; &lt;span data-dur=”0.279&#8243; data-begin=”102.293&#8243;&gt;went&lt;/span&gt; &lt;span data-dur=”0.13&#8243; data-begin=”102.572&#8243;&gt;with&lt;/span&gt; &lt;span data-dur=”0.466&#8243; data-begin=”102.702&#8243;&gt;haste&lt;/span&gt; &lt;span data-dur=”0.117&#8243; data-begin=”103.168&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.359&#8243; data-begin=”103.285&#8243;&gt;found&lt;/span&gt; &lt;span data-dur=”0.355&#8243; data-begin=”103.644&#8243;&gt;Mary&lt;/span&gt; &lt;span data-dur=”0.169&#8243; data-begin=”103.999&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.416&#8243; data-begin=”104.168&#8243;&gt;Joseph&lt;/span&gt;, &lt;span data-dur=”0.132&#8243; data-begin=”104.584&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.139&#8243; data-begin=”104.716&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.338&#8243; data-begin=”104.855&#8243;&gt;baby&lt;/span&gt; &lt;span data-dur=”0.357&#8243; data-begin=”105.193&#8243;&gt;lying&lt;/span&gt; &lt;span data-dur=”0.056&#8243; data-begin=”105.55&#8243;&gt;in&lt;/span&gt; &lt;span data-dur=”0.058&#8243; data-begin=”105.606&#8243;&gt;a&lt;/span&gt; &lt;span data-dur=”0.567&#8243; data-begin=”105.664&#8243;&gt;manger&lt;/span&gt;. &lt;o:verse eID=”Luke.2.16&#8243;/&gt;&lt;o:verse sID=”Luke.2.17&#8243; osisID=”Luke.2.17&#8243;/&gt;&lt;span data-dur=”0.173&#8243; data-begin=”107.011&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.199&#8243; data-begin=”107.184&#8243;&gt;when&lt;/span&gt; &lt;span data-dur=”0.121&#8243; data-begin=”107.382&#8243;&gt;they&lt;/span&gt; &lt;span data-dur=”0.346&#8243; data-begin=”107.503&#8243;&gt;saw&lt;/span&gt; &lt;span data-dur=”0.236&#8243; data-begin=”107.849&#8243;&gt;it&lt;/span&gt;, &lt;span data-dur=”0.152&#8243; data-begin=”108.382&#8243;&gt;they&lt;/span&gt; &lt;span data-dur=”0.21&#8243; data-begin=”108.534&#8243;&gt;made&lt;/span&gt; &lt;span data-dur=”0.373&#8243; data-begin=”108.744&#8243;&gt;known&lt;/span&gt; &lt;span data-dur=”0.071&#8243; data-begin=”109.117&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.424&#8243; data-begin=”109.188&#8243;&gt;saying&lt;/span&gt; &lt;span data-dur=”0.102&#8243; data-begin=”109.611&#8243;&gt;that&lt;/span&gt; &lt;span data-dur=”0.134&#8243; data-begin=”109.714&#8243;&gt;had&lt;/span&gt; &lt;span data-dur=”0.189&#8243; data-begin=”109.848&#8243;&gt;been&lt;/span&gt; &lt;span data-dur=”0.373&#8243; data-begin=”110.037&#8243;&gt;told&lt;/span&gt; &lt;span data-dur=”0.18&#8243; data-begin=”110.411&#8243;&gt;them&lt;/span&gt; &lt;span data-dur=”0.502&#8243; data-begin=”110.591&#8243;&gt;concerning&lt;/span&gt; &lt;span data-dur=”0.136&#8243; data-begin=”111.092&#8243;&gt;this&lt;/span&gt; &lt;span data-dur=”0.684&#8243; data-begin=”111.228&#8243;&gt;child&lt;/span&gt;. &lt;o:verse eID=”Luke.2.17&#8243;/&gt;&lt;o:verse sID=”Luke.2.18&#8243; osisID=”Luke.2.18&#8243;/&gt;&lt;span data-dur=”0.152&#8243; data-begin=”112.668&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.336&#8243; data-begin=”112.82&#8243;&gt;all&lt;/span&gt; &lt;span data-dur=”0.137&#8243; data-begin=”113.157&#8243;&gt;who&lt;/span&gt; &lt;span data-dur=”0.271&#8243; data-begin=”113.294&#8243;&gt;heard&lt;/span&gt; &lt;span data-dur=”0.262&#8243; data-begin=”113.565&#8243;&gt;it&lt;/span&gt; &lt;span data-dur=”0.446&#8243; data-begin=”113.827&#8243;&gt;wondered&lt;/span&gt; &lt;span data-dur=”0.113&#8243; data-begin=”114.273&#8243;&gt;at&lt;/span&gt; &lt;span data-dur=”0.176&#8243; data-begin=”114.387&#8243;&gt;what&lt;/span&gt; &lt;span data-dur=”0.078&#8243; data-begin=”114.563&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.505&#8243; data-begin=”114.641&#8243;&gt;shepherds&lt;/span&gt; &lt;span data-dur=”0.345&#8243; data-begin=”115.147&#8243;&gt;told&lt;/span&gt; &lt;span data-dur=”0.318&#8243; data-begin=”115.492&#8243;&gt;them&lt;/span&gt;. &lt;o:verse eID=”Luke.2.18&#8243;/&gt;&lt;o:verse sID=”Luke.2.19&#8243; osisID=”Luke.2.19&#8243;/&gt;&lt;span data-dur=”0.188&#8243; data-begin=”116.538&#8243;&gt;But&lt;/span&gt; &lt;span data-dur=”0.476&#8243; data-begin=”116.726&#8243;&gt;Mary&lt;/span&gt; &lt;span data-dur=”0.371&#8243; data-begin=”117.201&#8243;&gt;treasured&lt;/span&gt; &lt;span data-dur=”0.16&#8243; data-begin=”117.572&#8243;&gt;up&lt;/span&gt; &lt;span data-dur=”0.241&#8243; data-begin=”117.731&#8243;&gt;all&lt;/span&gt; &lt;span data-dur=”0.282&#8243; data-begin=”117.973&#8243;&gt;these&lt;/span&gt; &lt;span data-dur=”0.533&#8243; data-begin=”118.254&#8243;&gt;things&lt;/span&gt;, &lt;span data-dur=”0.537&#8243; data-begin=”119.178&#8243;&gt;pondering&lt;/span&gt; &lt;span data-dur=”0.139&#8243; data-begin=”119.715&#8243;&gt;them&lt;/span&gt; &lt;span data-dur=”0.098&#8243; data-begin=”119.854&#8243;&gt;in&lt;/span&gt; &lt;span data-dur=”0.18&#8243; data-begin=”119.952&#8243;&gt;her&lt;/span&gt; &lt;span data-dur=”0.528&#8243; data-begin=”120.133&#8243;&gt;heart&lt;/span&gt;. &lt;o:verse eID=”Luke.2.19&#8243;/&gt;&lt;o:verse sID=”Luke.2.20&#8243; osisID=”Luke.2.20&#8243;/&gt;&lt;span data-dur=”0.085&#8243; data-begin=”121.551&#8243;&gt;And&lt;/span&gt; &lt;span data-dur=”0.071&#8243; data-begin=”121.636&#8243;&gt;the&lt;/span&gt; &lt;span data-dur=”0.429&#8243; data-begin=”121.707&#8243;&gt;shepherds&lt;/span&gt; &lt;span data-dur=”0.659&#8243; data-begin=”122.136&#8243;&gt;returned&lt;/span&gt;, &lt;span data-dur=”0.749&#8243; data-begin=”123.144&#8243;&gt;glorifying&lt;/span&gt; &lt;span data-dur=”0.258&#8243; data-begin=”123.893&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.563&#8243; data-begin=”124.151&#8243;&gt;praising&lt;/span&gt; &lt;span data-dur=”0.377&#8243; data-begin=”124.715&#8243;&gt;God&lt;/span&gt; &lt;span data-dur=”0.247&#8243; data-begin=”125.092&#8243;&gt;for&lt;/span&gt; &lt;span data-dur=”0.217&#8243; data-begin=”125.339&#8243;&gt;all&lt;/span&gt; &lt;span data-dur=”0.167&#8243; data-begin=”125.556&#8243;&gt;they&lt;/span&gt; &lt;span data-dur=”0.197&#8243; data-begin=”125.723&#8243;&gt;had&lt;/span&gt; &lt;span data-dur=”0.329&#8243; data-begin=”125.92&#8243;&gt;heard&lt;/span&gt; &lt;span data-dur=”0.119&#8243; data-begin=”126.249&#8243;&gt;and&lt;/span&gt; &lt;span data-dur=”0.591&#8243; data-begin=”126.368&#8243;&gt;seen&lt;/span&gt;, &lt;span data-dur=”0.154&#8243; data-begin=”127.239&#8243;&gt;as&lt;/span&gt; &lt;span data-dur=”0.073&#8243; data-begin=”127.394&#8243;&gt;it&lt;/span&gt; &lt;span data-dur=”0.173&#8243; data-begin=”127.467&#8243;&gt;had&lt;/span&gt; &lt;span data-dur=”0.174&#8243; data-begin=”127.641&#8243;&gt;been&lt;/span&gt; &lt;span data-dur=”0.31&#8243; data-begin=”127.815&#8243;&gt;told&lt;/span&gt; &lt;span data-dur=”0.249&#8243; data-begin=”128.125&#8243;&gt;them&lt;/span&gt;.&lt;o:verse eID=”Luke.2.20&#8243;/&gt;&lt;/p&gt;</p>
<p>&lt;script type=”text/javascript”&gt;<br />
/* CDATA section stripped due to WordPress bug: https://core.trac.wordpress.org/ticket/3670 */<br />
(function(){<br />
var root = document.getElementById(&#8216;nativity-story-from-luke&#8217;);<br />
var audio = root.getElementsByTagName(&#8216;audio&#8217;)[0];</p>
<p>/**<br />
* Build an index of all of the words that can be read along with their begin,<br />
* and end times, and the DOM element representing the word.<br />
*/<br />
var wordTimes = [];<br />
Array.prototype.forEach.call(root.querySelectorAll(“[data-begin]“), function(word){<br />
var wordTime = {<br />
begin : parseFloat(word.getAttribute(“data-begin”)),<br />
dur   : parseFloat(word.getAttribute(“data-dur”)),<br />
word  : word<br />
};<br />
wordTime.index = wordTimes.length;<br />
wordTime.end = wordTime.begin + wordTime.dur;<br />
word.setAttribute(&#8216;data-timeindex&#8217;, wordTime.index);<br />
wordTimes.push(wordTime);<br />
});<br />
/**<br />
* Find the next word that should be played (or that is currently being played)<br />
* @todo Note: this would better be implemented as a binary search<br />
*/<br />
function getNextWordTime(){<br />
var wordTime = null,currentTime = audio.currentTime;<br />
for(var i = 0, len = wordTimes.length; i &lt; len; i++){<br />
var thisWordTime = wordTimes[i];<br />
if((currentTime &gt;= thisWordTime.begin &amp;&amp; currentTime &lt; thisWordTime.end) || currentTime &lt; wordTimes[i].begin)<br />
{<br />
return thisWordTime;<br />
}<br />
}<br />
return null;<br />
}<br />
var selection = window.getSelection();<br />
var timeoutSelectNext;</p>
<p>/**<br />
* Select the next word that is going to be read or the word that is being<br />
* read right now<br />
* @param Boolean hold  Whether or not the subsequent word should automatically be selected<br />
*/<br />
function selectNextWord(hold){<br />
clearTimeout(timeoutSelectNext);<br />
var next = getNextWordTime();<br />
if(next){<br />
function select(hold){<br />
selection.removeAllRanges();<br />
var range = document.createRange();<br />
range.selectNode(next.word);<br />
selection.addRange(range);<br />
if(!hold){<br />
timeoutSelectNext = setTimeout(function(){<br />
selection.removeAllRanges();<br />
if(!audio.paused)<br />
selectNextWord();<br />
}, Math.round((next.end &#8211; audio.currentTime)*1000));<br />
}<br />
}</p>
<p>//Select now<br />
if(hold || audio.currentTime &gt;= next.begin){<br />
select(hold);<br />
}<br />
//Select later<br />
else {<br />
timeoutSelectNext = setTimeout(function(){<br />
select();<br />
}, Math.round((next.begin &#8211; audio.currentTime)*1000));<br />
}<br />
}<br />
}<br />
/**<br />
* Select next word (at audio.currentTime) when playing starts<br />
*/<br />
audio.addEventListener(&#8216;play&#8217;, function(e){<br />
selectNextWord();<br />
}, false);<br />
/**<br />
* Abandon seeking the next word because we&#8217;re paused<br />
*/<br />
audio.addEventListener(&#8216;pause&#8217;, function(e){<br />
clearTimeout(timeoutSelectNext);<br />
}, false);<br />
/**<br />
* Seek by clicking (event delegation)<br />
*/<br />
root.addEventListener(&#8216;click&#8217;, function(e){<br />
if(e.target.hasAttribute(&#8216;data-begin&#8217;)){<br />
var i = e.target.getAttribute(&#8216;data-timeindex&#8217;);<br />
//audio.currentTime = wordTimes[i].begin + wordTimes[i].dur/2; //@TODO<br />
audio.currentTime = wordTimes[i].begin + 0.001; //Note: times apparently cannot be exactly set and sometimes select too early<br />
selectNextWord();<br />
}<br />
}, false);<br />
/**<br />
* Play a word when double-clicking (event delegation)<br />
* Only plays the single word.<br />
*/<br />
root.addEventListener(&#8216;dblclick&#8217;, function(e){<br />
audio.play();<br />
}, false);<br />
/**<br />
* Select a word when seeking<br />
*/<br />
audio.addEventListener(&#8216;seeked&#8217;, function(e){<br />
selectNextWord(e.target.paused /* for hold, probably always true */);<br />
}, false);</p>
<p>})();<br />
/* CDATA section stripped due to WordPress bug: https://core.trac.wordpress.org/ticket/3670 */<br />
&lt;/script&gt;</p>
<p>&lt;hr /&gt;<br />
&lt;footer&gt;<br />
&lt;small&gt;Scripture taken from The Holy Bible, English Standard Version. Copyright<br />
©2001 by &lt;a href=”http://www.crosswaybibles.org” target=”_blank”&gt;Crossway Bibles&lt;/a&gt;, a<br />
publishing ministry of Good News Publishers. Used by permission. All rights<br />
reserved. Text provided by the &lt;a href=”http://www.gnpcb.org/esv/share/services/” target=”_blank”&gt;Crossway Bibles Web<br />
Service&lt;/a&gt;.&lt;/small&gt;<br />
&lt;/footer&gt;<br />
&lt;/article&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>运行代码</p>
<p>HTML5 canvas<br />
支持浏览器：IE以外所有新锐浏览器<br />
&lt;!doctype html&gt;<br />
&lt;html dir=”ltr” lang=”zh-CN”&gt;<br />
&lt;head&gt;<br />
&lt;meta charset=”utf-8&#8243;/&gt;<br />
&lt;meta content=”IE=8&#8243; http-equiv=”X-UA-Compatible”/&gt;<br />
&lt;title&gt;canvas by 司徒正美&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body id=”id10&#8243;&gt;<br />
&lt;section id=”wrapper”&gt;<br />
&lt;header&gt;<br />
&lt;h1&gt;Canvas&lt;/h1&gt;<br />
&lt;/header&gt;<br />
&lt;article&gt;&lt;/article&gt;<br />
&lt;p&gt;&lt;a href=”http://www.cnblogs.com/rubylouvre/”&gt;返回&lt;/a&gt;&lt;/p&gt;<br />
&lt;/section&gt;<br />
&lt;script src=”http://html5demos.com/h5utils.js”&gt;&lt;/script&gt;<br />
&lt;script&gt;</p>
<p>buildSpinner({ x : 50, y : 50, size : 20, degrees : 30 });</p>
<p>function buildSpinner(data) {</p>
<p>var canvas = document.createElement(&#8216;canvas&#8217;);<br />
canvas.height = 100;<br />
canvas.width = 300;<br />
document.getElementsByTagName(&#8216;article&#8217;)[0].appendChild(canvas);<br />
var ctx = canvas.getContext(“2d”),<br />
i = 0, degrees = data.degrees, loops = 0, degreesList = [];</p>
<p>for (i = 0; i &lt; degrees; i++) {<br />
degreesList.push(i);<br />
}</p>
<p>// reset<br />
i = 0;</p>
<p>// so I can kill it later<br />
window.canvasTimer = setInterval(draw, 1000/degrees);</p>
<p>function reset() {<br />
ctx.clearRect(0,0,100,100); // clear canvas</p>
<p>var left = degreesList.slice(0, 1);<br />
var right = degreesList.slice(1, degreesList.length);<br />
degreesList = right.concat(left);<br />
}</p>
<p>function draw() {<br />
var c, s, e;</p>
<p>var d = 0;</p>
<p>if (i == 0) {<br />
reset();<br />
}</p>
<p>ctx.save();</p>
<p>d = degreesList[i];<br />
c = Math.floor(255/degrees*i);<br />
ctx.strokeStyle = &#8216;rgb(&#8216; + c + &#8216;, &#8216; + c + &#8216;, &#8216; + c + &#8216;)&#8217;;<br />
ctx.lineWidth = data.size;<br />
ctx.beginPath();<br />
s = Math.floor(360/degrees*(d));<br />
e = Math.floor(360/degrees*(d+1)) &#8211; 1;</p>
<p>ctx.arc(data.x, data.y, data.size, (Math.PI/180)*s, (Math.PI/180)*e, false);<br />
ctx.stroke();</p>
<p>ctx.restore();</p>
<p>i++;<br />
if (i &gt;= degrees) {<br />
i = 0;<br />
}<br />
}<br />
}<br />
&lt;/script&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<p>运行代码</p>
<p>https://developer.mozilla.org/en/Canvas_tutorial</p>
<p>HTML5 SVG<br />
支持浏览器：Firefox 1.5+, Safari 3.0+, Chrome 1.0+, Opera 9.0+</p>
<p>http://www.w3.org/TR/SVG12/</p>
<p>http://www.ibm.com/developerworks/cn/views/xml/tutorials.jsp?cv_doc_id=84896</p>
<p>HTML5 XMLHttpRequest 2与跨域<br />
支持浏览器：IE8与firefox3.5+各实现了部分</p>
<p>http://www.w3.org/TR/XMLHttpRequest2/</p>
<p>https://developer.mozilla.org/En/Using_XMLHttpRequest#Monitoring_progress</p>
<p>http://msdn.microsoft.com/en-us/library/cc197057(VS.85).aspx</p>
<p>http://www.w3.org/TR/cors/</p>
<p>https://developer.mozilla.org/En/HTTP_Access_Control</p>
<p>http://msdn.microsoft.com/en-us/library/cc197057(VS.85).aspx</p>
<p>HTML5的标签变更情况：</p>
<p>http://www.w3schools.com/html5/html5_reference.asp</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>上述特征的支持情况只对目前有效……</p>
<p>&nbsp;</p>

	标签：<a href="http://www.zfkun.com/tag/ecmascript5" title="ecmascript5" rel="tag">ecmascript5</a>, <a href="http://www.zfkun.com/tag/html5" title="html5" rel="tag">html5</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/220.html" title="HTML5 canvas 初级入门教程 (2011 年 03 月 20 日)" data-comment="0">HTML5 canvas 初级入门教程</a></li>
	<li><a href="http://www.zfkun.com/html5" title="HTML5 (2011 年 06 月 03 日)" data-comment="0">HTML5</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/192.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript中的Get/Set访问器</title>
		<link>http://www.zfkun.com/190.html</link>
		<comments>http://www.zfkun.com/190.html#comments</comments>
		<pubDate>Sun, 20 Mar 2011 09:13:23 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[get]]></category>
		<category><![CDATA[set]]></category>
		<category><![CDATA[访问器]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=190</guid>
		<description><![CDATA[JavaScript中的Get和Set访问器，和C#中的访问器非常相似。 标准的Get和Set访问器的实现 function Field(val){ this.value = val; } Field.prototype = { get value(){ return this._value; }, set value(val){ this._value = val; } }; var field = new Field(“test”); field.value=”test2&#8243;; //field.value will now return “test2&#8243; 在如下浏览器能正常工作： 我们常用的实现方法可能是这样的： function Field(val){ var value &#8230; <a href="http://www.zfkun.com/190.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div id="art_demo">JavaScript中的Get和Set访问器，和C#中的访问器非常相似。</div>
<div id="con_all"></div>
<div id="art_content">标准的Get和Set访问器的实现</p>
<div><span style="text-decoration: underline;"><br />
</span></div>
<div id="code80698">function Field(val){<br />
this.value = val;<br />
}<br />
Field.prototype = {<br />
get value(){<br />
return this._value;<br />
},<br />
set value(val){<br />
this._value = val;<br />
}<br />
};<br />
var field = new Field(“test”);<br />
field.value=”test2&#8243;;<br />
//field.value will now return “test2&#8243;</div>
<p>在如下浏览器能正常工作：<br />
<img src="http://www.jb51.net/upload/201009/20100919225302806.jpg" alt="" /></p>
<p>我们常用的实现方法可能是这样的：</p>
<div><span style="text-decoration: underline;"><br />
</span></div>
<div id="code72412">function Field(val){<br />
var value = val;</p>
<p>this.getValue = function(){<br />
return value;<br />
};</p>
<p>this.setValue = function(val){<br />
value = val;<br />
};<br />
}<br />
var field = new Field(“test”);<br />
field.setValue(“test2&#8243;)<br />
field.getValue() // return “test2&#8243;</p></div>
<p>在DOM元素上Get和Set访问器的实现</p>
<div><span style="text-decoration: underline;"><br />
</span></div>
<div id="code50386">HTMLElement.prototype.__defineGetter__(“description”, function () {<br />
return this.desc;<br />
});<br />
HTMLElement.prototype.__defineSetter__(“description”, function (val) {<br />
this.desc = val;<br />
});<br />
document.body.description = “Beautiful body”;<br />
// document.body.description will now return “Beautiful body”;</div>
<p>在如下浏览器能正常工作：<br />
&nbsp;</p>
<p><img src="http://www.jb51.net/upload/201009/20100919225302806.jpg" alt="" /></p>
<p>&nbsp;</p>
<p><strong>通过Object.defineProperty实现访问器</strong><br />
将来ECMAScript标准的扩展对象的方法会通过Object.defineProperty来实现，这也是为什么IE8就是通过这种方法来实现get和set访问器，看来微软还是很有远见的，遗憾的是目前只有IE8+和Chrome 5.0+支持，其它的浏览器都不支持，而且IE8+也只支持DOM元素，不过将来的版本将和Chrome一样支持普通的Javascript对象。<br />
DOM元素上的Get和Set访问器的实现</p>
<div id="code89907">
Object.defineProperty(document.body, “description”, {<br />
get : function () {<br />
return this.desc;<br />
},<br />
set : function (val) {<br />
this.desc = val;<br />
}<br />
});<br />
document.body.description = “Content container”;<br />
// document.body.description will now return “Content container”</div>
<p>在如下浏览器能正常工作：&nbsp;</p>
<p><img src="http://www.jb51.net/upload/201009/20100919225303374.jpg" alt="" /></p>
<p>普通对象的Get和Set访问器的实现</p>
<div id="code71344">
var lost = {<br />
loc : “Island”<br />
};<br />
Object.defineProperty(lost, “location”, {<br />
get : function () {<br />
return this.loc;<br />
},<br />
set : function (val) {<br />
this.loc = val;<br />
}<br />
});<br />
lost.location = “Another island”;<br />
// lost.location will now return “Another island”</div>
<p>在如下浏览器能正常工作：<img src="http://www.jb51.net/upload/201009/20100919225303654.jpg" alt="" /></p>
<p><strong>本文总结</strong></p>
<p>尽管微软的IE只是支持了Object.defineProperty，没有完美的实现Get和Set访问器，但是我们已经看到了IE有了很大的进步，特别是刚发布的IE9使用的新的javascript引擎，支持HTML5和CSS3，支持硬件加速等等，相信有一天各个浏览器都能完全拥抱标准，带来一个完美的WEB世界。</p>
<p>参考文献：</p>
<p>1. <a href="http://robertnyman.com/2009/05/28/getters-and-setters-with-javascript-code-samples-and-demos/" target="_blank">Getters and setters with JavaScript</a><br />
2. <a href="http://ejohn.org/blog/javascript-getters-and-setters/" target="_blank">JavaScript Getters and Setters</a></p>
</div>
<p>&nbsp;</p>

	标签：<a href="http://www.zfkun.com/tag/get" title="get" rel="tag">get</a>, <a href="http://www.zfkun.com/tag/set" title="set" rel="tag">set</a>, <a href="http://www.zfkun.com/tag/%e8%ae%bf%e9%97%ae%e5%99%a8" title="访问器" rel="tag">访问器</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/190.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IE9允许前端开发获取到页面性能数据</title>
		<link>http://www.zfkun.com/187.html</link>
		<comments>http://www.zfkun.com/187.html#comments</comments>
		<pubDate>Sun, 20 Mar 2011 08:25:53 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[开发编程]]></category>
		<category><![CDATA[ie9]]></category>
		<category><![CDATA[msPerformance]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=187</guid>
		<description><![CDATA[长期以来，为了改善站点的用户体验，我们一直都是在页面顶端加上一个 (new Date()).getTime() 来获取用户打开页面的时间，使用httpwatch来分析页面打开的解释时间。httpwatch虽然强大，但是还是无法让我们深入到用户的环境去了解用户打开页面前的一些情况，例如:DNS解释时间，请求和响应时间，以及更加深入的页面渲染时间等重要信息。这些信息对用户环境分析是至关重要的。 如今，这个情况即将改变，微软的IE9将给前端开发们提供有力的性能分析接口让我们能够深入分析页面的性能，这就是强大的msPerformance接口。这个接口其实是基于HTML5草案Web Timing的定义来开发的（有意思的是这个接口是google提供的，chrome目前还没支持，IE9先行了）。 我们来看看通过Web Timing我们可以获取到什么数据 &#160; window.msPerformance.navigation { requestCount : 76 type : 0 startTime : 1277821481923 redirectedCount : 5 uniqueDomains : 31 } &#160; &#160; window.msPerformance.timingMeasures { request : 22 domContentLoaded : 342 response : 10 &#8230; <a href="http://www.zfkun.com/187.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>长期以来，为了改善站点的用户体验，我们一直都是在页面顶端加上一个<em><strong> (new Date()).getTime()</strong></em> 来获取用户打开页面的时间，使用<a href="http://www.httpwatch.com/" target="_blank">httpwatch</a>来分析页面打开的解释时间。<a href="http://www.httpwatch.com/" target="_blank">httpwatch</a>虽然强大，但是还是无法让我们深入到用户的环境去了解用户打开页面前的一些情况，例如:DNS解释时间，请求和响应时间，以及更加深入的页面渲染时间等重要信息。这些信息对用户环境分析是至关重要的。</p>
<p>如今，这个情况即将改变，微软的<a href="http://ie.microsoft.com/testdrive/" target="_blank">IE9</a>将给前端开发们提供有力的性能分析接口让我们能够深入分析页面的性能，这就是强大的<a href="http://blogs.msdn.com/b/ie/archive/2010/06/28/measuring-web-page-performance.aspx" target="_blank">msPerformance</a>接口。这个接口其实是基于HTML5草案<a href="http://dev.w3.org/2006/webapi/WebTiming/" target="_blank">Web Timing</a>的定义来开发的（有意思的是这个接口是google提供的，chrome目前还没支持，IE9先行了）。</p>
<p>我们来看看通过<a href="http://dev.w3.org/2006/webapi/WebTiming/" target="_blank">Web Timing</a>我们可以获取到什么数据</p>
<p>&nbsp;</p>
<p><strong>window.msPerformance.navigation</strong></p>
<p>{</p>
<p>requestCount : 76</p>
<p>type : 0</p>
<p>startTime : 1277821481923</p>
<p>redirectedCount : 5</p>
<p>uniqueDomains : 31</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>window.msPerformance.timingMeasures</strong></p>
<p>{</p>
<p>request : 22</p>
<p>domContentLoaded : 342</p>
<p>response : 10</p>
<p>firstPaint : 29</p>
<p>domInteractive : 342</p>
<p>msStyleContentLoaded : 342</p>
<p>fetch : 459</p>
<p>domComplete : 342</p>
<p>load : 89</p>
<p>connect : 3</p>
<p>}</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>window.msPerformance.timing</strong></p>
<p>{</p>
<p>domLoading : 1277821481950</p>
<p>responseEnd : 1277821481960</p>
<p>navigationStart : 1277821481923</p>
<p>fetchStart : 1277821481923</p>
<p>msStyleContentLoaded : 1277821482293</p>
<p>firstPaint : 1277821481952</p>
<p>fullyLoaded : 0</p>
<p>requestStart : 1277821481927</p>
<p>loadEnd : 1277821482383</p>
<p>unloadStart : 1277821481923</p>
<p>}</p>
<p>&nbsp;</p>
<p>通过这些数据我们可以更加深入得分析页面的性能和用户的网络环境，提供更加好的差异化服务。</p>
<p><a href="http://ie.microsoft.com/testdrive/" target="_blank"> 到这里下载IE9预览版</a></p>
<p>&nbsp;</p>
<p>发现IE9pre3的console列出的接口不全，直接用调试器把这个接口和方法全部列出来了，更加直观</p>
<p><img title="在新窗口打开图片" src="http://www.pjhome.net/attachments/month_1006/20100629231752.jpg" alt="" /></p>
<p>&nbsp;</p>

	标签：<a href="http://www.zfkun.com/tag/ie9" title="ie9" rel="tag">ie9</a>, <a href="http://www.zfkun.com/tag/msperformance" title="msPerformance" rel="tag">msPerformance</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/187.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>add bookmark for ie &amp; ff &amp; opera</title>
		<link>http://www.zfkun.com/182.html</link>
		<comments>http://www.zfkun.com/182.html#comments</comments>
		<pubDate>Sun, 20 Mar 2011 07:38:03 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[bookmark]]></category>
		<category><![CDATA[ff]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[opera]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=182</guid>
		<description><![CDATA[add bookmark for ie &#038; ff &#038; opera <a href="http://www.zfkun.com/182.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<pre name="code" class="js">
&lt;script type="text/javascript"&gt;
var address = function (obj, url, title) {
var e = window.event || arguments.callee.caller.arguments[0];
var B = {
IE : /MSIE/.test(window.navigator.userAgent) &amp;&amp; !window.opera,
FF : /Firefox/.test(window.navigator.userAgent),
OP : !!window.opera
};

obj.onmousedown = null;

if (B.IE) {
obj.attachEvent("onmouseup", function () {
try {
window.external.AddFavorite(url, title);
window.event.returnValue = false;
} catch (exp) {
}
});
}
else {
if (B.FF || obj.nodeName.toLowerCase() == "a") {
obj.setAttribute("rel", "sidebar"),
obj.title = title,
obj.href = url;
}
else if (B.OP) {
var a = document.createElement("a");
a.rel = "sidebar",
a.title = title,
a.href = url;
obj.parentNode.insertBefore(a, obj);
a.appendChild(obj);
a = null;
}
}
};
&lt;/script&gt;

&lt;a href="javascript:void(0);" onmousedown="address(this, 'http://baidu.com', '百度首页')"&gt;添加百度到收藏&lt;/a&gt;</pre>

	标签：<a href="http://www.zfkun.com/tag/bookmark" title="bookmark" rel="tag">bookmark</a>, <a href="http://www.zfkun.com/tag/ff" title="ff" rel="tag">ff</a>, <a href="http://www.zfkun.com/tag/ie" title="ie" rel="tag">ie</a>, <a href="http://www.zfkun.com/tag/opera" title="opera" rel="tag">opera</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/142.html" title="IE6+和FF的CSS Hack (2010 年 04 月 23 日)" data-comment="0">IE6+和FF的CSS Hack</a></li>
	<li><a href="http://www.zfkun.com/205.html" title="欺骗IE不出现Flash激活框的小发现 (2011 年 03 月 20 日)" data-comment="0">欺骗IE不出现Flash激活框的小发现</a></li>
	<li><a href="http://www.zfkun.com/275.html" title="[转]IE6、IE7、IE8 CSS Bug兼容解决记录 (2011 年 06 月 14 日)" data-comment="1">[转]IE6、IE7、IE8 CSS Bug兼容解决记录</a></li>
	<li><a href="http://www.zfkun.com/109.html" title="Understanding and Solving Internet Explorer Leak Patterns (2010 年 02 月 28 日)" data-comment="0">Understanding and Solving Internet Explorer Leak Patterns</a></li>
	<li><a href="http://www.zfkun.com/216.html" title="Javascript浏览器另类探测技巧 (2011 年 03 月 20 日)" data-comment="0">Javascript浏览器另类探测技巧</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/182.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>原生JSON.parse解析异常问题</title>
		<link>http://www.zfkun.com/176.html</link>
		<comments>http://www.zfkun.com/176.html#comments</comments>
		<pubDate>Fri, 18 Mar 2011 04:47:56 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[parse]]></category>
		<category><![CDATA[异常]]></category>
		<category><![CDATA[标准]]></category>
		<category><![CDATA[验证]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=176</guid>
		<description><![CDATA[昨天开发新类库，做到Json模块，使用了json2官方类为底层，使用中频遇异常，甚是不爽。看了下源码，json2 采用了优化处理机制，优先使用浏览器原生JSON处理。（事实是json自己的实现也如此） <a href="http://www.zfkun.com/176.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>昨天开发新类库，做到Json模块，使用了json2官方类为底层，使用中频遇异常，甚是不爽。</p>
<p>看了下源码，json2 采用了优化处理机制，优先使用浏览器原生JSON处理。（事实是json自己的实现也如此）</p>
<p>而parse的处理验证机制很严格（也可称标准）：</p>
<pre name="code" class="js">// 不标准的格式, 键值缺少双引号
{ game : { id : 111, name : "test" } }

// 标准的格式
{ "game" : { "id" : 111, "name" : "test" }}</pre>
<p>哎，无奈，遂改数据源之（别人系统，催之）。</p>
<p>待有时间，修改下源码，放松验证。</p>

	标签：<a href="http://www.zfkun.com/tag/js" title="js" rel="tag">js</a>, <a href="http://www.zfkun.com/tag/json" title="json" rel="tag">json</a>, <a href="http://www.zfkun.com/tag/parse" title="parse" rel="tag">parse</a>, <a href="http://www.zfkun.com/tag/%e5%bc%82%e5%b8%b8" title="异常" rel="tag">异常</a>, <a href="http://www.zfkun.com/tag/%e6%a0%87%e5%87%86" title="标准" rel="tag">标准</a>, <a href="http://www.zfkun.com/tag/%e9%aa%8c%e8%af%81" title="验证" rel="tag">验证</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/154.html" title="随机颜色 (2011 年 01 月 12 日)" data-comment="0">随机颜色</a></li>
	<li><a href="http://www.zfkun.com/59.html" title="腾讯TT、遨游浏览器检测 (2010 年 01 月 16 日)" data-comment="0">腾讯TT、遨游浏览器检测</a></li>
	<li><a href="http://www.zfkun.com/55.html" title="绝对震撼!10款动感图片展示js代码 (2010 年 01 月 16 日)" data-comment="0">绝对震撼!10款动感图片展示js代码</a></li>
	<li><a href="http://www.zfkun.com/147.html" title="前端资源文件缓存清除一法 (2010 年 11 月 25 日)" data-comment="0">前端资源文件缓存清除一法</a></li>
	<li><a href="http://www.zfkun.com/394.html" title="[转]利用跨域资源共享（CORS）实现ajax跨域调用 (2011 年 07 月 15 日)" data-comment="0">[转]利用跨域资源共享（CORS）实现ajax跨域调用</a></li>
	<li><a href="http://www.zfkun.com/80.html" title="[转]Google Closure: 糟糕的JavaScript (2010 年 01 月 19 日)" data-comment="0">[转]Google Closure: 糟糕的JavaScript</a></li>
	<li><a href="http://www.zfkun.com/226.html" title="Windows7下搭建Node.js环境 (2011 年 04 月 06 日)" data-comment="1">Windows7下搭建Node.js环境</a></li>
	<li><a href="http://www.zfkun.com/388.html" title="window.open() 之句柄保持和重连 (2011 年 07 月 14 日)" data-comment="0">window.open() 之句柄保持和重连</a></li>
	<li><a href="http://www.zfkun.com/109.html" title="Understanding and Solving Internet Explorer Leak Patterns (2010 年 02 月 28 日)" data-comment="0">Understanding and Solving Internet Explorer Leak Patterns</a></li>
	<li><a href="http://www.zfkun.com/127.html" title="PureMVC Standard for JavaScript (2010 年 03 月 08 日)" data-comment="0">PureMVC Standard for JavaScript</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/176.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>判断 iframe 是否加载完成的完美方法</title>
		<link>http://www.zfkun.com/167.html</link>
		<comments>http://www.zfkun.com/167.html#comments</comments>
		<pubDate>Thu, 13 Jan 2011 07:23:58 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[iframe]]></category>
		<category><![CDATA[iframe onload]]></category>
		<category><![CDATA[onload]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=167</guid>
		<description><![CDATA[网络看到，记录下。 一般来说，我们判断 iframe 是否加载完成其实与 判断 JavaScript 文件是否加载完成 采用的方法很类似： var iframe = document.createElement("iframe"); iframe.src = "http://www.planabc.net"; if (!/*@cc_on!@*/0) { //if not IE     iframe.onload = function(){         alert("Local iframe is now loaded.");     }; } else &#8230; <a href="http://www.zfkun.com/167.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>网络看到，记录下。</p>
<p>一般来说，我们判断 iframe 是否加载完成其实与 <a title="如何判断脚本加载完成 " href="http://www.planabc.net/2008/10/31/javascript_ready_onload/" target="_blank">判断 JavaScript 文件是否加载完成</a> 采用的方法很类似：</p>
<pre><code>var iframe = document.createElement("iframe");
iframe.src = "http://www.planabc.net";

if (!/*@cc_on!@*/0) { //if not IE
    iframe.onload = function(){
        alert("Local iframe is now loaded.");
    };
} else {
    iframe.onreadystatechange = function(){
        if (iframe.readyState == "complete"){
            alert("Local iframe is now loaded.");
        }
    };
}

document.body.appendChild(iframe);</code></pre>
<p>最近， <a title="NCZOnline" href="http://www.nczonline.net/" target="_blank">Nicholas C. Zakas</a> 文章<a title="Iframes, onload, and document.domain" href="http://www.nczonline.net/blog/2009/09/15/iframes-onload-and-documentdomain/" target="_blank">《Iframes, onload, and document.domain》</a>的评论中 Christopher 提供了一个新的判断方法（很完美）：</p>
<pre><code>var iframe = document.createElement("iframe");
iframe.src = "http://www.planabc.net";

if (iframe.attachEvent){
    iframe.attachEvent("onload", function(){
        alert("Local iframe is now loaded.");
    });
} else {
    iframe.onload = function(){
        alert("Local iframe is now loaded.");
    };
}

document.body.appendChild(iframe);</code></pre>
<p>几点补充说明：</p>
<ol>
<li><a title="onload Event (BODY, FRAME, FRAMESET, ...)&lt;br /&gt;" href="http://msdn.microsoft.com/en-us/library/cc197055%28VS.85%29.aspx" target="_blank">IE 支持 iframe 的 onload 事件</a>，不过是隐形的，需要通过 attachEvent 来注册。</li>
<li>第二种方法比第一种方法更完美，因为 readystatechange 事件相对于 load 事件有一些潜在的问题。</li>
</ol>

	标签：<a href="http://www.zfkun.com/tag/iframe" title="iframe" rel="tag">iframe</a>, <a href="http://www.zfkun.com/tag/iframe-onload" title="iframe onload" rel="tag">iframe onload</a>, <a href="http://www.zfkun.com/tag/onload" title="onload" rel="tag">onload</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/199.html" title="XHR与浏览器导航冲突解决方案 (2011 年 03 月 20 日)" data-comment="0">XHR与浏览器导航冲突解决方案</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/167.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>获取 Textarea 的光标位置</title>
		<link>http://www.zfkun.com/163.html</link>
		<comments>http://www.zfkun.com/163.html#comments</comments>
		<pubDate>Thu, 13 Jan 2011 06:55:22 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[range]]></category>
		<category><![CDATA[textarea]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=163</guid>
		<description><![CDATA[在任何编辑器中，获取光标位置都是非常重要的，很多人可能认为较难，其实只要处理好浏览器的兼容，还是比较容易实现的。 <a href="http://www.zfkun.com/163.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>网络看到，记录下。</p>
<p>在任何编辑器中，获取光标位置都是非常重要的，很多人可能认为较难，其实只要处理好浏览器的兼容，还是比较容易实现的。</p>
<p>下面我们一起来看看如何获取到 Textarea 元素中的光标位置（<a href="http://www.planabc.net/demo/range/textarea-cursor-position.html" target="_blank">测试地址</a>）。</p>
<p>首先，我们用 rangeData 对象作为数据存储，并获得焦点：</p>
<pre><code>var rangeData = {start: 0, end: 0, text: "" }; textarea.focus();</code></pre>
<p>对于非 IE 浏览器获取选区的起始和末尾位置其实非常容易：</p>
<pre><code>rangeData.start= el.selectionStart; rangeData.end = el.selectionEnd;</code></pre>
<p>通过截取我们可以得到光标的选区内容：</p>
<pre><code>rangeData.text = (rangeData.start != rangeData.end) ? el.value.substring(rangeData.start, rangeData.end): "";</code></pre>
<p>而对于 IE 浏览器处理起来就比较麻烦了，但我们依旧可以获取到选区：</p>
<pre><code>oS = document.selection.createRange();</code></pre>
<p>同时还可获取 Textarea 元素的选区：</p>
<pre><code>// 为了使 oR 与 oS 在同一等级上比较，请勿使用：oR = textarea.createTextRange() oR = document.body.createTextRange(); oR.moveToElementText(textarea);</code></pre>
<p>如果光标在 Textarea 元素内，很自然 oS.text 就是我们需要的选区内容：</p>
<pre><code>rangeData.text = oS.text;</code></pre>
<p>并且我们可以通过 oS.getBookmark() 方法获取到选区的位置数据，该位置数据可以通过 moveToBookmark() 方法设置回去。</p>
<blockquote><p><a title="getBookmark Method" href="http://msdn.microsoft.com/en-us/library/ms536432%28v=VS.85%29.aspx" target="_blank">getBookmark</a>: Retrieves a bookmark (opaque string) that can be used with moveToBookmark to return to the same range.</p>
<p><a title="moveToBookmark Method" href="http://msdn.microsoft.com/en-us/library/ms536628%28v=VS.85%29.aspx" target="_blank">moveToBookmark</a>: Moves to a bookmark.</p></blockquote>
<p>我们用 rangeData.bookmark 来记录该位置数据：</p>
<pre><code>rangeData.bookmark = oS.getBookmark();</code></pre>
<p>下面是最重要的步骤：我们比较 oR 与 oS 的选区起始位置（使用 <code>object.compareEndPoints(sType, oRange)</code> 方法比较），如果 oR 的起始位置在 oS 之前，我们向前移动 oS 的起始位置1个字符（使用 <code>object.moveStart(sUnit [, iCount])</code> 方法移动），一直当 oS 的起始位置在 oR 之前停止，移动的位置，则是选区的起始位置。</p>
<blockquote><p><a title="compareEndPoints Method" href="http://msdn.microsoft.com/en-us/library/ms536373%28v=VS.85%29.aspx" target="_blank">compareEndPoints</a>: Compares an end point of a TextRange object with an end point of another range.</p>
<p><a title="moveStart Method" href="http://msdn.microsoft.com/en-us/library/ms536623%28v=VS.85%29.aspx" target="_blank">moveStart</a>: Changes the start position of the range.</p></blockquote>
<pre><code>for (i = 0; oR.compareEndPoints('StartToStart', oS) &lt; 0 &amp;&amp; oS.moveStart("character", -1) !== 0; i ++) {} rangeData.start = i;</code></pre>
<p>但由于在 IE 中，Textarea 元素中的所有换行符都占 1 个字符，可以通过 <code>alert(textarea.value.length)</code> 查看，故要对上面的代码做部分处理：</p>
<pre><code>for (i = 0; oR.compareEndPoints('StartToStart', oS) &lt; 0 &amp;&amp; oS.moveStart("character", -1) !== 0; i ++) {     // Why? You can alert(textarea.value.length)     if (textarea.value.charAt(i) == '\n') {         i ++;     } } rangeData.start = i;</code></pre>
<p>既然得到了选区的起始位置和选区字符串的字符，很自然我们可以计算得到选区的末尾位置：</p>
<pre><code>rangeData.end = rangeData.text.length + rangeData.start;</code></pre>
<p>获取 Textarea 的光标位置的 getCursorPosition 函数方法整理如下：</p>
<pre><code>/** * getCursorPosition Method * * Created by Blank Zheng on 2010/11/12. * Copyright (c) 2010 PlanABC.net. All rights reserved. * * The copyrights embodied in the content of this file are licensed under the BSD (revised) open source license. */ function getCursorPosition(textarea) {     var rangeData = {text: "", start: 0, end: 0 };         textarea.focus();     if (textarea.setSelectionRange) { // W3C         rangeData.start= textarea.selectionStart;         rangeData.end = textarea.selectionEnd;         rangeData.text = (rangeData.start != rangeData.end) ? textarea.value.substring(rangeData.start, rangeData.end): "";     } else if (document.selection) { // IE         var i,             oS = document.selection.createRange(),             // Don't: oR = textarea.createTextRange()             oR = document.body.createTextRange();         oR.moveToElementText(textarea);         rangeData.text = oS.text;         rangeData.bookmark = oS.getBookmark();         // object.moveStart(sUnit [, iCount])         // Return Value: Integer that returns the number of units moved.         for (i = 0; oR.compareEndPoints('StartToStart', oS) &lt; 0 &amp;&amp; oS.moveStart("character", -1) !== 0; i ++) {             // Why? You can alert(textarea.value.length)             if (textarea.value.charAt(i) == '\n') {                 i ++;             }         }         rangeData.start = i;         rangeData.end = rangeData.text.length + rangeData.start;     }     return rangeData; }</code></pre>
<p>得到 Textarea 元素光标位置，当Textarea 中的光标丢失了，再设置回来就简单多了：</p>
<pre><code>/** * setCursorPosition Method * * Created by Blank Zheng on 2010/11/12. * Copyright (c) 2010 PlanABC.net. All rights reserved. * * The copyrights embodied in the content of this file are licensed under the BSD (revised) open source license. */ function setCursorPosition(textarea, rangeData) {     if(!rangeData) {         alert("You must get cursor position first.")     }     if (textarea.setSelectionRange) { // W3C         textarea.focus();         textarea.setSelectionRange(rangeData.start, rangeData.end);     } else if (textarea.createTextRange) { // IE         var oR = textarea.createTextRange();         // Fixbug :         // In IE, if cursor position at the end of textarea, the setCursorPosition function don't work         if(textarea.value.length === rangeData.start) {             oR.collapse(false)             oR.select();         } else {             oR.moveToBookmark(rangeData.bookmark);             oR.select();         }     } }</code></pre>
<p>测试地址：<a href="http://www.planabc.net/demo/range/textarea-cursor-position.html" target="_blank">http://www.planabc.net/demo/range/textarea-cursor-position.html</a></p>
<p>扩展阅读：</p>
<ul>
<li><a title="TextRange Prototype" href="http://msdn.microsoft.com/en-us/library/dd347140%28v=VS.85%29.aspx" target="_blank">《TextRange Prototype》</a></li>
<li><a title="TextArea Cursor Position with JavaScript" href="http://geekswithblogs.net/svanvliet/archive/2005/03/24/textarea-cursor-position-with-javascript.aspx" target="_blank">《TextArea Cursor Position with JavaScript》</a></li>
</ul>

	标签：<a href="http://www.zfkun.com/tag/cursor" title="cursor" rel="tag">cursor</a>, <a href="http://www.zfkun.com/tag/range" title="range" rel="tag">range</a>, <a href="http://www.zfkun.com/tag/textarea" title="textarea" rel="tag">textarea</a><br />

	<h4>相关推荐</h4>
	<ul class="st-related-posts">
	<li><a href="http://www.zfkun.com/131.html" title="5 个简单实用的 CSS 属性 (2010 年 03 月 09 日)" data-comment="0">5 个简单实用的 CSS 属性</a></li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/163.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何获取当前 select 元素的值</title>
		<link>http://www.zfkun.com/161.html</link>
		<comments>http://www.zfkun.com/161.html#comments</comments>
		<pubDate>Thu, 13 Jan 2011 06:44:39 +0000</pubDate>
		<dc:creator>影之迷惑</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[option]]></category>
		<category><![CDATA[select]]></category>
		<category><![CDATA[select value option]]></category>
		<category><![CDATA[value]]></category>

		<guid isPermaLink="false">http://www.zfkun.com/blog/?p=161</guid>
		<description><![CDATA[如何获取当前 select 元素的值 <a href="http://www.zfkun.com/161.html">阅读全文 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>网上看到，记录下。</p>
<p>   1. 如果 select 元素下的所有 option 元素均没有指定 selected 属性，会默认选中第一个。<br />
   2. 可以通过 select.selectedIndex 获取到选中的 option 元素的索引。<br />
   3. 可以通过 select.options[select.selectedIndex] 获取到选中的 option 元素。<br />
   4. option 元素<br />
<option selected="selected" value="value3">text3</option>
<p>，可以通过 option.value 获得 option 元素的 value 属性值，即 value3；可以通过 option.text 获得 option 元素内的文本，即 text3。<br />
   5. 如果 option 元素没有定义 value 属性，则 IE 中 option.value 无法获得，但 Safari、Opera、FireFox 依旧可以通过 option.value 获得，值同于 option.text 。<br />
   6. 可以通过 option.attributes.value &#038;&#038; option.attributes.value.specified 来判断 option 元素是否定义了 value 属性。</p>
<p>故，获得当前 select 元素值的脚本如下：</p>
<p>var getSelectValue = function(select) {<br />
    var idx = select.selectedIndex,<br />
        option,<br />
        value;<br />
    if (idx > -1) {<br />
        option = select.options[idx];<br />
        value = option.attributes.value;<br />
        return (value &#038;&#038; value.specified) ? option.value : option.text;<br />
    }<br />
    return null;<br />
}</p>

	标签：<a href="http://www.zfkun.com/tag/option" title="option" rel="tag">option</a>, <a href="http://www.zfkun.com/tag/select" title="select" rel="tag">select</a>, <a href="http://www.zfkun.com/tag/select-value-option" title="select value option" rel="tag">select value option</a>, <a href="http://www.zfkun.com/tag/value" title="value" rel="tag">value</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.zfkun.com/161.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

