简单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中遭遇级联表达式陷阱
Mar 08 Javascript
用javascript实现读取txt文档的脚本
Jul 20 Javascript
autoPlay 基于jquery的图片自动播放效果
Dec 07 Javascript
JavaScript面向对象之Prototypes和继承
Jul 12 Javascript
jCallout 轻松实现气泡提示功能
Sep 22 Javascript
jquery实现图片翻页效果
Dec 23 Javascript
七个很有意思的PHP函数
May 12 Javascript
jquery仿百度经验滑动切换浏览效果
Apr 14 Javascript
javascript实现可拖动变色并关闭层窗口实例
May 15 Javascript
关于js中的鼠标事件总结
Jul 11 Javascript
详解使用create-react-app快速构建React开发环境
May 16 Javascript
vue路由守卫+登录态管理实例分析
May 21 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
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
Laravel 框架路由原理与路由访问实例分析
2020/04/14 PHP
Prototype Object对象 学习
2009/07/12 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
2012/06/04 Javascript
firefox下jquery ajax返回object XMLDocument处理方法
2014/01/26 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
node.js中module.exports与exports用法上的区别
2016/09/02 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
Angular 表单控件示例代码
2017/06/26 Javascript
vue中Npm run build 根据环境传递参数方法来打包不同域名
2018/03/29 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
[00:16]热血竞技场
2019/03/06 DOTA
学习python处理python编码问题
2011/03/13 Python
Python引用模块和查找模块路径
2016/03/17 Python
numpy使用fromstring创建矩阵的实例
2018/06/15 Python
Python图像处理之简单画板实现方法示例
2018/08/30 Python
python 处理string到hex脚本的方法
2018/10/26 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
苹果Mac升级:MacSales.com
2017/11/20 全球购物
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
保卫钓鱼岛口号
2014/06/20 职场文书
焦裕禄精神心得体会
2014/09/02 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
Python OpenCV实现图形检测示例详解
2022/04/08 Python
Python Matplotlib绘制动画的代码详解
2022/05/30 Python
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis