简单JS代码压缩器


Posted in Javascript onOctober 12, 2006

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:ttyp@21cn.com">ttyp@21cn.com</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>

Javascript 相关文章推荐
javascript 的Document属性和方法集合
Jan 25 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
Feb 10 Javascript
FusionCharts图表显示双Y轴双(多)曲线
Nov 22 Javascript
Javascript 多物体运动的实现
Dec 24 Javascript
javascript实现图片上传前台页面
Aug 18 Javascript
JS检测页面中哪个HTML标签触发点击事件的方法
Jun 17 Javascript
轻松5句话解决JavaScript的作用域
Jul 15 Javascript
简单分析javascript中的函数
Sep 10 Javascript
Webpack打包css后z-index被重新计算的解决方法
Jun 18 Javascript
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
简单理解Vue中的nextTick方法
Jan 30 Javascript
p5.js入门教程之键盘交互
Mar 19 Javascript
jQuery 1.0.2
Oct 11 #Javascript
Firefox 无法获取cssRules 的解决办法
Oct 11 #Javascript
Google Suggest ;-) 基于js的动态下拉菜单
Oct 11 #Javascript
JS中style属性
Oct 11 #Javascript
用JavaScript脚本实现Web页面信息交互
Oct 11 #Javascript
window.open的功能全解析
Oct 10 #Javascript
Array.slice()与Array.splice()的返回值类型
Oct 09 #Javascript
You might like
PHPstorm启用自动换行的方法详解(IDE)
2020/09/17 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
JavaScript中的私有/静态属性介绍
2012/07/26 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
js使用递归解析xml
2014/12/12 Javascript
JavaScript结合AJAX_stream实现流式显示
2015/01/08 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
通过BootStrap-select插件 js jQuery控制select属性变化
2017/01/03 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
国内常用的js类库大全(CDN公共库)
2020/06/24 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
再也不怕 JavaScript 报错了,怎么看怎么处理都在这儿
2020/12/09 Javascript
17个Python小技巧分享
2015/01/23 Python
编写Python的web框架中的Model的教程
2015/04/29 Python
python中异常捕获方法详解
2017/03/03 Python
django 将model转换为字典的方法示例
2018/10/16 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
Python3 翻转二叉树的实现
2019/09/30 Python
利用python绘制数据曲线图的实现
2020/04/09 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
非洲NO.1网上商店:Jumia肯尼亚
2016/08/18 全球购物
TCP/IP的分层模型
2013/10/27 面试题
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
2014年电厂工作总结
2014/12/04 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
MYSQL 运算符总结
2021/11/11 MySQL