简单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 相关文章推荐
JS/FLASH实现复制代码到剪贴板(兼容所有浏览器)
May 27 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
Nov 30 Javascript
利用js实现在浏览器状态栏显示访问者在本页停留的时间
Dec 29 Javascript
JS实现仿微博可关闭弹出层效果
Sep 21 Javascript
Vuejs第十篇之vuejs父子组件通信
Sep 06 Javascript
Bootstrap CDN和本地化环境搭建
Oct 26 Javascript
js实现PC端和移动端刮卡效果
Mar 27 Javascript
JSONP基础知识详解
Mar 19 Javascript
JavaScript分步实现一个出生日期的正则表达式
Mar 22 Javascript
JavaScript中var的重要性实例分析
Jul 09 Javascript
ionic2.0双击返回键退出应用
Sep 17 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
Apr 10 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
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
给超链接添加特效鼠标移动展示提示信息且随鼠标移动
2013/10/17 Javascript
利用JS进行图片的切换即特效展示图片
2013/12/03 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
最实用的jQuery分页插件
2016/10/09 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
微信小程序 弹框和模态框实现代码
2017/03/10 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
js操作二进制数据方法
2018/03/03 Javascript
全站最详细的Vuex教程
2018/04/13 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
python之Socket网络编程详解
2016/09/29 Python
详解django2中关于时间处理策略
2019/03/06 Python
使用python分析统计自己微信朋友的信息
2019/07/19 Python
如何在sublime编辑器中安装python
2020/05/20 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
夜班门卫岗位职责
2013/12/09 职场文书
教师开学感言
2014/02/14 职场文书
房屋公证委托书
2014/04/03 职场文书
2014年应急工作总结
2014/12/11 职场文书
六年级学生评语大全
2014/12/26 职场文书
伊索寓言读书笔记
2015/06/30 职场文书
2016初一新生军训心得体会
2016/01/11 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
Java使用Unsafe类的示例详解
2021/09/25 Java/Android
MySQL主从切换的超详细步骤
2022/06/28 MySQL