Skip navigation.

极湖

无不用其“极”

Posts tagged with "JavaScript"

JavaScript: 阿拉伯数字转中文

, , , ...

用 JavaScript 新作一个小东西,需要把阿拉伯数字转换成中文的表达方式,因此做了一个实现该功能的函数。函数很简单,也不是很完善,不过也许有人用得上,就贴在这儿了:
//*******************************************************
// 阿拉伯数字转中文
//*******************************************************
function toCnNumber(intNum) {
    var strCnNum = '';
    var arrCnNum = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
    var arrCnMark = ["", "十", "百", "千", "万", "十万", "百万", "千万", "亿"];
    var strNum = intNum.toString();
    var intLen = strNum.length;
    var zeroFlag = false;
    for(var i = 0; i < intLen; i++) {
        var n = parseInt(strNum.charAt(i));
        if(parseInt(strNum.substr(i)) == 0) {
            break;
        } else {
            if(n == 0) {
                if(!zeroFlag) {
                    strCnNum += arrCnNum[n];
                }
                zeroFlag = true;
            } else {
                strCnNum += arrCnNum[n];
                strCnNum += arrCnMark[intLen - i - 1];
                zeroFlag = false;
            }
        }
    }
    return strCnNum;
}

WYSIWYG 在线 HTML 编辑器收集

, ,

1. FCKeditor
老品牌,名气很大,功能很多,个头也很大,个人不是很喜欢。

2. TinyMCE
和 FCKeditor 齐名,名为"Tiny",实际上个头并不小,而且有向"Huge"发展的趋势。

3. Xinha
据其主页上的介绍,功能似乎很强大,其插件系统看起来不错。因为没用过,暂不置评。

4. widgEditor
个头很小,下载文件只有32k,我看了一下它的代码,感觉还不错,尽管功能稍欠,熟悉JavaScript的人应该可以自己将其扩充。

5. WMD
简单实用的在线编辑器。可惜不提供源代码下载。在自己的网页里面使用它需要注册。

6. WYMeditor
该编辑器做成 jQuery 的插件,这是其亮点,看了一下他的代码,感觉有些零乱,目录结构也不是很好。因个人很喜欢 jQuery,所以期待它做得更好。

7. Wikiwyg
这是 SocialText 采用的在线编辑器,双击网页的某一部分(div)就能使其进入编辑状态,这一点很方便。目前发现的问题是不支持 Opera。

8. WYSIWYG HTML control
一位英国人写的代码,个头很小,js文件才15k,看了一下其代码,比较清晰易懂,应该容易扩展,值得推荐。

9. crosseditor
一位日本人在 Prototype 库的基础上写的代码,非正式产品,其Sample代码可用来研究学习。

目前找到的就这些,网上还有很多类似的编辑器代码,青菜萝卜,各有所爱,自己挑喜欢的用吧。

这儿有一篇文章,教你怎样做 WYSIWYG HTML 编辑器,如果想自己做编辑器,读一读这篇文章肯定有好处。

用 JavaScript 保存数据到本地的方法

,

用 JavaScript,可以把网页中的内容保存到本地?似乎有点玄,因为这是一个最起码的安全原则。试想,一打开网页,自动运行的 JavaScript 就不分青红皂白,擅自把文件保存到 Windows 目录下面,甚至替换系统文件,那岂不是很糟糕?!

我以前也考虑过这个问题,经过一些试验,得出的结论是,直接保存文件是很困难的,保存一些短小的数据在本地,却也并非不可能。方法:

1. 通过 Cookie 保存

几乎所有浏览器都支持 Cookie,所以很容易实现。最常用的是用来保存用户的登录数据。

2. 通过 ActiveX 保存

仅 Windows 下的 IE 可用,用这个方法可以实现文件的保存。Web 版的迅雷用的就是这种方法。IE 的安全问题很突出,原因正是出在这个让人又爱又恨的 ActiveX 身上。

3. 通过 Flash 保存

有一点匪夷所思,看到这个日文网页之后才知道还有这么一个方法。

还有别的方法?若有,请告知。谢谢!

JavaScript 缓存处理

, ,

如果网页中有些内容需要大量的计算才能得到,而且有可能重复计算,那就得考虑用缓存来处理。

JavaScript 缓存处理的原理:定义一个全局数组对象,第一次通过 key 赋值,需要的时候又通过 key 取值。

例:
var arrCache = new array ();

if(!arrCache('a')) {
  arrCache('a') = 'Cache Content';
} else {
  alert('a: ' + arrCache('a'));
}

在网上找到一个通用且功能齐全的 Cache 处理代码库,这就是 Javascript LRU Cache。其原理和以上所述一致,不过,它还能设定过期时间,还能指定 Callback 处理的代码,非常的专业。

Javascript LRU Cache 的用法(原文照抄,去掉注释):
var cache = new Cache();  

 cache.setItem("A", "1", {expirationAbsolute: null,   
                          expirationSliding: 60,   
                          priority: CachePriority.High,  
                          callback: function(k, v) { alert('removed ' + k); }  
                         });  

cache.getItem("A");  

cache.clear();

Javascript LRU Cache 可以从这儿下载

易经六十四卦

, , , ...

jQuery 是个让人着迷的 JavaScript 库,这些天一直在学这个东西。

用 jQuery 作了几个日历之后,接下来想做一个“算命”的东西,那就是《易经》。

经过几天的琢磨,做出这么一个“易经六十四卦”的网页:


网址:http://staticlake.appspot.com/iching/index.html
如果在国外,也可以用这个地址访问。

网页看上去五颜六色,不是很美观,还需要调整。

特点:
  • 用八卦图案合成六十四卦图案。
  • 有鼠标提示,显示八卦和六十四卦的卦名等信息。
  • 点击六十四卦图案,显示相应的经文,点击经文自动关闭文字框。
  • 可以进行占卜,按顺序随机生成六个“1”或“0”的数字,组合后就是占卜的结果。
  • 用了一点 Ajax 技术,对应三大浏览器(IE, Firefox, Opera)。

如果您对这个小东西感兴趣,欢迎提供意见。

*更新*
  • 采用黑色背景的配色方案。(2007.9.1)
  • 弹出窗口样式更新,增加关闭图标。去掉点击文字区域关闭窗口的功能。(2007.9.1)
  • 增加白话文解析,原文和白话文通过 Tab 切换。(2007.9.2)

jQuery 升级到 1.1.4

, ,

jQuery 1.1.4 正式发布了,号称更快、更多测试、为 1.2 做准备

看介绍,该版本速度比起 1.1.3.1 ,又有不少提高,同时加了一些新功能,个头也有所增长,压缩版长了1k多点。

顺便把几个日历的 jquery 升级了,在 1.1.4 下,没有发现运行错误。

日历地址:
http://geelake.com/cnCalendar/
http://geelake.com/jpCalendar/
http://geelake.com/usCalendar/

用JavaScript打印“Unicode 码表”

,

看到别人Blog上的一小段代码,功能是在浏览器中输出所有Unicode的编码及字符,于是试试看,没想到试出很多问题。

以下是我改造了一下后的代码(包括HTML):
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Unicode 码表</title>
<script type="text/javascript">
<!--
String.prototype.pad = function(l, s, t) {
    return s || (s = " "), (l -= this.length) > 0 ? (s = new Array(Math.ceil(l / s.length)
        + 1).join(s)).substr(0, t = !t ? l : t == 1 ? 0 : Math.ceil(l / 2))
        + this + s.substr(0, l - t) : this;
};

window.onload = function() {
    var divList = document.getElementById('list');
    //0单独处理,若放在循环里面,IE和Opera不显示以后的字符,Firefox则可以
    var strHtml = '0x0000: �';      
    for(var i = 0x0001; i <= 0xFFFF; i++){
        var strAnd = (i % 10 == 0) ? '\n' : '  ';
        strHtml += strAnd + '0x' + i.toString(16).pad(4,'0') + ': ' + String.fromCharCode(i);
    }
    divList.innerHTML = '<pre>' + strHtml + '</pre>';
};
//-->
</script>
</head>
<body>
<div id="list"></div>
</body>
</html>


这个循环很大,运行很花时间,如果只是想着看看输出是什么样,最好改一下循环的上下限。比如0x0001到0x0FFF。

程序输出到0x202b和0x202c的时候,编码和字符的顺序会倒转过来,很奇怪,不清楚为什么。

有人用JavaScript做了一个很完善的Unicode编码字符对应表,这个真正有用。

为了弄这段代码,还找到几个有用的函数,放在以下备用。
//HTML特殊字符替换(&后面的空格是故意加的,因为My Opera会把它变成转换后的字符)
function htmlEncode(s) {
        var str = new String(s);
        str = str.replace(/&/g, "& amp;");
        str = str.replace(/</g, "& lt;");
        str = str.replace(/>/g, "& gt;");
        str = str.replace(/"/g, "& quot;");
        //str = str.replace(/\n/g, "<br />");
        return str;
}

//十进制转十六进制
function d2h(d) {
    return d.toString(16);
}

//十六进制转十进制
function h2d(h) {
    return parseInt(h,16);
}

United States Calendar

, ,

先后做了日本日历中国日历,接下来做美国日历

几个日历,只不过是语言不同,还有节假日不同,其他大体上是共通的。

美国的节假日比想象的要复杂。除了固定的某月某日、某月的某周几,还有最后一周的周几、最后一个完全周的周几,还有四年一度的假日,因此程序也相对复杂一些,不过还好,没有中国农历那么复杂。

用了两天时间,“United States Calendar”做出来了。以下是截图:



该日历也可以用这个地址来访问。

因为不是在美国生活,所以新作的“United States Calendar”可能不是很完善,若有来自美国的朋友,请帮忙看看日历,若有什么错误的地方,或者可以改进的地方,还请告知一声。

以上日历程序参考了以下的网页:
http://www.smart.net/~mmontes/ushols.html
http://www.holidayorigins.com/


*更新消息
鼠标提示增加日期的对应星座。(2007.08.16)

JavaScript: 给 Date 对象添加格式化方法

, ,

以下这段程序,从这儿发现。

/* Date/Time Format v0.2; MIT-style license
By Steven Levithan <http://stevenlevithan.com> */

Date.prototype.format = function(mask) {
    var d = this; // Needed for the replace() closure
    
    // If preferred, zeroise() can be moved out of the format() method for performance and reuse purposes
    var zeroize = function (value, length) {
        if (!length) length = 2;
        value = String(value);
        for (var i = 0, zeros = ''; i < (length - value.length); i++) {
            zeros += '0';
        }
        return zeros + value;
    };
    
    return mask.replace(/"[^"]*"|'[^']*'|\b(?:d{1,4}|m{1,4}|yy(?:yy)?|([hHMs])\1?|TT|tt|[lL])\b/g, function($0) {
        switch($0) {
            case 'd':   return d.getDate();
            case 'dd':  return zeroize(d.getDate());
            case 'ddd': return ['Sun','Mon','Tue','Wed','Thr','Fri','Sat'][d.getDay()];
            case 'dddd':    return ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'][d.getDay()];
            case 'm':   return d.getMonth() + 1;
            case 'mm':  return zeroize(d.getMonth() + 1);
            case 'mmm': return ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'][d.getMonth()];
            case 'mmmm':    return ['January','February','March','April','May','June','July','August','September','October','November','December'][d.getMonth()];
            case 'yy':  return String(d.getFullYear()).substr(2);
            case 'yyyy':    return d.getFullYear();
            case 'h':   return d.getHours() % 12 || 12;
            case 'hh':  return zeroize(d.getHours() % 12 || 12);
            case 'H':   return d.getHours();
            case 'HH':  return zeroize(d.getHours());
            case 'M':   return d.getMinutes();
            case 'MM':  return zeroize(d.getMinutes());
            case 's':   return d.getSeconds();
            case 'ss':  return zeroize(d.getSeconds());
            case 'l':   return zeroize(d.getMilliseconds(), 3);
            case 'L':   var m = d.getMilliseconds();
                    if (m > 99) m = Math.round(m / 10);
                    return zeroize(m);
            case 'tt':  return d.getHours() < 12 ? 'am' : 'pm';
            case 'TT':  return d.getHours() < 12 ? 'AM' : 'PM';
            // Return quoted strings with the surrounding quotes removed
            default:    return $0.substr(1, $0.length - 2);
        }
    });
};

如果你对JavaScript以及正则表达式比较熟悉,或许看程序本身就能知道怎么用。建议还是看看原文,这段程序还是比较酷的。

JavaScript之"完全数字参考"

欲查询JavaScript中二进制、八进制和十六进制数字的定义方法,发现了这个"完全数字参考",内容确实很完整,有关数字运算和转换的方法都已囊括。

从这个“JavaScript完全数字参考”得出我要查询的结果:

在JavaScript中,
没有二进制数字的定义方法。
八进制数字的定义方法是 0 + 0到7的数字。如 0377
十六进制数字的定义方法是 0x + 0到9的数字和a到f的字母。如 0x2ff (0X 打头亦可,字母大小写都行)
December 2009
S M T W T F S
November 2009January 2010
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31