复制代码 代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
<title>工具:统计jQuery中各字符串出现次数</title>
<script src="http://demo.jb51.net/jslib/jquery/jquery.js" type="text/javascript"></script>
</head>
<body>
<p>源文件(将jQuery源码复制到下面的文本域):</p>
<p><textarea id="myjquery">..</textarea></p>
<p><input id="mybtn2" type="button" value="统计所有字符串出现次数" /></p>
<div id="myshow2"></div>
<p></p>
<p><label for="myinput">字符串:<input id="myinput" type="text" /> <input id="mybtn1" type="button" value="统计单个字符串出现次数"
/> </label></p>
<div id="myshow1"></div>
<p></p>
<p>点击“统计所有字符出现次数”按钮后发现,字符串“string”竟然出现了44次,多数是诸如以下的代码</p>
<div>
<pre>typeof selector === "string"
typeof data !== "string"
type === "string"
typeof context === "string"
getByName = typeof name === "string"
// ...
</pre>
</div>
<p></p>
<p>如果使用一个变量替换,使用工具压缩时将会进一步减少文件的大小。</p>
<p></p>
<p></p>
<script type="text/javascript">// <![CDATA[
setTimeout(function(){
function buildRe(keywords) {
var rObj = {};
if (keywords.constructor !== Array) {
return;
}
keywords.forEach(function(it) {
rObj[it] = RegExp(''+it, 'g');
});
return rObj;
}
function count(rObj, source, callback, sortType) {
var r,
rarr,
num,
type,
func,
result = [];
var subCount = function(arr) {
var i, re, num, resu;
i = num = 0;
for (i; i<arr.length; i++) {
re = arr[i];
while( (resu=re.exec(source)) != null ) {
num++;
}
}
return num;
};
for (type in rObj) {
rarr = rObj[type];
if (rarr.constructor !== Array) {
rarr = [rarr];
}
num = subCount(rarr);
result.push({type: type, num: num});
}
// sort 0:次数顺序 1:次数倒序
if (typeof sortType !== 'undefined') {
if (sortType===0) {
func = function(a, b) {
return a.num - b.num;
};
} else if (sortType===1) {
func = function(a, b) {
return b.num - a.num;
};
}
result.sort(func);
}
callback(result);
}
function main(keywords, source, callback, sortType) {
var rObj = keywords.constructor === Array ? buildRe(keywords) : keywords;
count(rObj, source, callback, sortType);
}
var rObj = {
string: [/'string'/g, /"string"/g],
number: [/'number'/g, /"number"/g],
'boolean': [/'boolean'/g, /"boolean"/g],
object: [/'object'/g, /"object"/g],
'undefined': [/'undefined'/g, /"undefined"/g],
'function': [/'function'/g, /"function"/g],
'array': [/'array'/g, /"array"/g],
'ready': [/'ready'/g, /"ready"/g],
input: [/'input'/g, /"input"/g],
type: [/'type'/g, /"type"/g],
text: [/'text'/g, /"text"/g],
radio: [/'radio'/g, /"radio"/g],
checkbox: [/'checkbox'/g, /"checkbox"/g],
password: [/'password'/g, /"password"/g],
submit: [/'submit'/g, /"submit"/g],
button: [/'button'/g, /"button"/g],
id: [/'id'/g, /"id"/g],
div: [/'div'/g, /"div"/g],
body: [/'body'/g, /"body"/g],
html: [/'html'/g, /"html"/g],
HTML: [/'HTML'/g, /"HTML"/g],
parentNode: [/'parentNode'/g, /"parentNode"/g],
nextSibling: [/'nextSibling'/g, /"nextSibling"/g],
iframe: [/'iframe'/g, /"iframe"/g],
before: [/'before'/g, /"before"/g],
after: [/'after'/g, /"after"/g],
script: [/'script'/g, /"script"/g],
width: [/'width'/g, /"width"/g],
height: [/'height'/g, /"height"/g],
top: [/'top'/g, /"top"/g],
left: [/'left'/g, /"left"/g],
absolute: [/'absolute'/g, /"absolute"/g],
relative: [/'relative'/g, /"relative"/g],
'static': [/'static'/g, /"static"/g],
fixed: [/'fixed'/g, /"fixed"/g],
href: [/'href'/g, /"href"/g],
border: [/'border'/g, /"border"/g],
margin: [/'margin'/g, /"margin"/g],
marginTop: [/'marginTop'/g, /"marginTop"/g],
marginBottom: [/'marginBottom'/g, /"marginBottom"/g],
marginLeft: [/'marginLeft'/g, /"marginLeft"/g],
marginRight: [/'marginRight'/g, /"marginRight"/g],
padding: [/'padding'/g, /"padding"/g],
paddingTop: [/'paddingTop'/g, /"paddingTop"/g],
paddingLeft: [/'paddingLeft'/g, /"paddingLeft"/g],
paddingRight: [/'paddingRight'/g, /"paddingRight"/g],
display: [/'display'/g, /"display"/g],
olddisplay: [/'olddisplay'/g, /"olddisplay"/g],
none: [/'none'/g, /"none"/g],
hidden: [/'hidden'/g, /"hidden"/g],
inline: [/'inline'/g, /"inline"/g],
opacity: [/'opacity'/g, /"opacity"/g],
show: [/'show'/g, /"show"/g],
hide: [/'hide'/g, /"hide"/g],
toggle: [/'toggle'/g, /"toggle"/g],
json: [/'json'/g, /"json"/g],
success: [/'success'/g, /"success"/g],
fxshow: [/'fxshow'/g, /"fxshow"/g],
fx: [/'fx'/g, /"fx"/g],
'.run': [/'.run'/g, /".run"/g],
'http:': [/'http:'/g, /"http:"/g],
error: [/'error'/g, /"error"/g],
abort: [/'abort'/g, /"abort"/g],
GET: [/'GET'/g, /"GET"/g],
POST: [/'POST'/g, /"POST"/g],
get: [/'get'/g, /"get"/g],
filter: [/'filter'/g, /"filter"/g],
px: [/'px'/g, /"px"/g]
};
function callback1(result) {
var obj = result[0];
var myshowEL = $('#myshow1');
myshowEL = myshowEL.empty();
myshowEL.append('<div>' + obj.type + ': <span>' + obj.num + '</span></div>');
}
function callback2(result) {
var myshowEL = $('#myshow2');
myshowEL = myshowEL.empty();
for (var i=0; i<result.length; i++) {
var obj = result[i];
myshowEL.append('<div>"' + obj.type + '": <span>' + obj.num + '</span></div>');
}
}
$('#mybtn1').click(function(){
var $txtarea = $('#myjquery');
var source = $txtarea.val();
var val = $('#myinput').val();
if (val == '' || val.length<2) {
alert('至少两个字符');
return;
}
var keywords = [val];
main(keywords, source, callback1, 1)
});
$('#mybtn2').click(function(){
var $txtarea = $('#myjquery');
var source = $txtarea.val();
main(rObj, source, callback2, 1);
});
}, 1000);
// ]]></script>
</body>
</html>