<?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>Joy-Studio</title>
	<atom:link href="http://www.joy-studio.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.joy-studio.com</link>
	<description>Joy-Studio&#124;Doomin&#124;Frontend&#124;Web Design</description>
	<lastBuildDate>Mon, 30 Jan 2012 04:43:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>加入北漂—明天不能接电话</title>
		<link>http://www.joy-studio.com/life/dali.html</link>
		<comments>http://www.joy-studio.com/life/dali.html#comments</comments>
		<pubDate>Sat, 23 Jul 2011 13:47:27 +0000</pubDate>
		<dc:creator>Doomin</dc:creator>
				<category><![CDATA[生·活]]></category>
		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://www.joy-studio.com/?p=270</guid>
		<description><![CDATA[今天是在成都的最后一天，成都的朋友坚持追问航班起飞的时间，准备送我，感动。房东一点人情味都没有，心凉。来四川工作两年多，大部分的好玩的地方都没去过，遗憾。 从明天开始，正式成为北漂一员，希望能顺利点。 明天9点到12点之间在天上飞，不能接电话。]]></description>
			<content:encoded><![CDATA[<p>今天是在成都的最后一天，成都的朋友坚持追问航班起飞的时间，准备送我，感动。房东一点人情味都没有，心凉。来四川工作两年多，大部分的好玩的地方都没去过，遗憾。</p>
<p>从明天开始，正式成为北漂一员，希望能顺利点。<br />
明天9点到12点之间在天上飞，不能接电话。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joy-studio.com/life/dali.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rosy介绍及来自优秀框架的借鉴</title>
		<link>http://www.joy-studio.com/frontend-develop/rosy-intro.html</link>
		<comments>http://www.joy-studio.com/frontend-develop/rosy-intro.html#comments</comments>
		<pubDate>Mon, 11 Jul 2011 04:18:48 +0000</pubDate>
		<dc:creator>Doomin</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[style]]></category>

		<guid isPermaLink="false">http://www.joy-studio.com/?p=258</guid>
		<description><![CDATA[• Rosy是什么? Rosy的目的很明确，她提供一整套高精度的、高定制化的、可以快速和设计师的设计相吻合的UI组件库。 • Rosy和已有的其他UI库有什么最大的区别？ 首先，Rosy的应用范围，定位于精美设计的UI实现。通常这种设计都来自知名设计师，或者该UI风格在整个项目中传达了很重要的企业形象，比如专业的ERP界面，专业的企业管理系统界面，一个网站的宣传入口页面，或者独立的前端外包项目中出现的精美UI等等，当这种前端实现不允许针对低级浏览器做优雅降级处理的时候，Rosy就发挥作用了。 其次，Rosy有个愿景，让前端开发工程师和UI设计师通过紧密的配合，将各自能力发挥到极致。很多JS库都有UI组件，但大多数都缺少整套的精美的皮肤，或者没有提供方便的标签结构可以让使用者顺利的安装自己的皮肤。原因在于很多前端开发工程师不懂设计，心有余而力不足。而Rosy会将开发和设计并行推进，让前端开发工程师更懂UI，让UI设计师更了解前端，让两种角色通过紧密的配合，将各自能力发挥到极致。 最后，Rosy只追求分享与进步，不带有任何宣传和推广的压力。Rosy最初的出现，只是个人用来学习原生js和对面向对象编程的实验品，希望在长期的改进、积累、交流和分享以后，能够最终成为自己沉淀前端技术的一个载体。后来随着组件的逐渐增多，就希望她能成为更多前端开发工程师和UI设计师沉淀技术的载体，希望通过这个载体，找到更多喜欢UI组件开发和前端开发同学一起加入进来，彼此分享，共同收获！最终进入良性循环，稳定进步。除此之外的名气啊，使用量啊，宣传推广啊，争夺用户啊，一定要和谁谁谁比个高下啊，口水战啊什么的都不考虑，都是浮云！ • Rosy继承了前辈级UI库的诸多优点，也借鉴了很多优秀JS库的骨架设计。 下面就谈谈Rosy借鉴的其他优秀JS库的一些优点，以及代码设计过程中考虑到的一些细节。 Tangram的静态方法 早在设计Rosy的代码骨架的时候，百度的Tangram刚刚开源不久。Tangram除了极小的拆分粒度之外，还有一个亮点在于把所有的方法都写成静态的，于是代码的耦合度降低，利于拆分，可以根据业务逻辑来充分地自由定制所需要的代码，真的很敬佩百度前端团队在带宽流量、加载性能和渲染效率方面追求极致精神。 Rosy借鉴了Tangram，也把所有底层方法静态化，但有两点不同。 首先，Rosy没有追求如此小的可拆分粒度（Tangram是一个方法一个文件），所以在堆砌静态方法的写法上，Rosy可以一路狂飙逗号，生产变量，同时为每个方法都生成一个主文件作用域下的快捷键，这样所有发生在内部的调用，都可以使用快捷键，不仅书写方便，而且大大减少因逐级查找对象而产生的消耗 ( 相关知识可以参见《高性能javascript编程》 第二章 数据访问 )，最后还可以提高压缩率。 其次，Rosy的Dom静态方法的第一个参数不支持传入ID字符串，希望通过更严格的参数减少Rosy内部的无效调用。比如在Tangram中，baidu.dom.setAttrs(your-id, {三个键值对})会在内部有三次对baidu.dom.g函数的无效调用。而R.setAttrs方法的第一个参数必须是元素。从代码量来看，把第一个参数严格化以后，每个dom静态函数都节省了一行代码。 下面的代码是Rosy堆砌静态方法的一个缩影。注意带有表情的注释。 Javascript Code //对象相关静态函数 var Obj = R.Obj = {}, //定义二级名称空间Obj，同时生成快捷键Obj， /** * 查找构造对象的名称 * @name R.Obj.getConstructorName */ &#8230; <a href="http://www.joy-studio.com/frontend-develop/rosy-intro.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3>• Rosy是什么?</h3>
<p>Rosy的目的很明确，她提供一整套高精度的、高定制化的、可以快速和设计师的设计相吻合的UI组件库。</p>
<h3>• Rosy和已有的其他UI库有什么最大的区别？</h3>
<p><strong>首先，Rosy的应用范围，定位于精美设计的UI实现。</strong>通常这种设计都来自知名设计师，或者该UI风格在整个项目中传达了很重要的企业形象，比如专业的ERP界面，专业的企业管理系统界面，一个网站的宣传入口页面，或者独立的前端外包项目中出现的精美UI等等，当这种前端实现不允许针对低级浏览器做优雅降级处理的时候，Rosy就发挥作用了。</p>
<p><span id="more-258"></span></p>
<p><strong>其次，Rosy有个愿景，让前端开发工程师和UI设计师通过紧密的配合，将各自能力发挥到极致。</strong>很多JS库都有UI组件，但大多数都缺少整套的精美的皮肤，或者没有提供方便的标签结构可以让使用者顺利的安装自己的皮肤。原因在于很多前端开发工程师不懂设计，心有余而力不足。而Rosy会将开发和设计并行推进，让前端开发工程师更懂UI，让UI设计师更了解前端，让两种角色通过紧密的配合，将各自能力发挥到极致。</p>
<p><strong>最后，Rosy只追求分享与进步，不带有任何宣传和推广的压力。</strong>Rosy最初的出现，只是个人用来学习原生js和对面向对象编程的实验品，希望在长期的改进、积累、交流和分享以后，能够最终成为自己沉淀前端技术的一个载体。后来随着组件的逐渐增多，就希望她能成为更多前端开发工程师和UI设计师沉淀技术的载体，希望通过这个载体，找到更多喜欢UI组件开发和前端开发同学一起加入进来，彼此分享，共同收获！最终进入良性循环，稳定进步。除此之外的名气啊，使用量啊，宣传推广啊，争夺用户啊，一定要和谁谁谁比个高下啊，口水战啊什么的都不考虑，都是浮云！</p>
<h3>• Rosy继承了前辈级UI库的诸多优点，也借鉴了很多优秀JS库的骨架设计。</h3>
<p>下面就谈谈Rosy借鉴的其他优秀JS库的一些优点，以及代码设计过程中考虑到的一些细节。</p>
<p><strong>Tangram的静态方法</strong></p>
<p>早在设计Rosy的代码骨架的时候，百度的<a href="http://tangram.baidu.com/index.html" target="_blank">Tangram</a>刚刚开源不久。Tangram除了极小的拆分粒度之外，还有一个亮点在于把所有的方法都写成静态的，于是代码的耦合度降低，利于拆分，可以根据业务逻辑来充分地自由定制所需要的代码，真的很敬佩百度前端团队在带宽流量、加载性能和渲染效率方面追求极致精神。</p>
<p><strong>Rosy借鉴了Tangram，也把所有底层方法静态化，但有两点不同。</strong></p>
<p>首先，Rosy没有追求如此小的可拆分粒度（Tangram是一个方法一个文件），所以在堆砌静态方法的写法上，Rosy可以一路狂飙逗号，生产变量，同时为每个方法都生成一个主文件作用域下的快捷键，这样所有发生在内部的调用，都可以使用快捷键，不仅书写方便，而且大大减少因逐级查找对象而产生的消耗 ( 相关知识可以参见《高性能javascript编程》 第二章 数据访问 )，最后还可以提高压缩率。</p>
<p>其次，Rosy的Dom静态方法的第一个参数不支持传入ID字符串，希望通过更严格的参数减少Rosy内部的无效调用。比如在Tangram中，baidu.dom.setAttrs(your-id, {三个键值对})会在内部有三次对baidu.dom.g函数的无效调用。而R.setAttrs方法的第一个参数必须是元素。从代码量来看，把第一个参数严格化以后，每个dom静态函数都节省了一行代码。</p>
<p>下面的代码是Rosy堆砌静态方法的一个缩影。<span class="red">注意带有表情的注释。</span></p>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">
//对象相关静态函数
var Obj = R.Obj = {}, //定义二级名称空间Obj，同时生成快捷键Obj，<span class="sh_wow"> </span>
    /**
     * 查找构造对象的名称
     * @name R.Obj.getConstructorName
     */
    getConstructorName = Obj.getConstructorName = function(o) { //添加方法同时生成快捷键<span class="sh_wow"> </span>
        return o != null &#038;&#038; toString.call(o).slice(8, -1);
    },
    /**
     * 判断是不是函数
     * @name R.Obj.isFunction
     */
    isFunction = Obj.isFunction = function(o) {
        return getConstructorName(o) == 'Function'; //直接使用了快捷键getConstructorName<span class="sh_wow"> </span>
    },
    /**
     * 判断是不是数组
     * @name R.Obj.isArray
     */
    isArray = Obj.isArray = function(o) {
        return getConstructorName(o) == 'Array';
    },
    /**
     * 是不是new Object的对象或对象字面量{}
     * @name R.Obj.isPlainObject
     */
    isPlainObject = Obj.isPlainObject = function(o) {
        return !! o &#038;&#038; o !== TRUE &#038;&#038; o.constructor === Object;
    },
    /**
     * 判断是不是一个元素
     * @name R.Obj.isElement
     */
    isElement = Obj.isElement = function(o) {
        return !! o &#038;&#038; o !== TRUE &#038;&#038; !isPlainObject(o)
                 &#038;&#038; !!o.nodeName &#038;&#038; (o.nodeType == 1 || o.nodeType == 9);
    },
    /**
     * 判断是不是dom集合
     * 主流浏览器对 nodelist 执行 toString 方法的值如下
     *     [object NodeList]           -> opera, chrome, safari
     *     [object HTMLCollection]  -> firefox, ie9
     *     [object Object]             -> ie6/7/8
    */
    isNodeList = Obj.isNodeList = function(o) {
        var s = getConstructorName(o);
        return s === 'NodeList' || s === 'HTMLCollection' ||
               (s === 'Object' &#038;&#038; !isPlainObject(o) &#038;&#038; !isElement(o) &#038;&#038; !isArray(o)); //三个快捷键<span class="sh_wow"> </span>
    },

    //省略的Obj的静态函数

    /**
     * 将R.Obj名称空间下的所有方法都上提一级到R上, 方便调用
     */
    for (var i in Obj) { R[i] = Obj[i]; }

//函数相关静态函数
var Fun = R.Fun = {},
    /**
     * 根据fn(el, key, value)函数创建fn(el, { key1:value1, key2:value2, ...})函数
     * @name R.Fun.hash
     * 比如根据setAttr函数创建setAttrs函数: var setAttrs = hash(setAttr)
     */
    hash = Fun.hash = function(fn) {
        return function(el, hash) {
            for (var i in hash) fn(el, i, hash[i]);
            return el;
        };
    },
    //继续一路逗号狂飙，一个函数，一个快捷键...
</pre>
</div>
<p><strong>借鉴QWrap的函数变换</strong></p>
<p>在Tangram开源不久，<a href="http://qwrap.com/" target="_blank">QWrap</a>也相继开源，其Helper + Wrap + Retouch + Apps设计主线，又让人眼前一亮，其中最把这四个层次紧密链接起来的关键，在于有啊团队对函数变换的巧妙应用。QWrap设计的具体细节可以查看<a href="http://qwrap.com/" target="_blank">官方博客</a>。</p>
<p>如果思考角度上升到设计层面，函数变换的强大之处在于，它可以让一个类库组织代码的方式变得清晰，简单、容易扩展和维护，这不正是前端工程师所追求的东东嘛！学以致用，Rosy的静态方法也需要经过如此的变换，突破静态的束缚。</p>
<p>在QWrap中，Dom的静态方法和包裹器分别位于QW.NodeH和QW.NodeW两个不同的名称空间下，在Rosy中，将二者合为一体，将Dom的静态方法存放于Dom包裹器构造函数的静态属性 (也叫类方法) 上，代码片段如下，<span class="red">注意带有表情的注释。</span></p>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">
//元素包裹器构造函数<span class="sh_wow"> </span>
var Dom = R.Dom = function() {
    //包裹器初始化代码
},
    /**
     * @name R.Dom.setAttr
     */
    setAttr = Dom.setAttr = function(el, k, v) {
        k === 'style' ? el.style.cssText = v: el.setAttribute(_attrFixer[k] || k, v);
        return el;
    },
    /**
     * @name R.Dom.setAttrs
     */
    setAttrs = Dom.setAttrs = hash(setAttr),

    //省略N行代码............

    /**
     * Dom包裹器的原型对象, R.Dom名称空间下的所有"规范"的静态函数都将扩展到该原型对象上
     * 以支持链式调用
     * @name R.Dom.protos
     */
    protos = Dom.prototype = {}; //包裹器的原型出现啦 <span class="sh_wow"> </span>
    /**
     * 添加Dom的原型方法, 即将R.Dom名称空间下的所有"规范"的静态函数都扩展到R.Dom.prototype上
     */
    var protosMethods = 'setAttr,setAttrs,hasClass,addClass,removeClass/* ... */'.split(','),
        method,
        i = protosMethods.length;
    while (i--) {
        method = protosMethods[i];
        protos[method] = methodize(Dom[method], 'nodes');  //函数变换出现啦 <span class="sh_wow"> </span>
    }
    /**
     * 将R.Dom名称空间下的方法上提一级到R上, 方便调用
     * @note Dom.prototype是不会被枚举的, 所以不会被加到R上
     */
    for (var i in Dom) { i[0] !== '_' &#038;&#038; (R[i] = Dom[i]); }
</pre>
</div>
<p><strong>借鉴YUI的异步加载</strong></p>
<p>这个没什么说的，Y.use()和Y.add()早已风靡前端世界了。Rosy中实现了R.use()和R.add()。</p>
<p><strong>借鉴YUI式的类的继承</strong></p>
<p>类的继承是Rosy在UI方向的努力，包括组合对象类R.Fieldset，抽象类R.BaseField，这部分还在改进中。</p>
<p>因为目前Rosy还在前期开发中，所以更多详细内容等过一阶段再续。</p>
<p class="copy-note"><strong>转载声明：</strong>原创文章，转载必须以链接形式注明原文作者和原文地址，谢谢合作。<br /><strong>原文地址：</strong><a href="http://www.joy-studio.com/frontend-develop/rosy-intro.html" title="Rosy介绍及其代码设计|Doomin|Joy-Studio">http://www.joy-studio.com/frontend-develop/rosy-intro.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.joy-studio.com/frontend-develop/rosy-intro.html/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>一道面试题：当一个优秀的框架出现，你该如何认识它?</title>
		<link>http://www.joy-studio.com/life/how-do-you-get-to-know-a-new-framework.html</link>
		<comments>http://www.joy-studio.com/life/how-do-you-get-to-know-a-new-framework.html#comments</comments>
		<pubDate>Mon, 04 Jul 2011 05:35:39 +0000</pubDate>
		<dc:creator>Doomin</dc:creator>
				<category><![CDATA[生·活]]></category>
		<category><![CDATA[study]]></category>

		<guid isPermaLink="false">http://www.joy-studio.com/?p=248</guid>
		<description><![CDATA[说先说明一下，该文标题就是一道电话面试中的问题，所以这篇文章只是谈谈自己的想法，仅此而已，也希望有大牛指点迷津。 做前端也快三年了，习惯的学，如何去学，在哪里学，在哪里问，在哪里交流，都好像存在一种惯性思维在潜移默化的安排着。学习的每个过程都有收获，随之带来更强烈的求知欲，于是这三年中，就在求知、迷惑、解惑，总结和分享的相互转化中不断进步着。一切都是那么自然的状态。 但在电话面试中，想把这个问题用语言有条理的描述出来，的确不是我的长项。 听到问题后，脑海里第一个出现的就是很多学习中的场景，而不是思路、词汇或句子。 无论如何，电话面试中，脑海中一切场景都要归于语言，结果说了很多，自己都感觉表达的条理不清，真是辛苦了面试官，感谢如此耐心的CTO。面试过后，静下心来，必须总结一下了。 未完待续&#8230;]]></description>
			<content:encoded><![CDATA[<p>说先说明一下，该文标题就是一道电话面试中的问题，所以这篇文章只是谈谈自己的想法，仅此而已，也希望有大牛指点迷津。</p>
<p>做前端也快三年了，习惯的学，如何去学，在哪里学，在哪里问，在哪里交流，都好像存在一种惯性思维在潜移默化的安排着。学习的每个过程都有收获，随之带来更强烈的求知欲，于是这三年中，就在求知、迷惑、解惑，总结和分享的相互转化中不断进步着。一切都是那么自然的状态。</p>
<p><span id="more-248"></span></p>
<p>但在电话面试中，想把这个问题用语言有条理的描述出来，的确不是我的长项。 听到问题后，脑海里第一个出现的就是很多学习中的场景，而不是思路、词汇或句子。</p>
<p>无论如何，电话面试中，脑海中一切场景都要归于语言，结果说了很多，自己都感觉表达的条理不清，真是辛苦了面试官，感谢如此耐心的CTO。面试过后，静下心来，必须总结一下了。</p>
<p>未完待续&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joy-studio.com/life/how-do-you-get-to-know-a-new-framework.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>跨浏览器鼠标滚轮事件及测试用例</title>
		<link>http://www.joy-studio.com/frontend-develop/cross-browser-mousewheel-and-demo.html</link>
		<comments>http://www.joy-studio.com/frontend-develop/cross-browser-mousewheel-and-demo.html#comments</comments>
		<pubDate>Sun, 26 Jun 2011 08:56:13 +0000</pubDate>
		<dc:creator>Doomin</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.joy-studio.com/?p=222</guid>
		<description><![CDATA[上周的一个项目中，老外设计师把所有的轮动条都设计成自定义样子，其中用到鼠标滚轮事件，完成任务后，趁热打铁，赶紧总结。 可以先瞄一眼测试页面。 浏览器差异： Firefox的滚轮事件是DOMMouseScroll，其他浏览器使用的是mousewheel Firefox事件的event对象使用detail值表示滚轮方向，负3表示向上(前)，正3表示向下(后)。其他浏览器使用wheelDelta值表示滚轮方向，正120表示向上(前)，负120表示向下(后)。Opera 11.11即有detail值(同FF)也有wheelDelta值。 不要和正负3或正负120做等值比较来滚轮判断方向，应该和零比较。比如wheelDelta值大于0表示向上(前)。这么做的原因是有些用户的鼠标是基于厂家自己的驱动运行的，有更高级的灵敏度识别，在用户快速滚动滑轮的时候，event对象的detail或wheelDelta会出现其他值得情况。 经典得基本已成为废话，IE678使用attachEvent/detachEvent，其他浏览器使用addEventListener/removeEventListener。 封装后的代码，加入统一的方向标识和一些常用的功能： 为event对象加入wheel值表示滚轮方向，正1表示向上(前)，负1表示向下(后)。 为event对象加入wheelDir值表示滚轮方向，up表示向上(前)，down表示向下(后)。 纠正了IE678下事件函数内部的this值，指向绑定事件的DOM元素。 为IE678下事件函数传染event对象。 可以通过第三个参数决定是否阻止滚轮的默认行为，即触发整个网页的滚动事件。默认为true，阻止滚轮的默认行为。 同一个DOM元素可以绑定多个滚轮事件但不允许绑定重复的事件。 实现代码： Javascript Code /* * mousewheel.js (c) Doomin&#124;Joy-Studio * @example * mouseWheel.on(el, callback) * mouseWheel.on(el, callback, false) do NOT prevent default event * mouseWheel.un(el, callback) &#8230; <a href="http://www.joy-studio.com/frontend-develop/cross-browser-mousewheel-and-demo.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>上周的一个项目中，老外设计师把所有的轮动条都设计成自定义样子，其中用到鼠标滚轮事件，完成任务后，趁热打铁，赶紧总结。</p>
<p>可以先瞄一眼<a href="http://www.joy-studio.com/demo/mousewheel/cross-browser-mousewheel-and-demo.html" target="_blank">测试页面</a>。</p>
<p><span id="more-222"></span></p>
<h3>浏览器差异：</h3>
<ul>
<li>Firefox的滚轮事件是DOMMouseScroll，其他浏览器使用的是mousewheel</li>
<li>Firefox事件的event对象使用detail值表示滚轮方向，负3表示向上(前)，正3表示向下(后)。其他浏览器使用wheelDelta值表示滚轮方向，正120表示向上(前)，负120表示向下(后)。Opera 11.11即有detail值(同FF)也有wheelDelta值。</li>
<li>不要和正负3或正负120做等值比较来滚轮判断方向，应该和零比较。比如wheelDelta值大于0表示向上(前)。这么做的原因是有些用户的鼠标是基于厂家自己的驱动运行的，有更高级的灵敏度识别，在用户快速滚动滑轮的时候，event对象的detail或wheelDelta会出现其他值得情况。</li>
<li>经典得基本已成为废话，IE678使用attachEvent/detachEvent，其他浏览器使用addEventListener/removeEventListener。</li>
</ul>
<h3>封装后的代码，加入统一的方向标识和一些常用的功能：</h3>
<ul>
<li>为event对象加入wheel值表示滚轮方向，正1表示向上(前)，负1表示向下(后)。</li>
<li>为event对象加入wheelDir值表示滚轮方向，up表示向上(前)，down表示向下(后)。</li>
<li>纠正了IE678下事件函数内部的this值，指向绑定事件的DOM元素。</li>
<li>为IE678下事件函数传染event对象。</li>
<li>可以通过第三个参数决定是否阻止滚轮的默认行为，即触发整个网页的滚动事件。默认为true，阻止滚轮的默认行为。</li>
<li>同一个DOM元素可以绑定多个滚轮事件但不允许绑定重复的事件。</li>
</ul>
<h3>实现代码：</h3>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">/*
 * mousewheel.js (c) Doomin|Joy-Studio
 * @example
 *     mouseWheel.on(el, callback)
 *     mouseWheel.on(el, callback, false) do NOT prevent default event
 *     mouseWheel.un(el, callback)
*/
var mouseWheel = (function() {
    var doc = document,
    types = ['DOMMouseScroll', 'mousewheel'],
    fixedEvent = function(e) {
        e.wheel = (e.wheelDelta ? e.wheelDelta: -e.detail) &gt; 0 ? 1 : -1;
        e.wheelDir = e.wheel &gt; 0 ? 'up': 'down';
        return e;
    };

    //return the api method
    return {
        on: function(el, fn, preventDefault) {
            if (typeof preventDefault !== 'boolean') {
                preventDefault = true;
            }

            var fixedFn = function(e) {
                e = fixedEvent(e || window.event);
                if (preventDefault) {
                    if (e.preventDefault) {
                        e.preventDefault()
                    } else {
                        e.returnValue = false;
                    }
                }
                fn.call(el, e);
            },
            wheelHash = el.wheelHash;

            if (!wheelHash) {
                wheelHash = {};
                wheelHash[fn] = fixedFn;
                el.wheelHash = wheelHash;
            } else {
                //ignore the repeat event
                if (wheelHash[fn]) return;
                wheelHash[fn] = fixedFn;
            }

            if (doc.addEventListener) {
                var i = types.length;
                while (i--) {
                    el.addEventListener(types[i], fixedFn, false);
                }
            } else {
                el.attachEvent('onmousewheel', fixedFn);
            }
        },
        un: function(el, fn) {
            if (!el.wheelHash) return;
            var wheelHash = el.wheelHash;
            if (doc.removeEventListener) {
                var i = types.length;
                while (i--) {
                    el.removeEventListener(types[i], wheelHash[fn], false);
                }
            } else {
                el.detachEvent('onmousewheel', wheelHash[fn]);
            }
            delete wheelHash[fn];
        }
    };
})();</pre>
</div>
<h3>如何使用：</h3>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">//定义滚轮事件
var myWheel = function(e){
    console.log(e.wheelDir);
}
//添加滚轮事件
mouseWheel.on(element, myWheel);
//删除滚轮事件
mouseWheel.un(element, myWheel);</pre>
</div>
<h3>鼠标滚轮事件的几个经典应用：</h3>
<ul>
<li>地图，比如Google Map，百度地图。</li>
<li>表单Spinner控件。</li>
<li>自定义滚动条。</li>
<li>控制字体大小。</li>
<li>其他，有待同学们自己发现，创新和应用。</li>
</ul>
<h3>相关资源：</h3>
<p>http://www.adomas.org/javascript-mouse-wheel/</p>
<p class="copy-note"><strong>转载声明：</strong>原创文章，转载必须以链接形式注明原文作者和原文地址，谢谢合作。<br />
<strong>原文地址：</strong><a title="跨浏览器鼠标滚轮事件及测试用例|Doomin|Joy-Studio" href="http://www.joy-studio.com/frontend-develop/cross-browser-mousewheel-and-demo.html">http://www.joy-studio.com/frontend-develop/cross-browser-mousewheel-and-demo.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.joy-studio.com/frontend-develop/cross-browser-mousewheel-and-demo.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript中的类数组还有哪些？</title>
		<link>http://www.joy-studio.com/frontend-develop/javascript-array-like-object-collection.html</link>
		<comments>http://www.joy-studio.com/frontend-develop/javascript-array-like-object-collection.html#comments</comments>
		<pubDate>Fri, 17 Jun 2011 00:00:19 +0000</pubDate>
		<dc:creator>Doomin</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.joy-studio.com/?p=207</guid>
		<description><![CDATA[1. 元素集合 Javascript Code var elements = document.getElementsByTagName('div'); console.log( toString.call(elements ) ); //[object HTMLCollection] 2. 函数内部arguments对象 Javascript Code (function(){ var args = arguments; console.log( toString.call(args) ); //[object Arguments] })(); 3. DOM元素attributes值 Javascript Code var attrs = document.getElementById('your-id').attributes; console.log( toString.call(attrs) ); &#8230; <a href="http://www.joy-studio.com/frontend-develop/javascript-array-like-object-collection.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h3>1. 元素集合</h3>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">
var elements = document.getElementsByTagName('div');
console.log( toString.call(elements ) ); //[object HTMLCollection]
</pre>
</div>
<h3>2. 函数内部arguments对象</h3>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">
(function(){
    var args = arguments;
    console.log( toString.call(args) ); //[object Arguments]
})();
</pre>
</div>
<p><span id="more-207"></span></p>
<h3>3. DOM元素attributes值</h3>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">
var attrs = document.getElementById('your-id').attributes;
console.log( toString.call(attrs) ); //[object NamedNodeMap]
</pre>
</div>
<h3>4. DOM元素<a href="https://developer.mozilla.org/en/DOM/element.classList" target="_blank">classList</a>值(FF 3.6+, Chrome 8+)</h3>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">
var cls = document.body.classList;
console.log( toString.call(cls) ); //[object DOMTokenList]
</pre>
</div>
<p>如果哪位同学知道还有其他的情况，请留言。我会及时更新。</p>
<p class="copy-note"><strong>转载声明：</strong>原创文章，转载必须以链接形式注明原文作者和原文地址，谢谢合作。<br /><strong>原文地址：</strong><a href="http://www.joy-studio.com/frontend-develop/javascript-array-like-object-collection.html" title="javascript中的类数组还有哪些？|Doomin|Joy-Studio">http://www.joy-studio.com/frontend-develop/javascript-array-like-object-collection.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.joy-studio.com/frontend-develop/javascript-array-like-object-collection.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>javascript如何判断浏览器是否支持指定的css规则</title>
		<link>http://www.joy-studio.com/frontend-develop/whether-the-browser-to-support-a-css-rules.html</link>
		<comments>http://www.joy-studio.com/frontend-develop/whether-the-browser-to-support-a-css-rules.html#comments</comments>
		<pubDate>Sat, 14 May 2011 06:22:30 +0000</pubDate>
		<dc:creator>Doomin</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.joy-studio.com/?p=186</guid>
		<description><![CDATA[CSS3来袭，很多新的样式规则的确很实用，比如boxsizing，transform等。但目前各种浏览器厂商对其支持程度不同或者根本不支持，那么如何判断用户的浏览器是否支持某种css规则，真的很简单！使用document.documentElement.style，只需要一个 in 操作即可！比如下面代码检查浏览器是否支持w3c标准的transform规则。 Javascript Code console.log('transform' in document.documentElement.style) 如果在控制台中运行上面的代码，那么目前几乎所有的浏览器都打印的结果都是false，这当然不是真实情况。因为在一个css规则正式成为w3c草案之前，如果该浏览器支持该规则，则会在该规则前面加入表示该厂商浏览器的&#8221;前缀标识&#8221;，比如：&#8221;-moz-&#8221;(Firefox), &#8220;-webkit-&#8221;(Chrome, Safari)，&#8221;-o-&#8221;(Opera)， &#8220;-ms-&#8221;(IE)，所以，无论是在写css，还是写javascript，都要考虑到这一点差异，才能让代码正确的工作。 另外，还有一点要特别注意的是，如果一个css规则存在&#8221;前缀标识&#8221;，则该规则在javascript中的写法是不同的： Firefox：Moz + 词法意义上首字母大写的原规则。（看下面的demo比较直接，要特别注意带标识的boxsizing写法。 Opera：O + 词法意义上首字母大写的原规则。如：OBoxSizing Chrome/Safari：webkit + 词法意义上首字母大写的原规则。如：webkitBoxSizing 用Firefox来举例，代码如下 Javascript Code //原transform规则, 全部小写 console.log('transform' in document.documentElement.style); //false in Firefox 4.0.1 //带前缀标识的transform规则正确写法 'M'和'T'大写 console.log('MozTransform' in document.documentElement.style); //true &#8230; <a href="http://www.joy-studio.com/frontend-develop/whether-the-browser-to-support-a-css-rules.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>CSS3来袭，很多新的样式规则的确很实用，比如boxsizing，transform等。但目前各种浏览器厂商对其支持程度不同或者根本不支持，那么如何判断用户的浏览器是否支持某种css规则，真的很简单！使用document.documentElement.style，只需要一个 in 操作即可！比如下面代码检查浏览器是否支持w3c标准的transform规则。</p>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">
console.log('transform' in document.documentElement.style)
</pre>
</div>
<p>如果在控制台中运行上面的代码，那么目前几乎所有的浏览器都打印的结果都是false，这当然不是真实情况。因为在一个css规则正式成为w3c草案之前，如果该浏览器支持该规则，则会在该规则前面加入表示该厂商浏览器的&#8221;前缀标识&#8221;，比如：&#8221;-moz-&#8221;(Firefox), &#8220;-webkit-&#8221;(Chrome, Safari)，&#8221;-o-&#8221;(Opera)， &#8220;-ms-&#8221;(IE)，所以，无论是在写css，还是写javascript，都要考虑到这一点差异，才能让代码正确的工作。</p>
<p><span id="more-186"></span></p>
<p>另外，还有一点要特别注意的是，如果一个css规则存在&#8221;前缀标识&#8221;，则该规则在javascript中的写法是不同的：</p>
<ul>
<li>Firefox：Moz + 词法意义上首字母大写的原规则。（看下面的demo比较直接，要特别注意带标识的boxsizing写法。</li>
<li>Opera：O + 词法意义上首字母大写的原规则。如：OBoxSizing</li>
<li>Chrome/Safari：webkit + 词法意义上首字母大写的原规则。如：webkitBoxSizing</li>
</ul>
<h3>用Firefox来举例，代码如下</h3>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">
//原transform规则, 全部小写
console.log('transform' in document.documentElement.style); //false in Firefox 4.0.1
//带前缀标识的transform规则正确写法 'M'和'T'大写
console.log('MozTransform' in document.documentElement.style); //true in Firefox 4.0.1
//原boxsizing规则, 全部小写
console.log('boxsizing' in document.documentElement.style);  //false in Firefox 4.0.1
//带前缀标识的boxsizing规则正确写法 'M', 'B'和'S'大写
console.log('MozBoxSizing' in document.documentElement.style); //true in Firefox 4.0.1
</pre>
</div>
<p>欢迎各位前端同僚指出文中错误或补充更多细节，大家共同进步！</p>
<p class="copy-note">
<strong>转载声明：</strong>原创文章，转载必须以链接形式注明原文作者和原文地址，谢谢合作。<br />
<strong>原文地址：</strong><a href="http://www.joy-studio.com/frontend-develop/rewrite-javascript-domready-function.html" title="javascript如何判断浏览器是否支持指定的css规则|Doomin|Joy-Studio">http://www.joy-studio.com/frontend-develop/whether-the-browser-to-support-a-css-rules.html</a><br />
<strong>地址拷贝：</strong>&lt;a href=&#8221;http://www.joy-studio.com/frontend-develop/whether-the-browser-to-support-a-css-rules.html&#8221;&gt;javascript如何判断浏览器是否支持指定的css规则|Doomin|Joy-Studio&lt;/a&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joy-studio.com/frontend-develop/whether-the-browser-to-support-a-css-rules.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一段巧妙的判断IE浏览器版本的js代码</title>
		<link>http://www.joy-studio.com/frontend-develop/a-short-snippet-for-detecting-versions-of-ie-in-javascript.html</link>
		<comments>http://www.joy-studio.com/frontend-develop/a-short-snippet-for-detecting-versions-of-ie-in-javascript.html#comments</comments>
		<pubDate>Wed, 06 Apr 2011 02:18:44 +0000</pubDate>
		<dc:creator>Doomin</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.joy-studio.com/?p=161</guid>
		<description><![CDATA[下面这段代码使用IE可以识别html注释的特性，可以准确的判断IE浏览器的版本号，没有使用诸多怪异的测力检测方法，超级简洁。 原作者的代码地址在这里，我做了一点小改动，文中有注释，可以到这里运行测试。 Javascript Code /** * ie equals one of false&#124;6&#124;7&#124;8&#124;9 values, ie5 is fucked down. * Based on the method: https://gist.github.com/527683 */ var ie = function () { var v = 4, //原作者的此处代码是3，考虑了IE5的情况，我改为4。 div = document.createElement('div'), i = div.getElementsByTagName('i'); &#8230; <a href="http://www.joy-studio.com/frontend-develop/a-short-snippet-for-detecting-versions-of-ie-in-javascript.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>下面这段代码使用IE可以识别html注释的特性，可以准确的判断IE浏览器的版本号，没有使用诸多怪异的测力检测方法，超级简洁。<br />
原作者的代码地址在<a href="https://gist.github.com/527683">这里</a>，我做了一点小改动，文中有注释，可以到<a href="http://jsfiddle.net/Doomin/df8Hw/" target="_blank">这里</a>运行测试。</p>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">/**
 * ie equals one of false|6|7|8|9 values, ie5 is fucked down.
 * Based on the method: https://gist.github.com/527683
 */
var ie = function () {
    var v = 4, //原作者的此处代码是3，考虑了IE5的情况，我改为4。
        div = document.createElement('div'),
        i = div.getElementsByTagName('i');
    do {
        div.innerHTML = '&lt;!--[if gt IE ' + (++v) + ']&gt;&lt;i&gt;&lt;/i&gt;&lt;![endif]--&gt;';
    } while (i[0]);
    return v &gt; 5 ? v : false; //如果不是IE，之前返回undefined，现改为返回false。
}();</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.joy-studio.com/frontend-develop/a-short-snippet-for-detecting-versions-of-ie-in-javascript.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>此地无银(代码篇)-长期记录前端开发的小细节</title>
		<link>http://www.joy-studio.com/frontend-develop/no-money-here-but-coding.html</link>
		<comments>http://www.joy-studio.com/frontend-develop/no-money-here-but-coding.html#comments</comments>
		<pubDate>Wed, 23 Mar 2011 16:04:01 +0000</pubDate>
		<dc:creator>Doomin</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.joy-studio.com/?p=127</guid>
		<description><![CDATA[前言，同事川川是个特别喜欢总结的人，他每天都把工作中遇到的问题、解决方案、小技巧或是突然的一个想法，都随时地记录到自己的博客中，这还不是重点，重点是他记录总结的方式：写自己的总结，让别人迷糊去吧。因为他写博客从来不考虑措词，从来不考虑样式，只记录重点内容，只管自己能读懂就行。其实这样有个最大的好处，就是及时。不至于下班以后或几天以后把想总结什么都忘了，到头来，工作中的意外灵感和猫腻技巧一个也没留下来，真成了浮云。我要向川川学习，随时总结，将在这里长期记录前端工作中的小细节。 • 由js动态创建的iframe在被插入到页面之前，它的window对象是不存在的。@2011.03.23 示例代码：在父页面中调用js创建并插入一个iframe元素，这个iframe的src指向一个同域下的空白页面，并在此iframe中插入一个p元素。 Javascript Code //创建一个iframe， var iframe = document.createElement('iframe'); //设定iframe的地址，注意，应该是同源的！ iframe.setAttribute('src', 'your-test-iframe.html'); //将插入到iframe的body中的测试元素 var p = document.createElement('p').appendChild(document.createTextNode('这里是由父页面插入的文字')); //插入页面的操作一定要先执行，否则iframe的window对象无法获取，即下面代码中iframe.contentWindow值为null document.body.appendChild(iframe); //在iframe加载完成时插入测试元素 iframe.contentWindow.onload = function(){ iframe.contentWindow.document.body.appendChild(p); }; • 将函数的arguments对象转为数组。@2011.03.24 Javascript Code function fnName(){ var arr = Array.prototype.slice.call(arguments); //do something... } &#8230; <a href="http://www.joy-studio.com/frontend-develop/no-money-here-but-coding.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>前言，同事<a href="http://hi.baidu.com/fc_lamp" target="_blank">川川</a>是个特别喜欢总结的人，他每天都把工作中遇到的问题、解决方案、小技巧或是突然的一个想法，都随时地记录到自己的博客中，这还不是重点，重点是他记录总结的方式：写自己的总结，让别人迷糊去吧。因为他写博客从来不考虑措词，从来不考虑样式，只记录重点内容，只管自己能读懂就行。其实这样有个最大的好处，就是及时。不至于下班以后或几天以后把想总结什么都忘了，到头来，工作中的意外灵感和猫腻技巧一个也没留下来，真成了浮云。我要向川川学习，随时总结，将在这里长期记录前端工作中的小细节。</p>
<p><span id="more-127"></span></p>
<h3>• 由js动态创建的iframe在被插入到页面之前，它的window对象是不存在的。@2011.03.23</h3>
<p><strong>示例代码：</strong>在父页面中调用js创建并插入一个iframe元素，这个iframe的src指向一个同域下的空白页面，并在此iframe中插入一个p元素。</p>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">//创建一个iframe，
var iframe = document.createElement('iframe');
//设定iframe的地址，注意，应该是同源的！
iframe.setAttribute('src', 'your-test-iframe.html');

//将插入到iframe的body中的测试元素
var p = document.createElement('p').appendChild(document.createTextNode('这里是由父页面插入的文字'));

//插入页面的操作一定要先执行，否则iframe的window对象无法获取，即下面代码中iframe.contentWindow值为null <span class="sh_wow"> </span>
document.body.appendChild(iframe);

//在iframe加载完成时插入测试元素
iframe.contentWindow.onload = function(){
    iframe.contentWindow.document.body.appendChild(p);
};</pre>
</div>
<h3>• 将函数的arguments对象转为数组。@2011.03.24</h3>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">function fnName(){
    var arr = Array.prototype.slice.call(arguments); <span class="sh_wow"> </span>
    //do something...
}</pre>
</div>
<h3>• 禁止移动端设备将数字文本格式化。@2011.03.24</h3>
<p>默认情况下，移动端会把所有数字当做手机号，并加上蓝色样式，但实际上页面中的很多数字并不是手机号，比如产品售价，邮政编码，合同编号等。所以应该关闭移动端的这个默认行为。插入下面一行meta标签即可。</p>
<div class="pre-holder">
<h6>HTML Code</h6>
<pre class="sh_html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
  &lt;meta name="format-detection" content="telephone=no"&gt; <span class="sh_wow"> </span>
...</pre>
</div>
<h3>• Google使用的等宽英文字体。@2011.04.03</h3>
<p>常用于pre，code等标签的等宽英文字体，美观又便于阅读。鬼才能记住呢，需要的时候直接考。配置IDE字体时也可以参考。</p>
<div class="pre-holder">
<h6>CSS Code</h6>
<pre class="sh_css">font-family:Monaco,'DejaVu Sans Mono','Bitstream Vera Sans Mono','Lucida Console',monospace;</pre>
</div>
<h3>• 不要试图对file域进行克隆操作。@2011.05.03 @Rosy</h3>
<p>在对file域进行克隆操作时，在IE下和较新版的标准浏览器中，value值都不会被克隆，而且在opera中甚至会报错。可以到<a href="http://jsfiddle.net/Doomin/XnxU2/" target="_blank">这里</a>运行测试代码。</p>
<h3>• 获取表单域的可用状态和只读状态，不要使用getAttribute方法。@2011.05.03 @Rosy Project</h3>
<p>在表单域的标签中，只要出现disabled属性，该表单域就是不可用的，即使设置了false值，它也是不可用状态。所以，获取表单域真实的可用状态，应该使用该node节点的disabled属性，而不是通过getAttribute(&#8216;disabled&#8217;)方法。避免不正确的标签写法导致javascript的误判断。<br />
同理，标签中只要出现readonly属性，该域就是只读的。获取真实的只读状态，应该使用该node节点的readOnly(O要大写)属性。可以到<a href="http://jsfiddle.net/Doomin/96TAQ/" target="_blank">这里</a>运行测试代码。</p>
<div class="pre-holder">
<h6>HTML Code</h6>
<pre class="sh_html">
&lt;input id="test-1" name="name" type="text" disabled /&gt;&lt;!--不可用状态--&gt;
&lt;input id="test-2" name="name" type="text" disabled="false" /&gt;&lt;!--错误的标签写法，仍然是不可用状态--&gt;
&lt;input id="test-3" name="name" type="text" disabled="" /&gt;&lt;!--错误的标签写法，仍然是不可用状态--&gt;
</pre>
</div>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">
//对上面第二个text域使用getAttribute方法，得到字符串 'false' 虽然转为布尔值后是true 但使用起来令人费解
document.getElementById('test-2').getAttribute('disabled') //'false'
//针对上面的第三个text域使用getAttribute方法，得到空字符串 转为布尔值后是false 但真实的状态应该是true
document.getElementById('test-3').getAttribute('disabled') //''

/*
 * 结论，如果使用getAttribute方法，则错误的标签写法可能直接导致javascript的判断错误，
 * 而使用disabled/readOnly属性则永远得到正确的结果。<span class="sh_wow"></span>
 */
</pre>
</div>
<h3>• 操作元素样式的float属性时, 推荐cssFloat的写法, 既是标准, 又是好习惯。@2011.07.03 @Rosy</h3>
<p>虽然大多类库在方法内部都已作兼容化处理，既可以使用float，也可以使用cssFloat，但还是建议使用cssFloat(标准)，以简化类库内部的fixed过程。另外，绝对不要使用styleFloat，IE678专用！</p>
<h3>• 主动为样式的长度值加入单位标记，让代码更加明确和严谨。@2011.07.03 @Rosy</h3>
<p>当动态设置的样式需要传入长度值时，如果没有设置单位，IE678回默认加入像素单位px而执行设置，而IE9和其他标准浏览器则会忽略该次设置。如果加入单位标记，则所有浏览器都会执行设置。</p>
<p>注意，jQeruy的css方法不设置单位标记也有效，是因为其内部有fixed过程，但这样容易给使用者养成不好的，不严谨的习惯，所以不管怎样， 主动地为样式的长度值加入单位标记都是一个好习惯，让代码更明确和严谨。</p>
<p>相比之下，Rosy没有妥协，以setStyle方法举例说明如下：</p>
<div class="pre-holder">
<h6>Javascript Code</h6>
<pre class="sh_javascript">
//缺少单位标记的样式值
R.setStyle(el, top, 100); //w3c浏览器无效, 只有ie678(默认加入'px')有效
R.setStyle(el, top, '100'); //w3c浏览器无效, 只有ie678(默认加入'px')有效
//有单位标记的样式值
R.setStyle(el, top, '100px'); //所以浏览器都有效
</pre>
</div>
<h3>• 设置无效的样式值，浏览器默认行为不同。@2011.07.03 @Rosy</h3>
<p>w3c浏览器直接忽略该次设置，在IE678中, 将报参数无效错误。</p>
<h3>• 随时继续&#8230;</h3>
<p class="copy-note"><strong>转载声明：</strong>原创文章，转载必须以链接形式注明原文作者和原文地址，谢谢合作。<br /><strong>原文地址：</strong><a href="http://www.joy-studio.com/frontend-develop/no-money-here-but-coding.html" title="此地无银(代码篇)-长期记录前端开发的小细节|Doomin|Joy-Studio">http://www.joy-studio.com/frontend-develop/no-money-here-but-coding.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.joy-studio.com/frontend-develop/no-money-here-but-coding.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>我上海的室友们</title>
		<link>http://www.joy-studio.com/life/my-friends-in-shanghai.html</link>
		<comments>http://www.joy-studio.com/life/my-friends-in-shanghai.html#comments</comments>
		<pubDate>Sat, 12 Mar 2011 04:21:48 +0000</pubDate>
		<dc:creator>Doomin</dc:creator>
				<category><![CDATA[生·活]]></category>
		<category><![CDATA[friends]]></category>
		<category><![CDATA[life]]></category>

		<guid isPermaLink="false">http://www.joy-studio.com/?p=110</guid>
		<description><![CDATA[当年，2008年: 在上海时我们是住在一起的室友，在一个50平左右的两室一厅里，我们相识，成为朋友。 那段时间大家都在为梦想奋斗着，现在想起来真的很怀念！ 每天下班后大家一起买菜做饭，平时也搞过几次小活，但几本都没搞成，哈哈。 大杰，来自武汉，在日企上班，天天要挤公交车，会做很多菜，做鱼很拿手，郁闷时候喝点小酒，还失恋了不知道几次！ 小杰，89年的小孩，来自杭州，当时还蒙在php的鼓里，有js的问题总是缠我，很爱吃我做的番茄炒鸡蛋，偶尔会发泄一下小脾气！ 小强，来自长沙，每天往地上一坐就是几小时，便开始搞他的“我爱小语种”网站。有时候也装模作样的学一点点php。做的青椒回锅肉很好吃！ 我呢，来自本溪（辽宁的一个小山沟，不写的话谁都不知道本溪在哪），上班要换乘两段轻轨加走路30分钟，每天早上要从上海的东北角赶到西南角，下班后再原路返回，很多次在轻轨上困得睡了，直接坐到终点站。在同济大学做兼职的时候要早上5点钟起床，坐两个小时的公交车到才学校。 如今，2011年： 现在大家已经分开两年多了，每个人都有很大的变化。 大杰，2010年末跳槽到杭州淘宝公司做产品经理。N个站的站长，网站每天的访问量以万来记录。一天忙的不亦乐乎。代表作：万鱼网 小杰，现在就职于游外游公司做游戏开发，在实力型团队中享受着，进步着。每天的工作就是：玩游戏-找BUG-再玩游戏-再找BUG。把Python、Flex玩得团团转，前途一片光明。 小强，每天工作3小时，网站日访问量也是以万来记录，悠哉悠哉，收入不菲。代表作：我爱小语种 我呢，这两年最大的收获就是成功转型，从做设计改做前端。但恐怕是室友中发展得最慢的，目前在成都做着孤独的小前端，工作中不时的还得分心去搞搞设计。做梦都想有一天能够加入一个实力型团队，专专专专注于前端，与大家交流，共同进步。所以目前还是在充电阶段，被上面的室友远远抛在后面，正在向前追赶中。 室友们，加油啊！]]></description>
			<content:encoded><![CDATA[<p><strong>当年，2008年:</strong></p>
<p>在上海时我们是住在一起的室友，在一个50平左右的两室一厅里，我们相识，成为朋友。</p>
<p>那段时间大家都在为梦想奋斗着，现在想起来真的很怀念！</p>
<p>每天下班后大家一起买菜做饭，平时也搞过几次小活，但几本都没搞成，哈哈。</p>
<p><span id="more-110"></span></p>
<p><a href="http://www.wanyuwang.com/" target="_blank">大杰</a>，来自武汉，在日企上班，天天要挤公交车，会做很多菜，做鱼很拿手，郁闷时候喝点小酒，还失恋了不知道几次！</p>
<p><a href="http://www.sunlogs.com" target="_blank">小杰</a>，89年的小孩，来自杭州，当时还蒙在php的鼓里，有js的问题总是缠我，很爱吃我做的番茄炒鸡蛋，偶尔会发泄一下小脾气！</p>
<p><a href="http://52xyz.com/" target="_blank">小强</a>，来自长沙，每天往地上一坐就是几小时，便开始搞他的“我爱小语种”网站。有时候也装模作样的学一点点php。做的青椒回锅肉很好吃！</p>
<p><a href="http://joy-studio.com" target="_blank">我</a>呢，来自本溪（辽宁的一个小山沟，不写的话谁都不知道本溪在哪），上班要换乘两段轻轨加走路30分钟，每天早上要从上海的东北角赶到西南角，下班后再原路返回，很多次在轻轨上困得睡了，直接坐到终点站。在同济大学做兼职的时候要早上5点钟起床，坐两个小时的公交车到才学校。</p>
<p><strong>如今，2011年：</strong></p>
<p>现在大家已经分开两年多了，每个人都有很大的变化。</p>
<p>大杰，2010年末跳槽到杭州<a href="http://taobao.com" target="_blank">淘宝</a>公司做产品经理。N个站的站长，网站每天的访问量以万来记录。一天忙的不亦乐乎。代表作：<a href="http://www.wanyuwang.com" target="_blank">万鱼网</a></p>
<p>小杰，现在就职于<a href="http://www.5zhan.com/index.php" target="_blank">游外游</a>公司做游戏开发，在实力型团队中享受着，进步着。每天的工作就是：玩游戏-找BUG-再玩游戏-再找BUG。把Python、Flex玩得团团转，前途一片光明。</p>
<p>小强，每天工作3小时，网站日访问量也是以万来记录，悠哉悠哉，收入不菲。代表作：<a href="http://www.wanyuwang.com" target="_blank">我爱小语种</a></p>
<p>我呢，这两年最大的收获就是成功转型，从做设计改做前端。但恐怕是室友中发展得最慢的，目前在成都做着孤独的小前端，工作中不时的还得分心去搞搞设计。做梦都想有一天能够加入一个实力型团队，专专专专注于前端，与大家交流，共同进步。所以目前还是在充电阶段，被上面的室友远远抛在后面，正在向前追赶中。</p>
<p>室友们，加油啊！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joy-studio.com/life/my-friends-in-shanghai.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>使用javascript的onbeforeunload事件</title>
		<link>http://www.joy-studio.com/frontend-develop/how-to-use-javascript-onbeforeunload-event.html</link>
		<comments>http://www.joy-studio.com/frontend-develop/how-to-use-javascript-onbeforeunload-event.html#comments</comments>
		<pubDate>Wed, 09 Mar 2011 14:21:26 +0000</pubDate>
		<dc:creator>Doomin</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://www.joy-studio.com/?p=91</guid>
		<description><![CDATA[今天项目中用到了onbeforeunload事件，做个笔记。 onbeforeunload事件会在onunload事件之前触发，它在用户离开页面之前弹出一个确认框，问用户是否要真正的离开本页面。如果用户点击了“确认”按钮，页面将会跳转或刷新。如果点击了“取消”，用户会停留在当前页面，onunload事件不会被触发。假设页面中有一个表单，用户填写了数据但却没有保存提交，他直接点击了刷新按钮，这时候就可以使用onbeforeunload事件来提示用户“数据没有保存”，这样就给哪些忘记提交或不小心点击到页面其他链接的用户一个取消的机会。 如果只想弹出确认框询问用户是否要离开，则只需在onbeforeunload的回调函数返回空字符串即可。代码如下： Javascript window.onbeforeunload = function(){ return ''; }//有些资料中只写的return; 但在我的浏览器上根本没有弹出。 但如果没有有价值的提示的信息，像上面的代码那样，最好还是不要弹出确认框，以免给用户带来反感。大多数使用onbeforeunload事件的情况，都会提供给用户有价值的提示，比如使用wordpress后台修改文章，如果没有保存表单而直接点击了刷新，就会弹出如下图中的提示。 想在确认对话框中加入自定义的信息，实现起来也很简单，在回调函数中返回要插入的字符串即可。如果想插入多行提示，则使用&#8217;\n&#8217;换行。 Javascript window.onbeforeunload = function(){ return '提示信息';} 上面的代码在每次跳转或刷新页面都要弹出，这当然不是想要的结果。理想的情况是只有符合假设条件（比如表单没有保存）时才弹出确认，否则用户可以不必确认而直接跳转页面。所以应该在代码里加入触发条件，比如，假设页面中有正在等待的ajax提交（以变量busy为true表示），则提示用户“信息正在处理中&#8230;”。 Javascript window.onbeforeunload = function(){ if(busy){ return '信息正在处理中...'; } } 注意，如果onbeforeunload事件的回调函数没有使用return语句返回，则确认框不会弹出，所以上面的代码中当busy为false时，不会进行确认。 嗯，今天的笔记就写到这里。 转载声明：原创文章，转载必须以链接形式注明原文作者和原文地址，谢谢合作。原文地址：http://www.joy-studio.com/frontend-develop/how-to-use-javascript-onbeforeunload-event.html地址拷贝：&#60;a href=&#8221;http://www.joy-studio.com/frontend-develop/how-to-use-javascript-onbeforeunload-event.html&#8221;&#62;使用javascript的onbeforeunload事件&#124;Doomin&#124;Joy-Studio&#60;/a&#62;]]></description>
			<content:encoded><![CDATA[<p>今天项目中用到了onbeforeunload事件，做个笔记。</p>
<p>onbeforeunload事件会在onunload事件之前触发，它在用户离开页面之前弹出一个确认框，问用户是否要真正的离开本页面。如果用户点击了“确认”按钮，页面将会跳转或刷新。如果点击了“取消”，用户会停留在当前页面，onunload事件不会被触发。假设页面中有一个表单，用户填写了数据但却没有保存提交，他直接点击了刷新按钮，这时候就可以使用onbeforeunload事件来提示用户“数据没有保存”，这样就给哪些忘记提交或不小心点击到页面其他链接的用户一个取消的机会。</p>
<p><span id="more-91"></span></p>
<p>如果只想弹出确认框询问用户是否要离开，则只需在onbeforeunload的回调函数返回空字符串即可。代码如下：</p>
<div class="pre-holder">
<h6>Javascript</h6>
<pre class="sh_javascript">
window.onbeforeunload = function(){ return ''; }//有些资料中只写的return; 但在我的浏览器上根本没有弹出。
</pre>
</div>
<p>但如果没有有价值的提示的信息，像上面的代码那样，最好还是不要弹出确认框，以免给用户带来反感。大多数使用onbeforeunload事件的情况，都会提供给用户有价值的提示，比如使用wordpress后台修改文章，如果没有保存表单而直接点击了刷新，就会弹出如下图中的提示。</p>
<p><img class="post-img" src="http://www.joy-studio.com/wp-content/uploads/2011/03/onbeforeunload-in-wordpress.png" alt="onbeforeunload-in-wordpress" /></p>
<p>想在确认对话框中加入自定义的信息，实现起来也很简单，在回调函数中返回要插入的字符串即可。如果想插入多行提示，则使用&#8217;\n&#8217;换行。</p>
<div class="pre-holder">
<h6>Javascript</h6>
<pre class="sh_javascript">
window.onbeforeunload = function(){ return '提示信息';}
</pre>
</div>
<p>上面的代码在每次跳转或刷新页面都要弹出，这当然不是想要的结果。理想的情况是只有符合假设条件（比如表单没有保存）时才弹出确认，否则用户可以不必确认而直接跳转页面。所以应该在代码里加入触发条件，比如，假设页面中有正在等待的ajax提交（以变量busy为true表示），则提示用户“信息正在处理中&#8230;”。</p>
<div class="pre-holder">
<h6>Javascript</h6>
<pre class="sh_javascript">
window.onbeforeunload = function(){
    if(busy){
        return '信息正在处理中...';
    }
}
</pre>
</div>
<p>注意，如果onbeforeunload事件的回调函数没有使用return语句返回，则确认框不会弹出，所以上面的代码中当busy为false时，不会进行确认。</p>
<p>嗯，今天的笔记就写到这里。</p>
<p class="copy-note"><strong>转载声明：</strong>原创文章，转载必须以链接形式注明原文作者和原文地址，谢谢合作。<br /><strong>原文地址：</strong><a href="http://www.joy-studio.com/frontend-develop/how-to-use-javascript-onbeforeunload-event.html" title="使用javascript的onbeforeunload事件|Doomin|Joy-Studio">http://www.joy-studio.com/frontend-develop/how-to-use-javascript-onbeforeunload-event.html</a><br /><strong>地址拷贝：</strong>&lt;a href=&#8221;http://www.joy-studio.com/frontend-develop/how-to-use-javascript-onbeforeunload-event.html&#8221;&gt;使用javascript的onbeforeunload事件|Doomin|Joy-Studio&lt;/a&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.joy-studio.com/frontend-develop/how-to-use-javascript-onbeforeunload-event.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

