相关标签

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 条评论 »

前端 JavaScript 相关的小Tips

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

... 25 条评论 »

如何获取当前 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 条评论 »

判断 iframe 是否加载完成的完美方法

一般来说,我们判断 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 { iframe.onreadystatechange = function(){ if (iframe.readyState == “complete”){ alert(“Local iframe is now loaded.”); } }; } document.body.appendChild(iframe); 最近, Nicholas C. Zakas 文章《Iframes, onload, and [...]

... 29 条评论 »

YUI Compressor 组件压缩 JavaScript 的一些原理

YUI Compressor 压缩 JavaScript 的内容包括: 移除注释 移除额外的空格 细微优化 标识符替换(Identifier Replacement) YUI Compressor 包括哪些细微优化呢? object["property"] ,如果属性名是合法的 JavaScript 标识符(注:合法的 JavaScript 标识符——由一个字母开头,其后选择性地加上一个或者多个字母、数字或下划线)且不是保留字,将优化为: object.property {“property”:123} ,如果属性名是合法的 JavaScript 标识符且不是保留字,将优化为 {property:123} (注:在对象字面量中,如果属性名是一个合法的 JavaScript 标识符且不是保留字,并不强制要求用引号引住属性名)。 ‘abcd\’efgh’,将优化为 “abcd’efgh”。 “abcd” + “efgh”,如果是字符串相连接,将优化成 “abcdefgh”(注:所有在使用 YUI Compressor 的前提下,对于脚本中... 7 条评论 »

JavaScript 获取事件对象的一个注意点

平时我们获取事件对象一般写法如下: function getEvent(event) { return event || window.event // IE:window.event } 如果没有参数,也可写成(非IE :事件对象会自动传递给对应的事件处理函数,且为第一个参数): function getEvent() { return arguments[0] || window.event // IE:window.event } 这样的写法在除 Firefox(测试版本:3.0.12,下同) 外的浏览器上运行都不会有问题,但 Firefox 为什么例外呢?让我们这样一种情形: <button id=”btn” onclick=”foo()”>按钮</button> <script> function foo(){ var e = getEvent(); alert(e); } </script> 运行结果在 Firefox 中是 undefined,为什么呢? 在 Firefox 中调用其实是这样的,先调用执行的是: function onclick(event) { foo(); } 然后调用执行的是: function [...]

... 19 条评论 »

JavaScript 实现 Konami Code

在 Facebook 上有一个彩蛋: 登录 facebook.com ,点击你首页的任何地方,键盘输入 Up, Up, Down, Down, Left, Right, Left, Right, B, A, Enter 后,再点击页面或滚动一下滚动条,你会发现特殊的变化(如下图),嘿嘿 ^^ 玩过“魂斗罗”的朋友,肯定一眼就能看出输入的字符原来就是“魂斗罗”中的“秘技”。其实“秘技”的术语叫 Konami Code,详细见图示: 那如何用 JavaScript 也在自己的页面上添加一个类似的彩蛋呢? Abhi 在 《Konami Code on Facebook : How to implement it on your site》 一文中提供了大体思路: var $ = { enabled: false, tmp: Array(), _konamiCode: Array(65,66,39,37,39,37,40,40,38,38), init: function() { this.tmp = [...]

... 31 条评论 »

JavaScript 在各个浏览器中执行的耐性

经常会遇到这样一个情况:浏览器弹出对话框,提示脚本运行时间过长,询问“停止”还是“继续”。那究竟各个浏览器是如何判断在什么时候才弹出此对话框呢? IE:执行超过500W条JScript引擎语句出现提示。 Firefox:执行超过10秒出现提示。 Safari:执行超过5秒出现提示。 Opera:无论执行多久都不会出现提示,最有耐性。 Chrome:执行超过约8秒(估计值)出现提示。 注:当弹出类似alert的模式对话框的时候,是不计时。 扩展阅读: 《What determines that a script is long-running?》

... 25 条评论 »

有趣而诡异的数组

年前在重写淘宝旺铺里的会员卡脚本的时候,无意中发现了一个有趣的事情。代码类似: var associative_array = new Array(); associative_array["one"] = “1″; associative_array["two"] = “2″; associative_array["three"] = “3″; if(associative_array.length > 0) { // to do } 会发现 associative_array.length 始终等于 0,当时有点迷惑,后来才知道这就像大家认为 IE 中支持 CSS 属性 display:inline-block 一样,纯属巧合和误解。 实际上(引自《JavaScript “Associative Arrays” Considered Harmful》): JavaScript arrays (which are meant to be numeric) are often used to hold key/value pairs. This is [...]

... 24 条评论 »