当前位置: 首页 > 图文教程 > 网络编程 > Javascript > 简单JS代码压缩器

Javascript
JavaScript 继承详解(四)
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
js 实现无缝滚动 兼容IE和FF
js 对象是否存在判断
优化 JavaScript 代码的方法小结
表单元素事件 (Form Element Events)
js 动态创建 html元素
prototype 学习笔记整理
JavaScript 创建对象
javascript 全角转换实现代码
DOM 基本方法
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
javascript 动态创建 Option选项
javascript 7行代码画出一个围棋棋盘
比较简单的异步加载JS文件的代码
javascript 层隐藏和显示的代码
自定义滚动条3.0
javascript iframe内的函数调用实现方法
Prototype Class对象学习
Prototype RegExp对象 学习

Javascript 中的 简单JS代码压缩器


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-12   浏览: 301 ::
收藏到网摘: n/a

1、
复制代码 代码如下:

<!--
- From: <a href="http://www.iecn.net/bbs/view/105499.html" target="_blank">http://www.iecn.net/bbs/view/105499.html</a>
- IECN.NET 2006-09-22
-->
<script language="javascript"
type="text/javascript">
//去除所有的注释
String.prototype.DeleteComment = function ()
{
var str = this.replace(/(['"])(.+?)(['"])/g,function(s,s1,s2,s3){return s1+s2.replace(/[\/\*]/g,"\\$&")+s3});
str = str.replace(/\/\/[^\r]+|\/\*[\s\S]+?\*\//g,"");
str = str.replace(/(['"])(.+?)(['"])/g,function(s,s1,s2,s3){return s1+s2.replace(/\\([^\\])/g,"$1")+s3});
return str;
}
//格式代码
String.prototype.FormatCode = function ()
{
return this.replace(/\\$/mg,"").replace(/[^\s>;]$/mg,"$&;");
}
//删除字符串前后多余的空格
String.prototype.Trim = function (m)
{
return this.replace(m ? /^\s*|\s*$/mg : /^\s*|\s*$/g, "");
}
//运行代码
function RunCode(obj)
{
window.open('','_blank').document.write(obj.value);
}
</script>
测试代码:<br/>
<textArea id="Text" rows="25" cols="80">
<script language="JavaScript">
/*
测试代码
*/
var x=5;
document.write("x = // " + x);
document.write("bh/* " + x);
document.write("x =jjhj */hhhhhh " + x);
document.write("x = // " + x);
alert(22)
alert(22)
var a="/fwe/////wefawef";
alert(/^\/*[^\/]*$/.test(a));
//注释
</script>
</textArea> <br/><br/>
第1步:<button onclick="Text.value = Text.value.DeleteComment();">删除注释</button> <br/> <br/>
第2步:<button onclick="Text.value=Text.value.FormatCode();">格式代码</button> <br/> <br/>
第3步:<button onclick="Text.value=Text.value.Trim(true);">去除两边空格</button> <br/> <br/>
第4步:<button onclick="RunCode(Text);">运行代码</button> <br/> <br/>

2、
复制代码 代码如下:
<HTML><HEAD><TITLE>Format</TITLE>
<META content="MSHTML 6.00.2800.1528" name=GENERATOR>
<META content="" name=Author>
<META content="" name=Keywords>
<META content="" name=Description></HEAD>
<BODY>
<SCRIPT language=JavaScript>
<!--
/**//**//**//**
** ==================================================================================================
** 类名:CLASS_FORMATER
** 功能:JS格式化
** 示例:
---------------------------------------------------------------------------------------------------
var xx = new CLASS_FORMATER(code);
document.getElementById("display").innerHTML = xx.format();
---------------------------------------------------------------------------------------------------
** 作者:ttyp
** 邮件:<a href="mailto:[email protected]">[email protected]</a>
** 日期:2006-5-21
** 版本:0.1
** ==================================================================================================
**/
function CLASS_FORMAT(code){
//哈希表类
function Hashtable(){
this._hash = new Object();
this.add = function(key,value){
if(typeof(key)!="undefined"){
if(this.contains(key)==false){
this._hash[key]=typeof(value)=="undefined"?null:value;
return true;
} else {
return false;
}
} else {
return false;
}
}
this.remove = function(key){delete this._hash[key];}
this.count = function(){var i=0;for(var k in this._hash){i++;} return i;}
this.items = function(key){return this._hash[key];}
this.contains = function(key){return typeof(this._hash[key])!="undefined";}
this.clear = function(){for(var k in this._hash){delete this._hash[k];}}
}
this._caseSensitive = true;
//字符串转换为哈希表
this.str2hashtable = function(key,cs){
var _key = key.split(/,/g);
var _hash = new Hashtable();
var _cs = true;

if(typeof(cs)=="undefined"||cs==null){
_cs = this._caseSensitive;
} else {
_cs = cs;
}
for(var i in _key){
if(_cs){
_hash.add(_key[i]);
} else {
_hash.add((_key[i]+"").toLowerCase());
}
}
return _hash;
}
//获得需要转换的代码
this._codetxt = code;
if(typeof(syntax)=="undefined"){
syntax = "";
}
this._deleteComment = false;
//是否大小写敏感
this._caseSensitive = true;
//可以后面加块语句的关键字
this._blockElement = this.str2hashtable("switch,if,while,try,finally");
//是函数申明
this._function = this.str2hashtable("function");
//本行括号内分号不做换行
this._isFor = "for";
this._choiceElement = this.str2hashtable("else,catch");
this._beginBlock = "{";
this._endBlock = "}";
this._singleEyeElement = this.str2hashtable("var,new,return,else,delete,in,case");
//得到分割字符
this._wordDelimiters= "  ,.?!;:\\/<>(){}[]\"'\r\n\t=+-|*%@#$^&";
//引用字符
this._quotation = this.str2hashtable("\",'");
//行注释字符
this._lineComment = "//";
//转义字符
this._escape = "\\";
//多行引用开始
this._commentOn = "/*";
//多行引用结束
this._commentOff = "*/";
//行结束词
this._rowEnd = ";";
this._in = "in";

this.isCompress = false;
this.style = 0;
this._tabNum = 0;

this.format = function() {
var codeArr = new Array();
var word_index = 0;
var htmlTxt = new Array();
if(this.isCompress){
this._deleteComment = true;
}

//得到分割字符数组(分词)
for (var i = 0; i < this._codetxt.length; i++) {
if (this._wordDelimiters.indexOf(this._codetxt.charAt(i)) == -1) { //找不到关键字
if (codeArr[word_index] == null || typeof(codeArr[word_index]) == 'undefined') {
codeArr[word_index] = "";
}
codeArr[word_index] += this._codetxt.charAt(i);
} else {
if (typeof(codeArr[word_index]) != 'undefined' && codeArr[word_index].length > 0)
word_index++;
codeArr[word_index++] = this._codetxt.charAt(i);
}
}

var quote_opened = false; //引用标记
var slash_star_comment_opened = false; //多行注释标记
var slash_slash_comment_opened = false; //单行注释标记
var line_num = 1; //行号
var quote_char = ""; //引用标记类型
var function_opened = false;
var bracket_open = false;
var for_open = false;
//按分割字,分块显示
for (var i=0; i <=word_index; i++){
//处理空行(由于转义带来)
if(typeof(codeArr[i])=="undefined"||codeArr[i].length==0){
continue;
} else if(codeArr[i]==" "||codeArr[i]=="\t"){
if(slash_slash_comment_opened||slash_star_comment_opened){
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
if(quote_opened){
htmlTxt[htmlTxt.length] = codeArr[i];
}
} else if(codeArr[i]=="\n"){
//处理换行
} else if (codeArr[i] == "\r"){
slash_slash_comment_opened = false;
quote_opened = false;
line_num++;
if(!this.isCompress){
htmlTxt[htmlTxt.length] = "\r\n"+ this.getIdent();
}
//处理function里的参数标记
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&this.isFunction(codeArr[i])){
htmlTxt[htmlTxt.length] = codeArr[i] + " ";
function_opened = true;
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._isFor){
htmlTxt[htmlTxt.length] = codeArr[i];
for_open = true;
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]=="("){
bracket_open = true;
htmlTxt[htmlTxt.length] = codeArr[i];
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==")"){
bracket_open = false;
htmlTxt[htmlTxt.length] = codeArr[i];
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._rowEnd){
if(!this.isCompress){
if(!for_open){
if(i<word_index&&(codeArr[i+1]!="\r"&&codeArr[i+1]!="\n")){
htmlTxt[htmlTxt.length] = codeArr[i] + "\n" + this.getIdent();
}else{
htmlTxt[htmlTxt.length] = codeArr[i] + this.getIdent();
}
}else{
htmlTxt[htmlTxt.length] = codeArr[i];
}
}else{
htmlTxt[htmlTxt.length] = codeArr[i];
}
} else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._beginBlock){
for_open = false;
if(!this.isCompress){
switch(this.style){
case 0:
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "\n" + this.getIdent();
break;
case 1:
htmlTxt[htmlTxt.length] = "\n" + this.getIdent();
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i] + "\n"+ this.getIdent();
break;
default:
this._tabNum++;
htmlTxt[htmlTxt.length] = codeArr[i];
break;
}
}else{
htmlTxt[htmlTxt.length] = codeArr[i];
}
} else if(!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened &&codeArr[i]==this._endBlock){
if(!this.isCompress){
this._tabNum--;
if(i<word_index&&codeArr[i+1]!=this._rowEnd){
htmlTxt[htmlTxt.length] = "\n" + this.getIdent() + codeArr[i];
}else{
htmlTxt[htmlTxt.length] = "\n" + this.getIdent() + codeArr[i];
}
}else{
if(i<word_index&&codeArr[i+1]!=this._rowEnd){
htmlTxt[htmlTxt.length] = codeArr[i] + this._rowEnd;
}else{
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
//处理关键字
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isBlockElement(codeArr[i])){
htmlTxt[htmlTxt.length] = codeArr[i];
//处理内置对象(后面加一个空格)
} else if (!slash_slash_comment_opened&&!slash_star_comment_opened && !quote_opened && this.isSingleEyeElement(codeArr[i])){
if(codeArr[i]==this._in){
htmlTxt[htmlTxt.length] = " ";
}
htmlTxt[htmlTxt.length] = codeArr[i] + " ";
//处理双引号(引号前不能为转义字符)
} else if (!slash_star_comment_opened&&!slash_slash_comment_opened&&this._quotation.contains(codeArr[i])){
if (quote_opened){
//是相应的引号
if(quote_char==codeArr[i]){
htmlTxt[htmlTxt.length] = codeArr[i];
quote_opened = false;
quote_char = "";
} else {
htmlTxt[htmlTxt.length] = codeArr[i];
}
} else {
htmlTxt[htmlTxt.length] = codeArr[i];
quote_opened = true;
quote_char = codeArr[i];
}
//处理转义字符
} else if(codeArr[i] == this._escape){
htmlTxt[htmlTxt.length] = codeArr[i];
if(i<word_index-1){
if(codeArr[i+1].charCodeAt(0)>=32&&codeArr[i+1].charCodeAt(0)<=127){
htmlTxt[htmlTxt.length] = codeArr[i+1].substr(0,1);
htmlTxt[htmlTxt.length] = codeArr[i+1].substr(1);
i=i+1;
}
}
//处理多行注释的开始
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._commentOn,codeArr,i)){
slash_star_comment_opened = true;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._commentOn;
}
i = i + this.getSkipLength(this._commentOn);
//处理单行注释
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._lineComment,codeArr,i)){
slash_slash_comment_opened = true;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._lineComment;
}
i = i + this.getSkipLength(this._lineComment);
//处理忽略词
} else if (!slash_slash_comment_opened && !slash_star_comment_opened&&!quote_opened&&this.isStartWith(this._ignore,codeArr,i)){
slash_slash_comment_opened = true;
htmlTxt[htmlTxt.length] = this._ignore;
i = i + this.getSkipLength(this._ignore);
//处理多行注释结束
} else if (!quote_opened&&!slash_slash_comment_opened&&this.isStartWith(this._commentOff,codeArr,i)){
if (slash_star_comment_opened) {
slash_star_comment_opened = false;
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = this._commentOff;
}
i = i + this.getSkipLength(this._commentOff);
}
} else {
//不是在字符串中
if(!quote_opened){
//如果不是在注释重
if(!slash_slash_comment_opened && !slash_star_comment_opened){
htmlTxt[htmlTxt.length] = codeArr[i];
//注释中
}else{
if(!this._deleteComment){
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
}else{
htmlTxt[htmlTxt.length] = codeArr[i];
}
}
}
return htmlTxt.join("");
}
this.isStartWith = function(str,code,index){
if(typeof(str)!="undefined"&&str.length>0){
var cc = new Array();
for(var i=index;i<index+str.length;i++){
cc[cc.length] = code[i];
}
var c = cc.join("");
if(this._caseSensitive){
if(str.length>=code[index].length&&c.indexOf(str)==0){
return true;
}
}else{
if(str.length>=code[index].length&&c.toLowerCase().indexOf(str.toLowerCase())==0){
return true;
}
}
return false;
} else {
return false;
}
}
this.isFunction = function(val){
return this._function.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isBlockElement = function(val) {
return this._blockElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isChoiceElement = function(val) {
return this._choiceElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isSingleEyeElement = function(val) {
return this._singleEyeElement.contains(this._caseSensitive?val:val.toLowerCase());
}
this.isNextElement = function(from,word){
for(var i=from;i<word.length;i++){
if(word[i]!=" "&&word[i]!="\t"&&word[i]!="\r"&&word[i]!="\n"){
return this.isChoiceElement(word[i]);
}
}
return false;
}
this.getSkipLength = function(val){
var count = 0;
for(var i=0;i<val.length;i++){
if(this._wordDelimiters.indexOf(val.charAt(i))>=0){
count++;
}
}
if(count>0){
count=count-1;
}
return count;
}
this.getIdent=function(){
var n = [];
for(var i=0;i<this._tabNum;i++){
n[n.length] = "\t";
}
return n.join("");
}
}
function doformat(o){
var htmltxt = "";
if (o == null){
alert("domNode is null!");
return;
}
var _codetxt = "";
if(typeof(o)=="object"){
switch(o.tagName){
case "TEXTAREA":
case "INPUT":
_codetxt = o.value;
break;
case "DIV":
case "SPAN":
_codetxt = o.innerText;
break;
default:
_codetxt = o.innerHTML;
break;
}
}else{
_codetxt = o;
}
var _syn = new CLASS_FORMAT(_codetxt);
htmltxt = _syn.format();
return htmltxt;
}

function go()
{
var code = document.getElementById("code").value;
var xx = new CLASS_FORMAT(code);
var a = new Date();
if(document.getElementById('cboOperate').selectedIndex==1){
xx.isCompress=true;
}else{
xx.style = parseInt(document.getElementById('cboStyle').value);
}
document.getElementById("display").value = xx.format();
alert("共花:" + (new Date().getTime()-a.getTime()) + "ms");
}
//-->
</SCRIPT>
<TEXTAREA id=code rows=12 cols=100>
/*
这个是一个类
*/

function xx (num,str){//说明
var a = num;this.aa = a;
this.bb = function(){alert(str);}
this.cc = function(){for(var i=0;i<10;i++){document.title=i;}}};
xx.prototype.dd= function(){alert("d d kd");}
var a = new xx(100,"hello"),b=new xx(0,"ttyp");
if(1>2) { alert();
}
else {
alert(" hell ");
}
a.bb();
b.dd();
alert(a.aa);
</TEXTAREA> <BR>
<select id="cboOperate" onchange="if(this.selectedIndex==1)document.getElementById('cboStyle').disabled=true;else document.getElementById('cboStyle').disabled=false;">
<option value="0">格式化</option>
<option value="1">压缩</option>
</select>
<select id="cboStyle">
<option value="0">经典</option>
<option value="1">微软</option>
</select>
<INPUT onclick=go() type=button value=go><br>
<textarea id=display rows=12 cols=100>
</textarea>
</BODY></HTML>