浅谈 Mousewheel 事件

当需要制作转动鼠标滚轮放大页面字体这样的交互效果时,会用到 Mousewheel 事件。其实在大多数浏览器(IE6, IE7, IE8, Opera 10+, Safari 5+)中,都提供了 “mousewheel” 事件。但杯具的是 Firefox 3.5+ 却不支持此事件,不过庆幸 Firefox 3.5+ 中提供了另外一个等同的事件:”DOMMouseScroll” (事件和事件属性的测试案例)。 OK,我们现在已经知道了不同浏览器之间实现的差别,兼容代码如下: var addEvent = (function(){ if (window.addEventListener) { return function(el, sType, fn, capture) { el.addEventListener(sType, fn, (capture)); }; } else if (window.attachEvent) { return function(el, sType, fn, capture) { el.attachEvent(“on” + sType, fn); }; } else { [...]

... 7 条评论 »

在线 Base64 编/解码小工具

抽时间做了一个简单的基于 JavaScript 的在线 Base64 编/解码小工具: http://www.planabc.net/lab/tools/base64.html 原理详见上篇文章:《JavaScript 中的 Base64 编码(一):Encoding 》 注:对于下面的代码: TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4= 各浏览器原生的解码方法处理不太一致,Opera 比较智能能够处理此情形,但 Firefox、Safari 和 Chrome 却无法处理。 出现上面代码的原因为:规则约定 Base64 编码过程每76个字符加一个换行符。 Firefox、Safari 和 Chrome 下的修复非常简单(对输入的字符去除换行符等): text = text.replace(/\s*/g, ”... 2 条评论 »

JavaScript 中的 Base64 编码(一):Encoding

除了IE浏览器,其他所有主流的浏览器均支持原生的 Base64 编码: btoa(text) – base64 encodes text. atob(text) – base64 decodes text. 而对于 IE 我们可以根据已知的 Base64 编码原理进行编写: Base64 编码将每三个 8Bit 的字节(注:由于要求输入的字符为 8Bit 字节,故范围应该在 ASCII 字符范围内,即:\u0000-\u00ff)转换为四个 6Bit 的字节(3*8 = 4*6 = 24),然后在每个 6Bit 字节前添两位高位 0,组成四个 8Bit 的字节,最后再将每个 8Bit 字节转换成十进制的数字,对应 Base64 编码表(为了保证所输出的编码为可读字符,Base64制定了一个编码表,以便进行统一转换,编码表的大小为 2^6=64,即 Base64 名称的由来)输出编码后的字符。 如果原字节不足 3 的倍数,则用 0 填充,输出字符使用“=”,因此编码后输出的文本末尾可能会出现 1 或 2 个“=”(余数 = 原文字节数 ... 4 条评论 »

用 JavaScript 解数学题

题目:一个六位数,分别用2,3,4,5,6乘它,得到的五个新数仍是由原数中的六个数字组成,只是位置不同,则此六位数是多少? function evaluate() { var multiplier = [2,3,4,5,6], sortNumber = function (number) { return parseInt((number + ”).split(”).sort().join(”), 10); }, gameOver = false, // 判断是否已经找到,如果找到,结束循环 determine = function(origin) { var result, i, len = multiplier.length; for( i = 0; i < len; i++ ) { result = origin * multiplier[i]; if (result < 100000 || result [...]

... 21 条评论 »

与 Function 和 Object 相关的有趣代码

代码片段一: alert(Function instanceof Object); // true alert(Object instanceof Function); // true Function 是 Object 的实例,Object 也是 Function 的实例,好“纠缠”的关系。 代码片段一: alert(Object.forEach); // undefined Function.prototype.forEach = function(object, block, context) { for (var key in object) { if (typeof this.prototype[key] == “undefined”) { block.call(context, object[key], key, object); } } }; alert(Object.forEach); alert(Function.forEach); alert(Object.forEach === Function.forEach); // true 给 [...]

... 10 条评论 »

学习 YUI3 中的沙箱机制

简化了一下 YUI3 中的沙箱实现 方式: if (typeof Sandbox === ‘undefined’ || !Sandbox) { Sandbox = function(o) { var self = this; if (!(self instanceof Sandbox)) { // 允许没有 new 操作符的实例化 return new Sandbox(o); } else { self._init(); self._config(o); // 预加载某些指定模块 /* self._setup(); */ // 返回实例本身,支持链式模式 return self; } }; } // Sandbox的(类)静态属性 Sandbox.Env = { /* [...]

... 6 条评论 »

前端 JavaScript 相关的小Tips

受 SNS 后台开发同学的邀请,做的一次小分享,希望够简单、明了、有效。其实在给别人分享的同时,自己也能收获很多!

... 23 条评论 »

如何获取当前 select 元素的值

如果 select 元素下的所有 option 元素均没有指定 selected 属性,会默认选中第一个。 可以通过 select.selectedIndex 获取到选中的 option 元素的索引。 可以通过 select.options[select.selectedIndex] 获取到选中的 option 元素。 option 元素 <option selected=”selected” value=”value3″>text3</option>,可以通过 option.value 获得 option 元素的 value 属性值,即 value3;可以通过 option.text 获得 option 元素内的文本,即 text3。 如果 option 元素没有定义 value 属性,则 IE 中 option.value 无法获得,但 Safari、Opera、FireFox 依旧可以通过 option.value 获得,值同于 option.text 。 可以通过 option.attributes.value && option.attributes.value.specified 来判断 option [...]

... 12 条评论 »

如何在事件代理中正确使用 focus 和 blur 事件

什么是事件代理(Event Delegation)? 如果不太了解的朋友,可详细阅读:《Event delegation in JavaScript》,这里不再累述。 首先让我们一起来回顾一些常识: 通常支持事件冒泡(Event Bubbling)的事件类型为鼠标事件和键盘事件,例如:mouseover, mouseout, click, keydown, keypress。 接口事件则通常不支持事件冒泡(Event Bubbling),例如:load, change, submit, focus, blur。 很明显:focus 和 blur 都属于不支持冒泡的接口事件。既然都不支持冒泡,那又如何实现事件代理呢? 可以换个角度,逆向思维,尝试事件捕获(Event Capturing,除了IE,现在流行的标准浏览器均支持)。 测试后会发现,如果你捕获 focus 或 blur 事件,目标元素的祖先元素均执行事件函数。至于为什么?或许是实现的一个 BUG。 el.addEventListener(‘focus’, focusHandler, true); el.addEventListener(‘blur’, blur... 17 条评论 »

修复 jQuery 中 isFunction 方法的 BUG

jQuery 1.4 源码 449 行(core.js 431 行),判断是否为函数的方法如下(思路来源于 Douglas Crockford 的《The Miller Device》): isFunction: function( obj ) { return toString.call(obj) === “[object Function]“; }, 同时 jQuery 的作者也作了部分注释: See test/unit/core.js for details concerning isFunction. Since version 1.3, DOM methods and functions like alert aren’t supported. They return false on IE (#2968). 即:此方法在 IE 下无法正确识别 DOM 方法和一些函数(例如 alert [...]

... 12 条评论 »