简单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 相关文章推荐
判断是否输入完毕再激活提交按钮
Jun 26 Javascript
一个简单的瀑布流效果(主体形式自写)
May 27 Javascript
JS获取鼠标选中的文字
Aug 10 Javascript
AngularJS  自定义指令详解及实例代码
Sep 14 Javascript
详解基于webpack2.x的vue2.x的多页面站点
Aug 21 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
Sep 19 Javascript
Vue.js实现列表清单的操作方法
Nov 15 Javascript
微信小程序实现MUI数字输入框效果
Jan 31 Javascript
在Angular中使用JWT认证方法示例
Sep 10 Javascript
Vue指令指令大全
Feb 09 Javascript
Vue 401配合Vuex防止多次弹框的案例
Nov 11 Javascript
详解JavaScript 中的批处理和缓存
Nov 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
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
2017/09/29 PHP
PHP count_chars()函数讲解
2019/02/14 PHP
javascrip客户端验证文件大小及文件类型并重置上传
2011/01/12 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
2013/11/12 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
jQuery 选择器详解
2015/01/19 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
VueJs与ReactJS和AngularJS的异同点
2016/12/12 Javascript
详解js产生对象的3种基本方式(工厂模式,构造函数模式,原型模式)
2017/01/09 Javascript
jquery mobile移动端幻灯片滑动切换效果
2020/04/15 Javascript
基于Node.js的WebSocket通信实现
2017/03/11 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
python 测试实现方法
2008/12/24 Python
Python调用C++程序的方法详解
2017/01/24 Python
Python实现求两个csv文件交集的方法
2017/09/06 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
python 3.6.4 安装配置方法图文教程
2018/09/18 Python
python 拼接文件路径的方法
2018/10/23 Python
Python中修改字符串的四种方法
2018/11/02 Python
python查找重复图片并删除(图片去重)
2019/07/16 Python
python——全排列数的生成方式
2020/02/26 Python
pycharm实现猜数游戏
2020/12/07 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
2021/02/18 Python
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
澳大利亚拥有最好的家具和家居用品在线目的地:Nestz
2019/02/23 全球购物
小学社团活动总结
2014/06/27 职场文书
教师个人年度总结
2015/02/11 职场文书
MySQL索引失效的典型案例
2021/06/05 MySQL
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android