/**
* <P> Title: JavaScript Util </P>
* <P> Description: JavaScript 工具 </P>
* <P> Modify: 2011/11/30 </P>
* @author 冯万里
* @version 1.0
*
* 为减少 js 关键词的占用,此文件只占用“c$”一个关键词;
* 使用时用: c$.函数名(参数列表); 或者 c$().函数名(参数列表)
* 字符串操作函数、日期操作函数、数组操作函数等,直接增加到 String、Date、Array 类里面,便于直接使用
*/ /**
* 获取元素,或者在DOM加载完成时执行某函数
* @param arg 此参数为字符串时,认为是 c$.getElement 的缩写,用来获取元素。用法参考 c$.getElement
* 如果 arg 是 function 则认为是 c$.ready 的缩写,在dom加载完成时执行。没有此参数则返回 c$ 对象。
* @param dom 需要选择的DOM对象,默认是 window.document
* @return 没有arg参数时返回 c$ 对象,arg参数是字符串时返回查询的元素,arg参数是函数时没有返回内容。
*
* @example
* c$("mytext") // 返回 id 或者 name 为"mytext"的元素
* c$("#mytext") // 返回 id 为"mytext"的元素
* c$("@mytext") // 返回 name 为"mytext"的所有元素
* c$(".class1") // 返回 class 为"class1"的所有元素
* c$("$div") // 返回 标签 为"div"的所有元素
* c$("$div #text1") // 返回 div 标签里面 id 为"text1"的元素(支持多级查询,以空格分隔)
* c$(function(){alert('执行DOM加载完成事件');}); // 为 c$.ready(fun) 的缩写
*
* c$.函数名(参数列表) // 调用这工具类里面的函数
* c$().函数名(参数列表) // 调用这工具类里面的函数
*/
var c$ = window.c$ = function(arg, dom) {
// 如果没有参数,则返回 本对象;让程序可以这样写: c$().函数名(参数列表)
if (arguments.length === ) return c$;
if (typeof arg == 'function') return c$.ready(arg);
// 有参数则调用获取元素的函数,为 c$.getElement 的缩写
return c$.getElement(arg, dom);
}; /**
* 这是错误调试程序(仅IE、fiefox有效,w3c标准里面没有此定义)
* 当页面发生错误时,提示错误讯息;仅测试环境里会提示,正式环境下不提示错误。
* 注意:chrome、opera 和 safari 浏览器不支持 onerror 事件
* @param msg 出错讯息
* @param url 出错档案的地址
* @param sLine 发生错误的行
* @return true 返回true,会消去 IE下那个恼人的“网页上有错误”的提示
*/
window.onerror = function(msg, url, sLine) {
// 测试时可以提示出错信息;正式发布时不提示
if (c$.isTest) {
var errorMsg = "当前页面的javascript发生错误.\n\n";
errorMsg += "错误: " + msg + "\n";
errorMsg += "URL: " + url + "\n";
errorMsg += "行: " + sLine + "\n\n";
errorMsg += "点击“确定”消去此错误,“取消”保留此错误。\n\n";
return window.confirm( errorMsg );
}
// 返回true,会消去 IE下那个恼人的“网页上有错误”的提示
return true;
}; /**
* 是否测试环境
* @return 如果是本机或者局域网,则认为是测试环境(为 true); 其它则认为是正在发布的环境(为 false)
* @example if (c$.isTest) alert('这是测试环境'); // 注意,这个是值,不是函数
*/
c$.isTest = (function() {
var url = window.location.href;
// 判断网址,如果是本机或者局域网,则认为是测试环境
return (url.indexOf("http://localhost") === || url.indexOf("http://127.0.0.1") === ||
url.indexOf("http://192.168.") === || url.indexOf("file://") === );
})(); /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
* 浏览器兼容 start
* --------------------------------------------------------------- */ /**
* 运行平台判断(是否 windows)
* @return 如果是 windows 平台则为“true”,其它平台则返回“false”
* @example if (c$.isWin) alert('这是 window 平台'); // 注意,这个是值,不是函数
*/
c$.isWin = (window.navigator.appVersion.toLowerCase().indexOf("win") != -); /**
* 获取浏览器类型
* @return [浏览器名称, 版本]
* @example if (c$.browser()[0] == 'IE') alert('这是 IE 浏览器, 版本号为:' + c$.browser()[1]);
*/
c$.browser = function() {
var thisFun = arguments.callee;
// 如果曾经获取过,不用再重复判断,以提高效率
return thisFun._retValue || (thisFun._retValue = (function() {
var ua = window.navigator.userAgent.toLowerCase();
if (ua.indexOf('msie') > -) return ['IE', ua.match(/msie ([\d.]+)/)[]];
if (ua.indexOf('firefox') > -) return ['Firefox', ua.match(/firefox\/([\d.]+)/)[]];
if (ua.indexOf('opera') > -) return ['Opera', ua.match(/opera.([\d.]+)/)[]];
if (ua.indexOf('chrome') > -) return ['Chrome', ua.match(/chrome\/([\d.]+)/)[]];
if (ua.indexOf('safari') > -) return ['Safari', ua.match(/version\/([\d.]+)/)[]];
return ['Other', null];
})());
}; /**
* 浏览器判断(注意,以下这些是值,不是函数)
* @example
* if (c$.browser.isIE) alert('这是 IE 浏览器');
* if (c$.browser.isIE6) alert('这是 IE6 浏览器');
* if (c$.browser.isNav) alert('这是 Netscape 浏览器');
* if (c$.browser.isFF) alert('这是 Firefox 浏览器');
* if (c$.browser.type == 'IE') alert('这是 IE 浏览器, 版本号为:' + c$.browser.version);
* alert('这是 ' + c$.browser.type + ' 浏览器, 版本号为:' + c$.browser.version);
*/
// 如果是火狐等浏览器则为“true”,IE浏览器则返回“false”
c$.browser.isNav = (window.navigator.appName.indexOf("Netscape") != -);
// 是否火狐
c$.browser.isFF = (window.navigator.userAgent.indexOf("Firefox") != -);
// 是否IE
c$.browser.isIE = (window.navigator.appName.indexOf("Microsoft") != -);
// 是否IE6
c$.browser.isIE6 = (window.navigator.userAgent && window.navigator.userAgent.split(";")[].toLowerCase().indexOf("msie 6.0") != -);
// 另一种获取浏览器类型的写法(值为字符串),值会有: IE, Firefox, Opera, Chrome, Safari, Other
c$.browser.type = c$.browser()[];
// 浏览器的版本(值为字符串)
c$.browser.version = c$.browser()[]; /**
* 获取事件的 event
*/
c$.getEvent = function() {
if (c$.browser.isIE) return window.event; // IE
var func = c$.getEvent.caller;
while (func != null) {
var arg0 = func.arguments[];
if (arg0 instanceof Event) {
return arg0;
}
func = func.caller;
}
return null;
}; //标准浏览器就FIX,让火狐兼容IE的写法
if (window.addEventListener) {
try {
// window.event 兼容
window.constructor.prototype.__defineGetter__("event", c$.getEvent); // event.srcElement 兼容;获取浏览器的事件源
Event.prototype.__defineGetter__("srcElement", function(){ return this.target || this.srcElement; }); // event.fromElement 兼容
Event.prototype.__defineGetter__("fromElement", function(){
var node;
if (this.type == "mouseover") {
node = this.relatedTarget;
}
else if (this.type == "mouseout") {
node = this.target;
}
if (!node) return;
while (node.nodeType != ) {
node = node.parentNode;
}
return node;
}); // event.toElement 兼容
Event.prototype.__defineGetter__("toElement", function(){
var node;
if (this.type == "mouseout") {
node = this.relatedTarget;
}
else if (this.type == "mouseover") {
node = this.target;
}
if (!node) return;
while (node.nodeType != ) {
node = node.parentNode;
}
return node;
}); // <element>.runtimeStyle 兼容
HTMLElement.prototype.__defineGetter__("runtimeStyle", function(){ return this.style; }); // <element>.innerText 兼容 (Getter)
HTMLElement.prototype.__defineGetter__("innerText", function(){
var anyString = "";
var childS = this.childNodes;
for (var i = , length = childS.length; i < length; i++) {
if (childS[i].nodeType == )
anyString += childS[i].tagName == "BR" ? '\n' : childS[i].innerText;
else if(childS[i].nodeType == ) {
anyString += childS[i].nodeValue;
}
}
return anyString;
});
// <element>.innerText 兼容 (Setter)
HTMLElement.prototype.__defineSetter__("innerText", function(sText) { this.textContent = sText; });
} catch(e){}
}
/* -------------------------------------------------------------------
* 浏览器兼容 end
* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */ /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
* 内置对象额外添加函数 start
* --------------------------------------------------------------- */ /**
* 去除字符串的前后空格
* @return 去除前后空格后的字符串
* @example " dd dd ".trim() // 返回: "dd dd"
*/
String.prototype.trim = function(direct) {
return this.replace(new RegExp("(^(\\s* *)*)|((\\s* *)*$)", "g"), "");
}; /**
* 全部替换字符串中的指定内容(正则表达式替换)
* @param regexp 把字符串里的regexp内容替换成newSubStr(此参数会作为正则表达式的字符串处理)
* @param newSubStr 把字符串里的regexp内容替换成newSubStr
* @param flags 正则表达式的匹配方式,有: g global(全文查找出现的所有 pattern),i ignoreCase(忽略大小写),m multiLine(多行查找);默认是 "gm"
* @return 替换后的字符串。注意:当regexp为空时,字符串的每个字前面都会加上newSubStr
* @example
* "add dda".replaceAll('a', '55') // 返回: "55dd dd55"
* "add+d+da".replaceAll('\\+', ' ') // 支持正则表达式的字符串替换,特殊字符需要转义,返回: "add d da"
*/
String.prototype.replaceAll = function(regexp, newSubStr, flags) {
regexp = regexp || '';
newSubStr = newSubStr || '';
flags = flags || 'gm';
var raRegExp = new RegExp("" + regexp, flags);
return this.replace(raRegExp, "" + newSubStr);
}; /**
* 全部替换字符串中的指定内容(非正则表达式替换)
* @param oldStr 要替换的内容
* @param newStr 替换成这个内容
* @return 替换后的字符串。注意:当 oldStr 为空时,不会替换
* @example
* "add dda".replaceAllStr('a', '55') // 返回: "55dd dd55"
* "add+d+da".replaceAllStr('+', ' ') // 不支持正则表达式的字符串替换,返回: "add d da"
*/
String.prototype.replaceAllStr = function(oldStr, newStr) {
if (!oldStr) return this;
var str = this;
while(str.indexOf(oldStr) != -) str = str.replace(oldStr, newStr);
return str;
}; /**
* 判断是否以子串开头
* @param sub 被判断的子串
* @return 是以子串开头则返回 true,否则返回false
*/
String.prototype.startWith = function(sub) {
if (this === sub || sub === '') return true;
return this.length >= sub.length && this.slice(, sub.length) === sub;
}; /**
* 判断是否以子串结尾
* @param sub 被判断的子串
* @return 是以子串结尾则返回 true,否则返回false
*/
String.prototype.endWith = function(sub) {
if (this === sub || sub === '') return true;
return this.length >= sub.length && this.slice( - sub.length) === sub;
}; /**
* 字符串格式化输出
* @param value 格式化的对象内容(说明: 1. 属性名称区分大小写; 2. 没有匹配到到属性输出原始字符串。)
* @return 格式化后的字符串
* @example "#1 Name:#Name, Age:#Age".format({Name:"zhangsan", Age:23 }); // 返回:"#1 Name:zhangsan, Age:23"
*/
String.prototype.format = function(value) {
return this.replace(new RegExp('#\\w+', 'gi'), function(match) {
var name = match.substring();
return value.hasOwnProperty(name) ? value[name] : match;
});
}; /**
* 获取字符长度
* @param chsLength 一个非拉丁文(如中文)占多少个字符,默认为2个 (改数据库时需改这里)
* @return 字符长度
* @example "aa哈哈".chsLeng() // 返回: 6
*/
String.prototype.chsLeng = function(chsLength) {
chsLength = (parseInt(chsLength) >= ) ? parseInt(chsLength) : ;
//去除非拉丁文(如中文)的长度
var noChsLength = this.replace(new RegExp('[^\x00-\xff]','gm'), "").length;
//中文长度
var chineseLength = (this.length - noChsLength) * chsLength;
return noChsLength + chineseLength;
}; /**
* 检查字符串是否包含中文,是则返回true,否则返回false (注:空字符串返回 false)
* @param isAllChinese 是否要求全部都为中文
* @return 不填 isAllChinese,或者 isAllChinese 为 false 时,只要包含有中文即返回true,不包含一个中文则返回false
* @return 当 isAllChinese 为 true 时,要求字符串全部都为中文则返回 true,如果有一个不为中文则返回false
*
* @example
* "aa哈哈".hasChinese() // 返回: true
* "aa哈哈".hasChinese(true) // 返回: false
*/
String.prototype.hasChinese = function(isAllChinese) {
if ("" === this) return false;
//去除中文的长度
var noChsLength = this.replace(new RegExp('[^\x00-\xff]','gm'), "").length;
// \u4E00-\u9FA5 是汉字, \uFE30-\uFFA0 是全角符号, \u3002 是句号, \u201C \u201D 是双引号
// var noChsLength = this.replace(new RegExp('([\u4E00-\u9FA5]|[\uFE30-\uFFA0]|[\u3002\u201C\u201D])','gm'), "").length;
return isAllChinese ? (noChsLength === ) : (noChsLength < this.length);
}; /**
* 检查字符串是否只由汉字、字母、数字组成
* @return boolean 如果通过验证返回true,否则返回false (注:空字符串返回 false)
*/
String.prototype.isChineseOrNumberOrLetter = function() {
return new RegExp("^[0-9a-zA-Z\u4e00-\u9fa5]+$").test(this);
}; /**
* 检查字符串是否只由数字、26个英文字母或者下划线组成
* @return boolean 符合返回true,否则返回false (注:空字符串返回 false)
*/
String.prototype.isNumber_Letter = function() {
return new RegExp("^\\w+$",'g').test(this);
}; /**
* 检查字符串是否只由数字、26个英文字母组成
* @return boolean 符合返回true,否则返回false (注:空字符串返回 false)
*/
String.prototype.isNumberLetter = function() {
return new RegExp("^[A-Za-z0-9]+$",'g').test(this);
}; /**
* 检查字符串是否为email地址
* @return boolean 符合返回true,否则返回false (注:空字符串返回 false)
*/
String.prototype.isEmail = function() {
return new RegExp("^[a-z0-9][a-z0-9\\-_.]*[a-z0-9]+@(([a-z0-9]([a-z0-9]*[-_]?[a-z0-9]+)+\\.[a-z0-9]+(\\.[a-z0-9]+)?)|(([1-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5])))\\.(([\\d]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5])))\\.){2}([1-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5])))))$",'gi').test(this.trim());
}; /**
* 检查字符串是否为日期格式(正确格式如: 2011-03-28 或者 11/3/28, 2011年03月28日, 20111028)
* @return boolean 符合返回true,否则返回false (注:空字符串返回 false)
*/
String.prototype.isDate = function() {
// 匹配检查
var r = this.hasChinese() ?
this.match(/^(\d{,})(年)((?[-])|([-]))月((?[-])|([]\d)|([]))日?$/) : // 中文处理
this.match(/^(\d{,})(-|\/|\.)?((?[-])|([-]))\((?[-])|([]\d)|([]))$/);
if ( r == null ) return false;
// 日期是否存在检查
var d = new Date(r[], r[]-, r[]);
return ((d.getFullYear()==r[] || d.getYear()==r[]) && (d.getMonth()+)==r[] && d.getDate()==r[]);
}; /**
* 检查字符串是否为时间格式(正确格式如: 13:04:06 或者 21时5分10秒, 210521)
* @return boolean 符合返回true,否则返回false (注:空字符串返回 false)
*/
String.prototype.isTime = function() {
// 匹配检查
var a = this.hasChinese() ?
this.match(/^(\d{,})([时時])(\d{,})分(\d{,})秒(\d+([毫微纳納诺諾皮可飞飛阿托]秒)?)?$/) : // 中文处理
this.match(/^(\d{,})(:)?(\d{,})\(\d{,})([.]?\d+)?$/);
if (a == null) return false;
// 时间检查
if (a[]>= || a[]>= || a[]>=) return false;
// 如果有“:”来分隔时间,则秒后面的数也要求有“.”来分隔
if (a[]==':' && a[] && a[].indexOf('.')==-) return false;
// 验证成功
return true;
}; /**
* 检查字符串是否为日期和时间格式 (正确格式如: 2003/12/05 13:04:06 或者 2001年10月20日10时5分30秒, 20110208230406)
* @return boolean 符合返回true,否则返回false (注:空字符串返回 false)
*/
String.prototype.isDateTime = function() {
var dateTimes = this.split(' ');
// 中文时,可以不用空格隔开日期和时间
if (dateTimes.length != && this.indexOf('日') != -) {
dateTimes = this.split('日');
dateTimes[] += '日';
}
// 无符号时,可以不用空格隔开日期和时间
if (dateTimes.length != && this.indexOf(':') == -
&& this.indexOf('-') == - && this.indexOf('/') == - && this.indexOf('.') == -) {
// 完整日期和时间
if (this.length >= ) {
dateTimes[] = this.substr(, );
dateTimes[] = this.substr();
}
// 短日期和时间,认为日期部分为6位
else {
dateTimes[] = this.substr(, );
dateTimes[] = this.substr();
}
}
// 英文时,必须空格隔开日期和时间
if (dateTimes.length != ) return false;
return (dateTimes[].isDate() && dateTimes[].isTime());
}; /**
* 检查字符串是否为URL地址
* @return boolean 符合返回true,否则返回false (注:空字符串返回 false)
*/
String.prototype.isUrl = function() {
return /^(ftp|http|https):\/\/(\w+:{,}\w*@)?(\S+)(:[-]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/.test(this);
}; /**
* 转换字符串成 Unicode 编码
* @return 转换后的字符串
* @example "哈,哈".toUnicode() 返回: "\u54C8\u002C\u54C8"
*/
String.prototype.toUnicode = function() {
// 注,不会编码的字符: * + - . / @ _ 0-9 a-z A-Z
return escape(this).
// 替换中文
replace(new RegExp('%u[0-9a-f]{4}', 'gim'), function(match) {
return '\\' + match.substring();
}).
// 替换英文符号
replace(new RegExp('%[0-9a-f]{2}', 'gim'), function(match) {
return "\\u00" + match.substring();
});
}; /**
* 转换字符串成 Html 页面上显示的编码
* @return 转换后的字符串
* @example "<div>".toHtmlCode() 返回: "&lt;div&gt;"
*/
String.prototype.toHtmlCode = function() {
var div = document.createElement('div');
var text = document.createTextNode(this);
div.appendChild(text);
return div.innerHTML;
}; /**
* 转换字符串由 Html 页面上显示的编码变回正常编码(以 toHtmlCode 函数对应)
* @return 转换后的字符串
* @example "&nbsp;".toTextCode() // 返回: " "
*/
String.prototype.toTextCode = function() {
// 以下逐一转换
var sour = this.
replaceAll("%", "%"). // 百分号
replaceAll("&lt;", "<", "gim").replaceAll("<", "<"). // 小于号
replaceAll("&gt;", ">", "gim").replaceAll(">", ">"). // 大于号
replaceAll("'", "'"). // 单引号
replaceAll("+", "+"). // 加号
replaceAll("\n?<br\\s*/?>\n?", "\n", "gim"). // 换行符
replaceAll("&quot;", '"', "gim").replaceAll(""", '"'). // 双引号
replaceAll("&nbsp;", " ", "gim").replaceAll(" ", " "). // 空格
replaceAll("(&amp;)|(&)", "&", "gim"); // & 符号,为避免二次转换,最后才转换
return sour;
}; /**
* 清除HTML标签
* @return 清除标签后的内容
* @example "<div>haha</div>".removeHtmlTag() 返回: "haha"
*/
String.prototype.removeHtmlTag = function() {
var text = this.trim().
replaceAll("<!--.*-->", ""). // 清除注释
replaceAll("</title>", "\n", "gim"). // 标题换行: </title> ==> 换行符
replaceAll("</tr>", "\n", "gim"). // tr换行: </tr> ==> 换行符
replaceAll("<[^>]+>", ""). // html标签清除
toTextCode(); // 转换字符串由 Html 页面上显示的编码变回正常编码
return text;
}; /**
* 格式化时间字符串
* @param format 格式化的字符串(默认为:yyyy-MM-dd HH:mm:ss )
* @return 格式化时间后的字符串
* @example new Date().format("yyyy-MM-dd HH:mm:ss.S")
*/
Date.prototype.format = function(format) {
// 默认显示格式
format = format || "yyyy-MM-dd HH:mm:ss"; var o = {
"M{1,2}" : this.getMonth()+, // 月份 (返回1~12,或者01~12)
"d{1,2}" : this.getDate(), // 日期 (返回1~31,或者01~31)
"[h|H]{1,2}" : this.getHours(), // 小时 (返回1~23,或者01~23)
"m{1,2}" : this.getMinutes(), // 分钟 (返回1~59,或者01~59)
"s{1,2}" : this.getSeconds(), // 秒 (返回1~59,或者01~59)
"q{1,2}" : Math.floor((this.getMonth()+)/), // 季度 (返回1~4,或者01~04)
"S" : this.getMilliseconds() // millisecond (返回1~999,或者01~99) 注意,“S”只能写一个
} // 年份处理
if (/([y|Y]+)/.test(format)) {
format = format.replace(RegExp.$,(this.getFullYear()+"").substr( - RegExp.$.length));
}
// 逐个处理
for (var k in o) {
if (new RegExp("("+ k +")").test(format)) {
format = format.replace(RegExp.$, (RegExp.$.length == ? o[k] :(""+ o[k]).substr((""+ o[k]).length)));
}
}
return format;
}; // opera浏览器 没有 数组的 concat 函数,兼容它
if (!Array.prototype.concat) {
Array.prototype.concat = function() {
var array = [];
for (var i = , length = this.length; i < length; i++) array.push(this[i]);
for (var i = , length = arguments.length; i < length; i++) {
if(arguments[i].constructor == Array) {
for(var j = , arrayLength = arguments[i].length; j < arrayLength; j++) {
array.push(arguments[i][j]);
}
} else {
array.push(arguments[i]);
}
}
return array;
};
} /**
* 数组的逐个执行
* @param func 对数组里的每个元素执行的函数
* @return 返回数组本身,以便使用连缀
*
* @example
* var arr = [1, 2, 3];
* arr.each(function(value, i){
* alert(value); // 会把逐个值 alert 处理
* alert(this.length); // 这里面的 this 是指被调用的数组 arr
* });
*/
Array.prototype.each = function(func) {
for (var i = , length = this.length; i < length; i++) func.call(this, this[i], i);
return this;
}; /**
* 清空数组
* @return 返回本数组(即清空后的情况,可以不接收返回值,原数组已经被清空)
*
* @example
* var arr = [1, 2, 3];
* arr.clear();
* alert(arr.length); // 提示为0
* alert(arr[0]); // 提示为 undefined
*/
Array.prototype.clear = function() {
this.length = ;
return this;
}; /**
* 查找数组里的某个值的下标
* @param value 要查找的值
* @return 查找到的值的下标,有多个这样的值时返回第一个查找到的下标,找不到则返回 -1
*
* @example
* var arr = ['a', 'b', 'c'];
* arr.indexOf('c'); // 返回 2
*/
Array.prototype.indexOf = function(value) {
for (var i = , length = this.length; i < length; i++) {
if (this[i] === value) return i;
}
return -;
}; /**
* 查找数组里的某个值的下标(从后面找起)
* @param value 要查找的值
* @return 查找到的值的下标,有多个这样的值时返回最后一个查找到的下标,找不到则返回 -1
*
* @example
* var arr = ['a', 'b', 'c', 'd', 'c'];
* arr.lastIndexOf('c'); // 返回 4
*/
Array.prototype.lastIndexOf = function(value) {
for (var i = this.length - ; i > ; i--) {
if (this[i] === value) return i;
}
return -;
}; /**
* 复制数组(浅拷贝)
* @return 返回复制后的数组
*
* @example
* var arr = ['a', 'b', 'c', 'd', 'c'];
* var arr2 = arr.clone(); // 返回的是另一个数组,对 arr2 的操作不再影响 arr
*/
Array.prototype.clone = function() {
return [].concat(this);
}; /**
* 判断数组里是否包含此值
* @param object 要查找的值, 可以有多个
* @return 只有一个参数时:包含有则返回 true,没有则返回 false;有多个参数时,要求每一个参数都包含才返回 true,否则返回 false
* 注:引用对象的判断,只是简单判断引用地址是否相等,不判断里面的值
*
* @example
* var arr = ['a', 'b', 'c'];
* arr.contains('c'); // 返回 true
* arr.contains('d'); // 返回 false
* arr.contains('c', 'a'); // 返回 true
* arr.contains('a', 'd'); // 返回 false
*/
Array.prototype.contains = function(value) {
for (var i=; i < arguments.length; i++) {
if (this.indexOf(arguments[i]) === -) return false;
}
return true;
}; /**
* 删除数组里的某些值(只删除第一个找到的值)
* @return 返回数组本身,以便使用连缀
*
* @example
* var arr = ['a', 'b', 'c', 'd', 'c'];
* arr.remove('c'); // 此时的数组删除了第一个'c', 为: ['a', 'b', 'd', 'c']
* arr.remove('a', 'd'); // 还可以同时删除多个值, 此时为: ['b', 'c']
* arr.remove('e'); // 传入数组里面没有的值,不对数组产生影响,也不会出现异常, 此时为: ['b', 'c']
*/
Array.prototype.remove = function() {
for (var i = ; i < arguments.length; i++) {
var value = arguments[i];
var index = this.indexOf(value);
if (index > -) this.splice(index, );
}
return this;
}; /**
* 删除数组里的某些值(删除所有找到的值)
* @return 返回数组本身,以便使用连缀
*
* @example
* var arr = ['a', 'b', 'c', 'd', 'c'];
* arr.removeAll('c'); // 此时的数组删除了所有的'c', 为: ['a', 'b', 'd']
* arr.removeAll('a', 'd'); // 还可以同时删除多个值, 此时为: ['b']
* arr.removeAll('e'); // 传入数组里面没有的值,不对数组产生影响,也不会出现异常, 此时为: ['b']
*/
Array.prototype.removeAll = function() {
var index;
for (var i = ; i < arguments.length; i++) {
var value = arguments[i];
// 赋值给 index 且判断是否大于 -1, 避免获取两次 index 以提高效率
while ((index = this.indexOf(value)) > -) {
this.splice(index, );
}
}
return this;
}; /**
* 返回没有重复值的新数组,原数组不改变
* @return 返回过滤重复值后的新数组
*
* @example
* var arr = ['a', 'b', 'c', 'd', 'c', null];
* var arr2 = arr.unique(); // arr2 为: ['a', 'b', 'd', 'c', null]
*/
Array.prototype.unique = function() {
var result = [];
for (var i=,l=this.length; i<l; i++) {
for (var j=i+; j<l; j++) {
if (this[i] === this[j]) j = ++i;
}
result.push(this[i]);
}
return result;
}; /**
* 对数组中的每个元素都执行一次指定的函数
* 并且创建一个新数组,该数组元素是所有回调函数执行时返回值为 true 的原数组元素。原数组不改变
* @param func 对数组里的每个元素执行的函数
* @return 以数组形式返回执行函数时返回值为 true 的原数组元素
*
* @example
* var arr = [1, 23, 54, 67, 42, 66];
* var arr2 = arr.filter(function (value, index) {
* alert(this.length); // 这里面的 this 是指被调用的数组 arr
* return value % 2 === 0; // 返回偶数
* });
* alert(arr2); // 值为: [54, 42, 66]
*/
Array.prototype.filter = function(func) {
var result = [], array = this;
this.each(function(value, index) {
if (func.call(array, value, index)) result.push(value);
});
return result;
}; /**
* 以数组形式返回原数组中不为 null 与 undefined 的元素。原数组不改变
* @return 以数组形式返回原数组中不为 null 与 undefined 的元素
*
* @example
* var arr = ['a', 'b', 'c', 'd', 'c', null];
* var arr2 = arr.notNull(); // arr2 为: ['a', 'b', 'c', 'd', 'c']
*/
Array.prototype.notNull = function() {
return this.filter(function (value) {
return value != null;
});
}; /**
* 返回数组里的最大值
* 如果数组里有不能直接转成数值的值,或者有 NaN,则返回 NaN;空值按0处理,能转成数值的字符串会被转成数值处理
* @return 返回数组里的最大值(number类型)
*
* @example
* var arr = ['66', 44, 32.1, null];
* var arr2 = ['66', 44, 32.1, null, 'a'];
* alert( arr.max() ); // 值为: 66
* alert( arr2.max() ); // 值为: NaN
*/
Array.prototype.max = function() {
return Math.max.apply(null,this);
}; /**
* 返回数组里的最小值
* 如果数组里有不能直接转成数值的值,或者有 NaN,则返回 NaN;空值按0处理,能转成数值的字符串会被转成数值处理
* @return 返回数组里的最小值(number类型)
*
* @example
* var arr = ['66', 44, 32.1, null, -1];
* var arr2 = ['66', 44, 32.1, null];
* alert( arr.min() ); // 值为: -1
* alert( arr2.min() ); // 值为: 0
*/
Array.prototype.min = function() {
return Math.min.apply(null,this);
}; /* -------------------------------------------------------------------
* 内置对象额外添加函数 end
* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */ /**
* 获取单选按钮对应的编号和名称
* @param boxName 单选按钮的name (注:不能根据id来查找)
* @param init 单选按钮的默认值
* @return 返回被选中的当选按钮的value
*/
c$.getRadioValue = function(boxName, init) {
init = init || '';
var elements = document.getElementsByName(boxName);
// 如果没有找到所要的单选按钮,则直接返回
if (!elements) return init; // 如果只有一个单选按钮
if ("radio" === elements.type && elements.checked) {
return elements.value;
}
// 循环检查选中哪个
for (var i = , length = elements.length; i < length; i++) {
//如果选中此单选按钮
if ("radio" === elements[i].type && elements[i].checked) {
return elements[i].value;
}
} return init;
}; /**
* checkbox全选: 全部勾上 或者全部不选
* @param checkboxList checkbox列表,可一个或者多个
* @param checked 为true则勾上,为false则全部不勾上;没有这参数则以列表的第一个的反选为准
* @return c$ 对象本身,以支持连缀
*/
c$.selectAll = function(checkboxList, checked) {
// 没有时选择所有的checkbox
if (!checkboxList) {
var inputList = document.getElementsByTagName('INPUT');
checkboxList = [];
for (var i = , length = inputList.length; i < length; i++) {
if (inputList[i].type === "checkbox") checkboxList.push(inputList[i]);
}
// 没有一个checkbox时,不用再执行
if ( checkboxList.length == ) return this;
}
// 没有这参数时
if ( typeof(checked) === 'undefined' ) {
checked = ( "checkbox" === checkboxList.type ) ? (!checkboxList.checked) : (!checkboxList[].checked);
}
// 保证 checked 为 boolean 值
checked = !!checked;
// 只有一个時
if ( "checkbox" === checkboxList.type ) {
checkboxList.checked = checked;
}
// 两个或者两个以上时
else {
for ( var i = , length = checkboxList.length; i < length; i++ ) {
checkboxList[i].checked = checked;
}
}
return this;
}; /**
* 创建一个类
* @param arg 类里面的属性和方法,其中 init 或者 initialize 属性可作为类的初始化函数
* @return 扩展后的类(可以不接收参数,原被扩展的类会被修改而引用不变)
*
* @example
* // 初始化类
* var Student = c$.create({
* init: function(name, age) {this.name=name; this.age=age;},
* show: function(){alert('name: ' + this.name + ' age:' + this.age);}
* });
* var stu1 = new Student('jack', 23); // new 一个实体类
* stu1.show();
* var stu2 = new Student('tom', 25); // 再 new 一个实体类
* stu2.show();
*/
c$.create = function(arg) {
function _fun() {
if (this.init && typeof this.init == 'function') this.init.apply(this, arguments);
else if (this.initialize && typeof this.initialize == 'function') this.initialize.apply(this, arguments);
}
if (arg && typeof arg == 'object') _fun.prototype = arg;
return _fun;
}; /**
* 类的扩展
* @param destination 被扩展的类
* @param 要扩展的内容
* @return 扩展后的类(可以不接收参数,原被扩展的类会被修改而引用不变)
*
* @example
* var a = new Object();
* c$.extend(a, {
* alertStr: function(str){alert(str);}
* });
* a.alertStr('要提示的内容'); // 调用
*/
c$.extend = function(destination, source) {
for (var property in source) {
destination[property] = source[property];
}
return destination;
}; /**
* 获取对象的所有键的数组
* @param object 对象
* @return 对象的所有键的数组
*/
c$.keys = function(object) {
var keys = [];
for (var property in object) {
keys.push(property);
}
return keys;
}; /**
* 获取对象的所有值的数组
* @param object 对象
* @return 对象的所有值的数组
*/
c$.values = function(object) {
var values = [];
for (var property in object) {
values.push(object[property]);
}
return values;
}; /**
* 返回某对象的复制(浅拷贝)
* @param object 对象
* @return 对象的所有值的数组
*/
c$.clone = function(object) {
return c$.extend({}, object);
}; /**
* 将对象转换成字符串
* @param strValue 包含字符串的对象
* @return 对象的字符串
*/
c$.toStr = function(strValue) {
if (strValue || === strValue || false === strValue) return ("" + strValue);
// 不能转换的返回空字符串
return "";
}; /**
* 转成 int 类型
* @param str 需转换的字符串
* @return int 数值,转换不成功则返回0
*/
c$.toInt = function(str) {
//return (parseInt(str, 10) || 0);
return str >> ;
}; /**
* 转成 float 类型
* @param str 需转换的字符串
* @return float 数值,转换不成功则返回0
*/
c$.toFloat = function(str) {
return (parseFloat(str) || );
}; /**
* 把数值转化成指定的数值字符串,指定小数位,可加逗号
* @param value 需转化的数值
* @param decimal 小数位。不指定则有小数的默认两位,没小数的不加小数(舍去部分会四舍五入)
* @param signNumber 数字每隔多少位加一个逗号,默认不加逗号
* @return 处理后的数值字符串
* @example c$.toNumberStr('15154514541.6471', 2, 3) // 返回字符串: 15,154,514,541.65
*/
c$.toNumberStr = function(value, decimal, signNumber) {
var retValue = "";
//如果没有value值,赋值为0
value = value || "";
//如果不是数值
if (false === c$.isNumber(value)) value = ""; //去除前后空格,去除数值中的逗号
value = ("" + value).trim().replaceAll(",");
//去除非数值,以及0开头的内容
value = "" + parseFloat(value); //分解字符串; number[0]为整数部分, number[1]为小数部分
var number = value.split(".");
//如果字符串是个整数
if ( === number.length) number[] = "";
number[] = ""; //如果是负数
if ( === value.indexOf("-")) {
number[] = number[].replace("-", "");
retValue += "-";
}
//如果是加号开头
if ( === value.indexOf("+")) {
number[] = number[].replace("+", "");
retValue += "+";
} //如果没有设定小数字,看数值情况,有小数的默认两位,没小数的不加小数
if (!decimal && !== decimal && value.indexOf(".") > ) decimal = ;
decimal = decimal>>; // 取整
//如果是科学计数法的数字
if (number[].indexOf("e") > ) {
var numberArry = number[].split("e");
number[] = numberArry[];
number[] = "e" + numberArry[];
decimal -= parseInt(numberArry[]);
}
//如果指定保留多少位小数
if ( < decimal) {
//给结果补足要求保留的小数字
for (var i = ; i < decimal; i++) {
number[] += "";
}
//四舍五入
var tem_number = retValue + number[] + number[].substring(, decimal) + "." + number[].substring(decimal, number[].length);
tem_number = "" + Math.round(tem_number);
var intLength = (retValue + number[]).length;
number[] = tem_number.substring(intLength, intLength + decimal);
} signNumber = signNumber>>; // 取整
//如果需要分隔数字
if ( < signNumber) {
//整数的第一部分的长度
var tem = number[].length % signNumber;
//如果整数部分的长度刚好是signNumber的倍数
if ( === tem) tem = signNumber;
//整数的第一部分
retValue += number[].substring(, tem);
//整数的其他部分
for (var i = ; i < parseInt((number[].length + signNumber - ) / signNumber); i++) {
var j = (i - ) * signNumber + tem;
retValue += "," + number[].substring(j, j + signNumber);
}
}
//如果不需要分隔数字
else {
retValue += number[];
} // 如果有小数则加上
if ((number[] + number[]).length > ) retValue += "." + number[] + number[]; // 返回数值字符串
return retValue;
}; /**
* 获取 form 表单的所有元素(仅 input, checkbox 等可以表单提交的元素)
* @param formField 表单(没有参数则是整个页面的所有 form),给出的不是 form 元素而是 div,table 之类的元素也可以
* @return 返回一个数组,里面保存着获取的元素
*/
c$.getElements = function(formField) {
//储存元素
var elements = [];
// 如果传入的是字符串,则根据此字符串获取对象
if (typeof formField === 'string') formField = c$(formField);
// 获取指定form的元素
if (c$.isElement(formField)) {
if (formField.tagName == 'FORM') {
elements = formField.elements;
}
// 如果给出的不是form,而是div之类的,照样获取里面可提交的元素
else {
elements = formField.getElementsByTagName('INPUT');
var selects = formField.getElementsByTagName('SELECT');
if (selects && selects.length > ) {
for(var i=, length = selects.length; i<length; i++){
elements.push(selects[i]);
}
}
var textareas = formField.getElementsByTagName('TEXTAREA');
if (textareas && textareas.length > ) {
for(var i=, length = textareas.length; i<length; i++){
elements.push(textareas[i]);
}
}
}
}
// 获取form的所有元素
else {
var formArray = document.forms;
for (var i = ; i < formArray.length; i++) {
formField = formArray[i];
for (var j = , length = formField.length; j < length; j++) {
elements.push(formField[j]);
}
}
}
// 返回元素列表
return elements;
}; /**
* 检查窗体是否可送出
* @param formField 待检查的form,给出的不是 form 元素而是 div,table 之类的元素也可以
* @param type 提示类型,有: alert(逐步提示,缩写A)、confirm(逐步判断,缩写C)、show(文字显示,缩写S,默认是show)
* 注: 以 alert 或者 confirm 提示信息时,只要有其中一个验证不正确则不再验证下面,直接返回 false,避免不断地alert;而show则验证完整个form
* 如果 type 是 show 类型,且需要指定页面显示位置,则可指定显示元素的id或者name,如: type={id:'显示元素的id', name:'显示元素的name'}
* @return boolean 检查是否通过
*
* @example
* <form action="#">
* <table>
* <tr>
* <td>名称:<input name="txt1" type="text" checkType="R{请输入名称}S{id:'error1'}" onchange="c$.checkElement(this)"/></td>
* <td id="error1">&nbsp;</td>
* </tr>
* <tr>
* <td>金额:<input name="txt2" type="text" checkType="S{id:'error2'}F{max:999.99, min:0, dec:2, msg:'请输入正确的金额'}" onchange="c$.checkElement(this)"/></td>
* <td id="error2">&nbsp;</td>
* </tr>
* <tr>
* <td>人数:<input name="txt3" type="text" checkType="S{id:'error3'}R{请输入人数}I{max:999, min:0, msg:'请输入正确的人数'}" onchange="c$.checkElement(this)"/></td>
* <td id="error3">&nbsp;</td>
* </tr>
* </table>
* <input type="submit" value="提交" onclick="return c$.checkForm(this.form);" />
* </form>
*/
c$.checkForm = function(formField, type) {
// 类型默认是 show,
type = type || 'show';
// 转成小写
type = typeof(type)=='string' ? type.toLowerCase() : type; var return_value = true;
//元素列表
var elements = c$.getElements(formField); //检查窗体的所有元素
for (var index=, length=elements.length; index < length; index++) {
if (false === c$.checkElement(elements[index], type)) {
return_value = false;
// alert 和 confirm 验证需要中断,避免不断地提示
if (type === 'alert' || type === 'a' || type === 'confirm' || type === 'c') return false;
}
}
//检查通过
return return_value;
}; /**
* 检查一个元素
* @param element 需检查的元素
* @param type 提示类型,有: alert(缩写A)、confirm(缩写C)、show(文字显示,缩写S,默认是show)
* 如果 type 是 show 类型,且需要指定页面显示位置,则可指定显示元素的id或者name,如: type={id:'显示元素的id', name:'显示元素的name'}
* @retrn boolean 检查通过返回true,否则返回false
*
* @example
* <input id="txt1" name='txt1' type="text" checkType="R{请输入金额}F{max:999.99, min:0, dec:2, msg:'请输入正确的金额'}" />
* <input type="submit" value="提交" onclick="return c$.checkElement(document.getElementById('txt1'));" />
*
* 说明: 检查类型的关键词需紧跟大括号,不跟大括号则提示“M”的讯息或者默认的讯息;
* 使用“C”关键词则是选择提示框,点选“确定”可忽略此提示
* 大括号里面的 msg 属性是对应的提示讯息,需用引号括起来; 大括号里面没有冒号则认为全是提示讯息; 注:不能嵌套大括号
*/
c$.checkElement = function(element, type) {
//防呆
if (!element) return true;
// 类型默认是 show,
type = type || 'show';
// 转成小写
type = typeof(type)=='string' ? type.toLowerCase() : type; //所有需检查讯息
var message = c$.toStr(element.getAttribute("checkType")).trim();
if (''===message)return true;//防呆
//获取需检查的类型,去除大括号里面的内容
var checkType = message.replace(new RegExp("({[^}]*})*", 'g'), "").toUpperCase();
var value = element.value; //验证类型
//必须输入 (用法: checkType="R{请输入名称}" 或者 checkType="R{msg:'请输入名称'}" 或者 checkType="M{请输入名称}R")
var R_pos = (checkType.indexOf('R') > -); //整型 (用法: checkType="I{max:100, min:-50, name:'人数'}" 或者 checkType="I{min:-50,max:100,msg:'请输入正确的人数'}")
// 注:有 name 属性时, msg 属性将不会生效; name属性是提示讯息的名称; 属性 max, min 分别表示最大值最小值(含)
var I_pos = (checkType.indexOf('I') > -); //浮点型 (用法: checkType="F{max:999.99, min:0, dec:2, name:'金额'}" 或者 checkType="F{dec:2,max:999.99,msg:'请输入正确的金额'}")
// 注:有 name 属性时, msg 属性将不会生效; name属性是提示讯息的名称; dec 属性表示小数字数限制; 属性 max, min 分别表示最大值最小值(含)
var F_pos = (checkType.indexOf('F') > -); //验证字母数字 (用法: checkType="E{ID只能是字母和数字}" 或者 checkType="E{msg:'ID只能是字母和数字'}")
var E_pos = (checkType.indexOf("E") > -); //验证字母数字下划线 (用法: checkType="N{ID只能是字母,数字和下划线}")
var N_pos = (checkType.indexOf("N") > -); //验证输入长度 (用法: checkType="L{len:100, msg:'名称长度不能超过100'}")
var L_pos = (checkType.indexOf("L") > -); //验证 email (用法: checkType="@{请输入正确的邮箱地址}")
var EMail_pos = (checkType.indexOf("@") > -); //验证 日期 (用法: checkType="D{日期输入不正确}" 或者 checkType="D{msg:'日期输入不正确'}")
var D_pos = (checkType.indexOf("D") > -); //验证 时间 (用法: checkType="T{时间输入不正确}" 或者 checkType="T{msg:'时间输入不正确'}")
var T_pos = (checkType.indexOf("T") > -); //验证 日期和时间 (用法: checkType="V{时间输入不正确}" 或者 checkType="V{msg:'时间输入不正确'}")
var V_pos = (checkType.indexOf("V") > -); //验证 URL (用法: checkType="U{URL地址输入不正确}" 或者 checkType="U{msg:'URL地址输入不正确'}")
var U_pos = (checkType.indexOf("U") > -); // 共享的提示讯息,可以多个验证都提示此一个(用法: M{提示讯息})
var M_pos = (checkType.indexOf('M') > -); //确认提示框,以提示框的形式提示出来,并可以选择是否忽略此提示
var C_pos = (checkType.indexOf('C') > -) || type === 'confirm' || type === 'c'; // 直接显示到页面,不使用提示框
// 用法: 建议在函数的type参数上设值,也可以在元素上设定: checkType="R{请输入名称}S{id:'text1', name:'text1'}" 或者 checkType="SR{请输入名称}"
// 可根据属性 id 或者 name 获取要显示的位置,不写参数则默认显示在节点的后面; 显示内容使用 .innerHTML 追加进去,红色字体显示
var S_pos = (checkType.indexOf('S') > -) || type === 'show' || type === 's' || !!(type.id) || !!(type.name); var thisFun = arguments.callee;
/*
* 获取所需检查的类型的类别(匿名函数,仅供此函数内部使用; 缓存此函数以减少内存消耗)
* @param key 对应的键
* @param message 所有需检查讯息
* @return Object 所需检查的类型的类别
*/
var getCheckTypeObj = thisFun.getCheckTypeObj || (thisFun.getCheckTypeObj = function(key, message) {
var upMess = message.toUpperCase();
// 如果此关键词没有跟大括号,返回空类别
if (upMess.indexOf(key + "{") < ) return {};
// 取出对应的大括号的讯息
var key_mess = message.substring(upMess.indexOf(key + "{")+);
key_mess = key_mess.substring(, key_mess.indexOf('}') + );
try {
// 将大括号的讯息转成的类别
eval("var tem_obj = " + key_mess);
return tem_obj;
}
catch (e) {
// 如果大括号里面的讯息不能转成类别,则认为它全是提示讯息
return {msg: key_mess.substring(, key_mess.length - )};
}
}); /*
* 提示出对应的讯息(匿名函数,仅供此函数内部使用)
* @param key 对应的键
* @param element 需检查的元素
* @param message 所有需检查讯息
* @param iniMess 默认的提示讯息
* @return boolean 一般都返回false,仅当显示选择框点选“是”时返回true
*/
var showDialog = thisFun.showDialog || (thisFun.showDialog = function(key, element, message, C_pos, S_pos, iniMess) {
// 获取提示讯息
var alert_message = (getCheckTypeObj(key, message).msg || getCheckTypeObj("M", message).msg || iniMess) + "!"; c$.setFocus(element); // "C"类型用 confirm 选择框
if (C_pos) return confirm(alert_message);
// "S"类型用文字显示到页面
if (S_pos) {
var tem_obj = getCheckTypeObj("S", message);
// 创建一个对象来显示内容
var font = document.createElement('font');
font.color = 'red';
// 以 element 作为提示元素的标志
font.element = element;
font.innerHTML = alert_message; var showElement = null;
if (tem_obj.id) showElement = document.getElementById(tem_obj.id);
else if (tem_obj.name) showElement = document.getElementsByName(tem_obj.name)[];
else if (type.id) showElement = document.getElementById(type.id);
else if (type.name) showElement = document.getElementsByName(type.name)[]; // 没有获取到显示的元素,或者设置id或者name属性时,追加到节点后面
if (!showElement) {
document.body.appendChild(font);
// 插入到元素的后面
var pos = element.nextSibling;
pos.parentNode.insertBefore(font, pos);
}
else {
showElement.appendChild(font);
var br = document.createElement('br');
br.element = element;
showElement.appendChild(br);
}
}
else {
// 使用 alert 提示出来
alert(alert_message);
}
return false;
}); // 页面显示提示信息时,先清除页面的旧显示
if (S_pos) {
var tem_obj = getCheckTypeObj("S", message);
var showElement = null;
if (tem_obj.id) showElement = document.getElementById(tem_obj.id);
else if (tem_obj.name) showElement = document.getElementsByName(tem_obj.name)[];
else if (type.id) showElement = document.getElementById(type.id);
else if (type.name) showElement = document.getElementsByName(type.name)[]; // 没有获取到显示的元素,或者设置id或者name属性时,追加到节点后面
if (!showElement) {
var nextElement = element.nextSibling;
if (nextElement && nextElement.tagName && nextElement.element === element) {
nextElement.parentNode.removeChild(nextElement);
}
}
else {
var childs = showElement.childNodes;
for (var i=, length = childs.length; i < length; i++) {
if (childs[i] && childs[i].tagName && childs[i].element === element) {
showElement.removeChild(childs[i]); // 删除 font 标签
showElement.removeChild(childs[i]); // 删除 br 标签
break;
}
}
}
} //一定要输入
if (R_pos && "" === value && false === showDialog("R", element, message, C_pos, S_pos, "请输入必要的值")) {
return false;
}
//可以不输入时
else if ("" === value) {
return true;
}
//验证整形
if (I_pos) {
var tem_obj = getCheckTypeObj("I", message);
if (S_pos) {
var checkResult = c$.isInt(element, tem_obj.max, tem_obj.min, tem_obj.name, false, S_pos);
if (true !== checkResult && false === showDialog("I", element, message, C_pos, S_pos, checkResult.errMessage || "请输入正确的整数值")) return false;
}
else if (false === c$.isInt(element, tem_obj.max, tem_obj.min, tem_obj.name, false)) {
//有name属性时按名称提示,这里不用重复提示; 否则取提示讯息
if (tem_obj.name || false === showDialog("I", element, message, C_pos, S_pos, "请输入正确的整数值")) {
return false;
}
}
}
//验证浮点型
if (F_pos) {
var tem_obj = getCheckTypeObj("F", message);
if (S_pos) {
var checkResult = c$.isNumber(element, tem_obj.max, tem_obj.min, tem_obj.dec, tem_obj.name, false, S_pos);
if (true !== checkResult && false === showDialog("F", element, message, C_pos, S_pos, checkResult.errMessage || "请输入正确的数值")) return false;
}
else if (false === c$.isNumber(element, tem_obj.max, tem_obj.min, tem_obj.dec, tem_obj.name, false)) {
//有name属性时按名称提示,这里不用重复提示; 否则取提示讯息
if (tem_obj.name || false === showDialog("F", element, message, C_pos, S_pos, "请输入正确的数值")) {
return false;
}
}
}
//验证输入长度
if (L_pos) {
var tem_obj = getCheckTypeObj("L", message);
if (value.length > tem_obj.len && false === showDialog("L", element, message, C_pos, S_pos, "输入的内容超过长度了,请缩短内容")) {
return false;
}
}
//验证字母数字组合
if (E_pos && false === value.isNumberLetter() && false === showDialog("E", element, message, C_pos, S_pos, "此处只能输入字母和数字")) return false;
//验证字母数字下划线组合
if (N_pos && false === value.isNumber_Letter() && false === showDialog("N", element, message, C_pos, S_pos, "此处只能输入字母、数字和下划线")) return false;
//email验证
if (EMail_pos && false === value.isEmail() && false === showDialog("@", element, message, C_pos, S_pos, "请输入正确的邮箱地址")) return false;
//日期验证
if (D_pos && false === value.isDate() && false === showDialog("D", element, message, C_pos, S_pos, "请输入正确的日期")) return false;
//时间验证
if (T_pos && false === value.isTime() && false === showDialog("T", element, message, C_pos, S_pos, "请输入正确的时间")) return false;
//日期和时间验证
if (V_pos && false === value.isDateTime() && false === showDialog("V", element, message, C_pos, S_pos, "请输入正确的时间")) return false;
//URL验证
if (U_pos && false === value.isUrl() && false === showDialog("U", element, message, C_pos, S_pos, "请输入正确的URL地址")) return false; //检查通过
return true;
}; /**
* 整数检查,判断对象是否为数字(包括负数、科学记数法、逗号分隔的数)
* @param element 需检查的对象,或者是字符串
* @param max 最大值(含), 默认为 2147483647
* @param min 最小值(含), 默认为 -2147483648
* @param name 提示的讯息的名称
* @param isMust 是否可以为空,true表示不可以为空, 否则可为空
* @param isAlert 是否以alert提示出错信息,为true时返回出错信息但不提示,否则以alert提示。验证没错时,不管 isAlert 是什么值都将返回 true
* 注: isAlert 为false或者没有这参数时,直接 alert 提示出错信息,返回结果是 true 或 false。
* 但 isAlert 为true,且出错时,将返回结果对象:{result:true|false, errMessage:'出错信息'}
* @return boolean 验证符合则返回true,否则返回false
* @example if(c$.isInt(document.getElementById("amt"), 9999999, -9999999, "人数", flase))...
*/
c$.isInt = function(element, max, min, name, isMust, isAlert) {
// 没有最大值时,默认为整型的最大值
if (typeof(max) !== 'number') {
max = ;
}
// 没有最大值时,默认为整型的最大值
if (typeof(min) !== 'number') {
min = -;
}
return c$.isNumber(element, max, min, , name, isMust, isAlert);
}; /**
* 数字检查,判断对象是否为数字(包括负数、科学记数法、逗号分隔的数)
* @param element 需检查的对象,或者是字符串
* @param max 最大值(含)
* @param min 最小值(含)
* @param decimal 小数多少位
* @param name 提示的讯息的名称
* @param isMust 是否可以为空,true表示不可以为空, 否则可为空
* @param isAlert 是否以alert提示出错信息,为true时返回出错信息但不提示,否则以alert提示。验证没错时,不管 isAlert 是什么值都将返回 true
* 注: isAlert 为false或者没有这参数时,直接 alert 提示出错信息,返回结果是 true 或 false。
* 但 isAlert 为true,且出错时,将返回结果对象:{result:true|false, errMessage:'出错信息'}
* @return boolean 验证符合则返回true,否则返回false
*
* @example if(c$.isNumber(document.getElementById("amt"), 9999999.999, -9999999.999, 3, "金额", flase))...
*/
c$.isNumber = function(element, max, min, decimal, name, isMust, isAlert) {
var thisFun = arguments.callee;
//出错时: 提示讯息,设定焦点,返回true
var doError = thisFun.doError || (thisFun.doError = function(msg, name, element, isAlert) {
var tem_name = name || '此项';
msg = msg.format({ name:tem_name });
// 有 isAlert 时不提示,但返回出错结果
if (isAlert) return {result:false, errMessage:msg};
// 有 name 属性时提示讯息,没有则不提示
if (name) {
c$.setFocus(element);
alert(msg);
}
return false;
}); //获取字符串
var str = element.value || element.innerHTML || "" + element;
//去除空白; 去除逗号; 转成大写
str = str.replace(/\s/gi, '').replace(/[,]/gi, '').toUpperCase(); //不可以为空; 提示讯息: 请输入 name !
if (true === isMust && "" === str) return doError("请输入 #name !", name, element, isAlert);
//可以为空
if (!isMust && "" === str) return true; //是否为数值; 提示讯息: name 不是正确的数字!
if (!str.match(/^[+-]?\d+([.]?\d*)([eE][+-]\d+)?$/g)) return doError("#name 不是正确的数字!", name, element, isAlert);
// 如果没有指定最大值,不可以超过数值的最大值
if ( !== max && !max) max = Number.MAX_VALUE;
//判断最大值,提示讯息: name 不能大于 max
if (parseFloat(str) > parseFloat(max)) return doError("#name 不能大于 " + max, name, element, isAlert);
// 如果没有指定最小值,不可以小于数值的最小值
if ( !== min && !min) min = - * Number.MAX_VALUE;
//判断最小值,提示讯息: name 不能小于 min
if (parseFloat(str) < parseFloat(min)) return doError("#name 不能小于 " + min, name, element, isAlert); //小数判断
decimal = parseInt(decimal);
if (decimal >= && (str.indexOf(".") > - || str.indexOf("E") > -)) {
//获取小数点后的数字
var val = str.replace(/^[+-]?\d+[.]/g, '');
val = val.replace(/*([E][+-]\d+)?$/g, '');
//小数长度
var decimalLength = val.length; //如果是科学记算法
if (str.indexOf("E") > -) {
decimalLength = val.length - parseInt(str.substring(str.indexOf("E") + , str.length));
}
// 要求整数时; 提示讯息: name 必须是整数
if (decimal === && (decimalLength > || (str.indexOf(".") > - && str.indexOf("E") == -))) {
return doError("#name 必须是整数!", name, element, isAlert);
}
//小数位判断; 提示讯息: name 请保留 decimal 位小数
if (decimalLength > decimal) {
return doError("#name 请保留 " + decimal + " 位小数!", name, element, isAlert);
}
}
//检验通过
return true;
}; /**
* 判断对象是否函数
* 说明:因为 typeof 判断可能会把 dom 对象、正则等判断为 function,故此做严谨判断
* @param fn 需判断的对象
* @return 是函数则为 true, 否则为 false
*/
c$.isFunction = function(fn) {
return (!!fn && !fn.nodeName && fn.constructor != String && fn.constructor != RegExp && fn.constructor != Array && /function/i.test( fn + "" ));
}; /**
* 判断对象是否页面元素
* @param obj 需判断的对象
* @return 是页面元素则为 true, 否则为 false
*/
c$.isElement = function(obj) {
return !!(obj && obj.nodeType == );
}; /**
* 清除form里各元素的值
* @param form 需操作的form元素对象,默认所有form,给出的不是 form 元素而是 div,table 之类的元素也可以
* @return c$ 对象本身,以支持连缀
*/
c$.clearForm = function(form) {
//元素列表
var elements = c$.getElements(form); // 逐个元素处理
for (var i = , length = elements.length; i < length; i++) {
var tagName = elements[i].tagName.toLowerCase();
if (tagName === "textarea" || tagName === "select") {
elements[i].value = "";
continue;
} // 处理 input
// "button", "submit", "reset", "hidden", "image" 类型的不处理
if (!elements[i].type) continue;
var type = elements[i].type.toLowerCase();
// 选择项
if ("checkbox" === type || "radio" === type) elements[i].checked = false;
// 单行输入框, 多行输入框, 下拉选单
else if ("text" === type || "password" === type) elements[i].value = "";
// 文件上传框
else if ("file" === type) {
//elements[i].value = ""; // firfox
//elements[i].outerHTML = elements[i].outerHTML; // IE
c$.clearFileInput(elements[i]); // 上面两行的写法也可以,只是改用这种更加好
}
}
return this;
}; /**
* 清空file的值
* @param file file元素
* @return c$ 对象本身,以支持连缀
*/
c$.clearFileInput = function(file) {
// 建立临时form来实现
var form = document.createElement('form');
document.body.appendChild(form);
// 记住file在旧窗体中的地址
var pos = file.nextSibling;
form.appendChild(file);
form.reset();
pos.parentNode.insertBefore(file,pos);
document.body.removeChild(form);
return this;
}; /**
* 过滤数字(不符合的不让输入)
* @param isFloat 是否允许输入一个小数点
* @param event 兼容 IE 和 FireFox 的事件
* @example <input type="text" name="stdcost" onkeydown="return c$.inputNumber(true, event);"/>
*/
c$.inputNumber = function(isFloat, event) {
event = event || window.event;
// 获取事件源
var source = event.target || event.srcElement;
// 不允许 shift 键
if ( event.shiftKey === true) return false; var keyCode = event.charCode || event.keyCode;
// 只允许输入数字、删除、左右键; 小数时可输入一个小数点
if ( (keyCode >= && keyCode <= ) || (keyCode >= && keyCode <= ) ||
keyCode === || keyCode === || keyCode === || keyCode === ||
(isFloat && (keyCode === || keyCode === ) && source.value.length> && source.value.indexOf(".") == -)
) return true; return false;
}; /**
* 过滤字母(不符合的不让输入)
* @param event 兼容 IE 和 FireFox 的事件
* @example <input type="text" name="stdcost" onkeydown="return c$.inputLetter(event);"/>
*/
c$.inputLetter = function(event) {
event = event || window.event;
// 不允许 ctrl 键和 shift 键
if ( event.ctrlKey === true || event.shiftKey === true) return false; var keyCode = event.charCode || event.keyCode;
// 只允许输入字母、删除、左右键
if ((keyCode >= && keyCode <= ) || keyCode == || keyCode == || keyCode == || keyCode == ) return true; return false;
}; /**
* 过滤字母数字(不符合的不让输入)
* @param event 兼容 IE 和 FireFox 的事件
* @example <input type="text" name="stdcost" onkeydown="return c$.inputNumLetter(event);"/>
*/
c$.inputNumLetter = function(event) {
event = event || window.event;
// 不允许 ctrl 键和 shift 键
if ( event.ctrlKey === true || event.shiftKey === true) return false; var keyCode = event.charCode || event.keyCode;
// 只允许输入字母、数字、删除、左右键
if ((keyCode >= && keyCode <= ) ||
(keyCode >= && keyCode <= ) || (keyCode >= && keyCode <= ) ||
keyCode == || keyCode == || keyCode == || keyCode ==
) return true; return false;
}; /**
* 设定按钮是否可用
* @param isDisabled 是否不可用,true为不可用,false为可用(默认可用)
* @param dom Dom对象,默认是 document
* @return c$ 对象本身,以支持连缀
*
* @example
* c$.setButtonUsed(true); // 设置页面上所有的按钮都不可用
* c$.setButtonUsed(); // 恢复页面上所有的按钮都可用
*/
c$.setButtonUsed = function(isDisabled, dom) {
isDisabled = isDisabled || false;
dom = dom || document; //INPUT对象
var obj = dom.getElementsByTagName("INPUT");
//INPUT对象判断
for (var i = , length = obj.length; i < length; i++) {
var type = obj[i].type.toUpperCase();
if (type == "BUTTON" || type == "SUBMIT" || type == "RESET") {
obj[i].disabled = isDisabled;
}
} //BUTTON对象
var obj = dom.getElementsByTagName("BUTTON");
//INPUT对象判断
for (var i = , length = obj.length; i < length; i++) {
obj[i].disabled = isDisabled;
}
return this;
}; /**
* 设置元素可用或者不可用
* @param objEle 元素对象(要设置多个元素可传此参数为数组,如果元素是iframe,则改变整个iframe)
* @param canUse 是否可用,true为可用,false为不可用(默认不可用)
* @return c$ 对象本身,以支持连缀
*
* @example
* c$.setElementDisable(document.getElementById('text1')); // 设置id为text1的元素不可用
* c$.setElementDisable(document.getElementById('text1'),true); // 恢复id为text1的元素可用
*/
c$.setElementDisable = function(objEle, canUse) {
// 防呆
if (!objEle || (!objEle.tagName && !objEle.length)) return this;
// 设置是否可用(默认不可用)
var disabled = !canUse; if (objEle.tagName) {
var tagName = objEle.tagName.toLowerCase();
// 输入框,可用而不可写
if ("textarea" === tagName) {
objEle.disabled = false;
objEle.readOnly = disabled;
}
// 图片, 下拉菜单, 选择框
else if ("img" === tagName || 'button' === tagName || 'select' === tagName) {
objEle.disabled = disabled;
}
// A 标签
else if ("a" === tagName) {
objEle.disabled = disabled;
// 修改点击事件
if (disabled) {
// 有 onclick 事件,则先备份着
if (objEle.onclick) objEle.onclick_bak = objEle.onclick;
// 修改点击事件
objEle.onclick = function(){return false;};
}
// 让 A 可用时,让它可点击,并还原点击事件
else {
// 有备份着 onclick 事件,则还原
if (objEle.onclick_bak) {
objEle.onclick = objEle.onclick_bak;
objEle.onclick_bak = null;
}
else {
objEle.onclick = null;
}
}
}
// iframe 框架,设置里面的全部元素
else if ("iframe" === tagName) {
var dom = objEle.contentDocument || objEle.contentWindow.document;
// 存在跨域问题时, iframe 的 document 不可访问
if (dom) c$.setDomDisable(canUse, dom);
}
// input 元素
else if (objEle.type) {
var type = objEle.type.toLowerCase();
// 输入框,可用而不可写
if ("text" === type) {
objEle.disabled = false;
objEle.readOnly = disabled;
}
// 选择框,按钮
else if ("radio" === type || "checkbox" === type || "button" === type || "submit" === type || "reset" === type) {
objEle.disabled = disabled;
}
}
}
// 数组,要递归
else if (objEle.length) {
for (var i = , length = objEle.length; i < length; i++) {
c$.setElementDisable(objEle[i], canUse);
}
}
return this;
}; /**
* 设置整个页面的元素都可用或者都不可用 (对frame,iframe里面的元素暂未处理)
* @param canUse 是否可用,true为可用,false为不可用(默认不可用)
* @param dom Dom对象,默认是 document
* @param notChangeArr 不需要设置的元素的数组
* @return c$ 对象本身,以支持连缀
*
* @example
* c$.setDomDisable(); // 设置整个页面所有的元素都不可用
* c$.setDomDisable(true); // 恢复整个页面所有的元素都可用
* c$.setDomDisable(false, document, [document.getElementById('btn'), document.getElementById('btn2')]); // 除id为btn,btn2的两个元素外,设置整个页面不可用
*/
c$.setDomDisable = function(canUse, dom, notChangeArr) {
dom = dom || window.document;
notChangeArr = notChangeArr || [];
var elements = dom.getElementsByTagName("*");
// 逐个元素遍历修改
out: for (var i = , length = elements.length; i < length; i++ ) {
if (!elements[i] || !elements[i].tagName) continue;
// 页面上不需更改的元素
for (var j = , len = notChangeArr.length; j < len; j++) {
// continue到外循环
if (elements[i] === notChangeArr[j]) continue out;
}
c$.setElementDisable(elements[i], canUse);
}
return this;
}; /**
* 设置页面覆盖层
* @param flag 为true则覆盖,页面不可操作; 否则取消覆盖,页面可操作
* @param zIndex 覆盖层的z-index,默认99999
* @return c$ 对象本身,以支持连缀
*
* @example
* c$.cover(); // 取消页面的覆盖,页面可操作
* c$.cover(true); // 覆盖整个页面,页面不可操作
*/
c$.cover = function(flag, zIndex) {
var thisFun = arguments.callee;
// thisFun.overlay 作为覆盖层对象,是这函数的全局变量
// 覆盖
if (flag === true) {
// 隐藏滚动条
var htmls = document.getElementsByTagName("html");
for (var i = , length = htmls.length; i < length; i++) {
htmls[i].style.overflow = "hidden";
}
// 不存在覆盖层对象,则创建
if (!thisFun.overlay) {
thisFun.overlay = document.createElement("div");
// 覆盖层样式
var cssText = "position:absolute;";
cssText += "width:" + Math.max(document.body.scrollWidth, document.body.clientWidth) + "px;";
cssText += "height:" + Math.max(document.body.scrollHeight, document.body.clientHeight) + "px;";
cssText += "left: 0px;";
cssText += "top: 0px;";
cssText += "background-color: #D4D4D4;";
cssText += "filter:alpha(opacity=50);";
cssText += "-moz-opacity:0.50;";
cssText += "opacity:0.50;";
thisFun.overlay.style.cssText = cssText;
}
thisFun.overlay.style.zIndex = zIndex || ;
document.body.appendChild(thisFun.overlay);
}
// 取消覆盖
else {
// 不存在覆盖层对象,则不再操作
if (!thisFun.overlay) return this;
thisFun.overlay.parentNode.removeChild(thisFun.overlay);
// 恢复滚动条
var htmls = document.getElementsByTagName("html");
for (var i = , length = htmls.length; i < length; i++) {
htmls[i].style.overflow = "";
}
}
return this;
}; /**
* 打开窗口(没有高和宽参数时默认全屏)
* @param url 窗口地址
* @param name 窗口名称
* @param width 窗口宽度
* @param height 窗口高度
* @return 返回打开的子窗口对象
* @example c$.openWin('../common/Member.html?pform=form1&retid=Memid&retname=MemName', '');
*/
c$.openWin = function(url, name, width, height) {
// 默认宽度和高度为全屏
width = width || window.screen.width;
height = height || window.screen.height;
// 让窗口显示在屏幕中间
var top = (window.screen.height - height)/;
var left = (window.screen.width - width)/;
name = name || "";
var param = 'scrollbars=yes,top=' + top + ',left=' + left + ',width=' + width + ',height=' + height + ',resizable=yes';
return window.open(url, name, param);
}; /**
* 关闭窗口(IE上的关闭窗口时不提示)
* @param win 窗口对象
* @return c$ 对象本身,以支持连缀
*/
c$.closeWin = function(win) {
win = win || window;
win.opener = null; // 关闭IE6不提示
win.open("","_self"); // 关闭IE7不提示
//关闭窗口
win.close();
return this;
}; /**
* 删除节点
* @param element 要删除的元素
* @return c$ 对象本身,以支持连缀
* @example c$.removeElement(document.getElementById('text1')) // 删除id为text1的节点
*/
c$.removeElement = function(element) {
if (element && element.nodeName) {
element.parentNode.removeChild(element);
}
return this;
}; /**
* 给网址加上时间戳,避免浏览器缓存(已经有时间戳的,会修改时间戳)
* @param url 网址,没有时使用所在页面的地址
* @param flag 时间戳的参数名称,默认用 timeStamp
*
* @example
* c$.addTimeStamp('http://localhost/index.html') // 返回字符串: http://localhost/index.html?timeStamp=1315377347731
* c$.addTimeStamp('http://localhost/index.html?a=1&timeStamp=1315377347731') // 返回字符串:http://localhost/index.html?a=1&timeStamp=1315388347762
*/
c$.addTimeStamp = function(url, flag) {
url = url || window.location.href;
// 时间戳的参数名称
flag = flag || 'timeStamp'; // 判断网址是否已经有时间戳,有则替换掉旧的时间戳
var flag_reg = new RegExp('([?&])' + flag + '=\\d*');
if (flag_reg.test(url)) {
return url.replace(flag_reg, RegExp.$ + flag + '=' + new Date().getTime());
} // 给网址增加时间戳参数
url += (url.indexOf("?") > ) ? "&" : "?";
url += flag + "=" + new Date().getTime();
return url;
}; /**
* 获取URL里面的网站域名
* @param url 网址;没有参数时默认使用所在网页的网址
* @return 返回网站的域名字符串;不是有效网址时返回空字符串
*/
c$.getHost = function(url) {
// 没有参数时,默认用本站的
url = url || window.location.href;
// 用正则表达式来匹配
var match = url.match(/.*\:\/\/([^\/]*).*/);
// 能匹配则返回匹配的内容
if (match) return match[];
// 无法匹配(不是有效的网址),则返回 null
return "";
}; /**
* 将 JSON 对象内容转成字符串(注:中文会被url转码)
* @param obj 被转换的JSON对象
* @param key2lowerCase 是否需要将key转成小写,为true则转成小写,否则不转
* @return 返回字符串形式的json内容
* @example c$.json2str({a:1, b:[1,'2',3], c:'哈哈'}) // 返回字符串: '{"a":1,"b":[1,"2",3],"c":"%E5%93%88%E5%93%88"}'
*/
c$.json2str = function (obj, key2lowerCase) {
var arr = [];
// undefined, null, false, 0, NaN, ''
if (!obj) return "" + obj;
// 转换字符串
var format = function(value) {
// 对字符串的处理,URI转码, 以便提交数据
if (typeof value === 'string') return '"' + encodeURIComponent(value) + '"';
// 处理 日期
if (value && value.constructor === Date) return '"' + value.format() + '"';
// 处理 数组
if (value && value.constructor === Array) {
// 使用临时变量,避免修改源数据
var temArr = [];
for (var i=; i < value.length; i++) {
if (typeof(value[i]) == 'function') continue; // 自添加的函数,不用转换
temArr.push(format(value[i]));
}
return '[' + temArr.join(',') + ']';
}
// 如果是 函数
if (typeof value === 'function') try { return format(value());}catch(e){ return value + ""; };
// 如果是 object, 这里认为是 json,递归调用
if (typeof value === 'object' && value != null) return c$.json2str(value, key2lowerCase);
// undefined, null, bool, number 类型,直接返回
return value;
}
// bool, number, string, function, 数组
if (typeof obj !== 'object' || obj.constructor === Array) return format(obj);
for (var key in obj) {
// 将key转成小写
var tem_key = key2lowerCase ? ("" + key).toLowerCase() : key;
arr.push('"' + encodeURIComponent(tem_key) + '":' + format(obj[key]));
}
return '{' + arr.join(',') + '}';
}; /**
* 分解URL请求参数
* @param href 网址;没有参数时默认使用所在网页的网址
* @param key2lowerCase 是否需要将key转成小写,为true则转成小写,否则不转(默认不干涉)
* @return 返回json形式的参数内容
* @example c$.getRequestParams("http://localhost/index.html?d2d=哈哈&dd=oo111") // 返回对象: {d2d:'哈哈', dd:'oo111'}
*/
c$.getRequestParams = function(href, key2lowerCase) {
href = href || window.location.href;
var result = {};
var regex = /(\w+)=([^&]+)/gi;
var ms = href.match(regex);
if (ms == null) return result; for(var i = ; i < ms.length; i++) {
var ns = ms[i].match(regex);
var key = RegExp.$;
key = key2lowerCase ? ("" + key).toLowerCase() : key;
try { result[key] = decodeURIComponent(RegExp.$); }catch(e){}
} return result;
}; /**
* 对链接进行 UTF-8 编码
* @param href 网址; 没有网址返回空字符串
* @param key2lowerCase 是否需要将key转成小写,为true则转成小写,否则不转(默认不干涉)
* @return 返回转编码后的网址
* @example c$.encodeUrl("http://localhost/index.html?d2d=哈哈&dd=oo111") // 返回: "http://localhost/index.html?d2d=%E5%93%88%E5%93%88&dd=oo111"
*/
c$.encodeUrl = function(href, key2lowerCase) {
return c$.toQueryStr(null, href, key2lowerCase);
}; /**
* 把对象格式化成 URL 的参数形式
* @param obj 需要转成参数的对象
* @param href 网址; 没有网址则只返回格式化后的参数部分,有网址则拼接到网址上(还会修改网址上原有的值)
* @param key2lowerCase 是否需要将key转成小写,为true则转成小写,否则不转(默认不干涉)
* @return 返回编码后的字符串
* @example
* c$.toQueryStr({d2d:'看看', b:2}, "http://localhost/index.html?d2d=哈哈&dd=oo111") // 返回: "http://localhost/index.html?d2d=%E7%9C%8B%E7%9C%8B&dd=oo111"
* c$.toQueryStr({d2d:'哈哈', b:2}) // 返回: "d2d=%E5%93%88%E5%93%88&b=2"
*/
c$.toQueryStr = function(obj, href, key2lowerCase) {
if (!href || typeof href != 'string') {
href = "";
}
// 把网址上的参数拼接到 obj 类里面
else {
if (!obj || typeof obj != 'object') {
obj = c$.getRequestParams(href, key2lowerCase);
} else {
obj = c$.extend(c$.getRequestParams(href, key2lowerCase), obj);
}
} // 截取出网址(去掉参数部分)
var index = href.indexOf("?");
if (index > )
href = href.substring(, index) + '?'; var parts = [];
for (var key in obj) {
key = key2lowerCase ? ("" + key).toLowerCase() : key;
parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(obj[key]));
}
href += parts.join('&');
return href;
}; /**
* 获取URL的参数
* @param name 要获取的参数名称
* @return String类型 返回获取到的值,没有对应的键时返回 null
*/
c$.getRequestValue = function(name) {
var res = new RegExp( "[\\?&]" + name + "=([^&#]*)" ).exec( window.location.href );
return res ? res[] : null;
}; /**
* 添加 onload 事件(多次调用此函数时会保证各函数的执行顺序)
* @param fun 要添加到 onload 事件的函数
* @param win 要添加 onload 事件的窗口对象,默认为 window
* @return c$ 对象本身,以支持连缀
*/
c$.addOnloadFun = function(fun, win) {
if (!fun || typeof fun !== 'function') return this;
win = win || window; var thisFun = arguments.callee;
// thisFun.funList 作为本函数的全局变量,保证多次调用本函数时可以共用
thisFun.funList = thisFun.funList || [];
thisFun.funList.push(fun);
if (thisFun.funList.length > ) return this; var doReady = function () {
var fn, i = , readyList;
if (thisFun.funList) {
// 为了减少变量查询带来的性能损耗,将它赋值给本地变量
readyList = thisFun.funList;
// 释放引用
thisFun.funList = null;
while ( (fn = readyList[ i++ ]) ){
fn.call( win );
}
}
};
// IE
if (win.attachEvent) {
win.attachEvent('onload', doReady);
}
// firfox
else if (win.addEventListener) {
win.addEventListener('load', doReady, false);
} return this;
}; /**
* 获取鼠标的坐标
* @return 返回鼠标位置,形式如:{x: 531, y: 26}
*/
c$.getMousePos = function(ev) {
ev = ev || window.event;
var getX = ;
var getY = ;
// firfox
if (typeof(ev.pageX) == 'number') {
getX = 'ev.pageX';
getY = 'ev.pageY';
}
// IE
else if (document.body) {
getX = 'ev.clientX + document.body.scrollLeft - document.body.clientLeft';
getY = 'ev.clientY + document.body.scrollTop - document.body.clientTop';
}
// 重置函数,以提高效率,不用每次都判断
var funstr = 'c$.getMousePos = function(ev) {';
funstr += ' ev = ev || window.event;';
funstr += ' return { x: ' + getX + ', y: ' + getY + ' };';
funstr += '};';
eval(funstr);
// 执行此函数,上面已经重置了此函数
return c$.getMousePos(ev);
}; /**
* 获取元素位置
* @param element 元素
* @return 返回元素位置,形式如:{left: 531, top: 26}
*/
c$.getElementPos = function(element) {
var left = , top = ;
do {
left += element.offsetLeft;
top += element.offsetTop;
// 循环追加获取父节点的位置
} while (element = element.offsetParent);
return {left: left, top: top};
}; /**
* 创建一个哈希表对象
* @return 所创建的哈希表对象
*
* @example
* var ht = c$.HashTable(); // 创建一个哈希表对象
* ht.add('id', 55); // 添加值
* ht.set('id', 66); // 设值
* ht.get('id'); // 取值,没有此值时返回 null
* ht.remove('id'); // 删除值
* ht.clear(); // 清空哈希表
* ht.contains('id'); // 判断是否包含此键,返回 true 或者 false
* ht.containsValue(55); // 判断是否包含此值,返回 true 或者 false
* ht.count(); // 统计此哈希表里面有多少元素,返回一个整数
* ht.keys(); // 返回一个数组,里面包含此哈希表里面所有的 key
* ht.toString(); // 返回一个此哈希表的 key 和 value 格式化后的字符串,如: '{"a":1,"b":"哈哈"}'
* ht.clear().add('id', 55).set('name', 'myName').remove('age'); // add,set,remove,clear 函数支持连缀
*/
c$.HashTable = function() {
// 分别保存 key 和 value
// 原本是用 Object 来保存, 但如果 Object 被扩展了,将会影响结果,且 opera 的 Object 总是含有一个 event,最终改用数组。
var keyArr = [], valueArr = []; // 返回一个哈希对象
return {
// 添加一个元素
add : function(key, value) {
var index = keyArr.indexOf(key);
// 没有此值时添加
if (index === -) {
keyArr.push(key);
valueArr.push(value);
}
// 有此值时修改
else {
valueArr[index] = value;
}
// 返回自身,以便连缀
return this;
}, // 删除一个元素
remove : function(key) {
var index = keyArr.indexOf(key);
if (index > -) {
keyArr.remove(key);
valueArr.splice(index, );
}
return this;
}, // 获取一个元素
get : function(key) {
var index = keyArr.indexOf(key);
if (index > -) {
return valueArr[index];
}
return null;
}, // 修改一个元素
set : function(key, value) {
return this.add(key, value);
}, // 获取所有的 key
keys : function() {
// 返回一个复制的 key 数组,以免被外部修改
return keyArr.clone();
}, // 清空
clear : function() {
keyArr.clear();
valueArr.clear();
return this;
}, // 判断是否包含此键
contains : function(key) {
return keyArr.contains(key);
}, // 判断是否包含此值
containsValue : function(value) {
return valueArr.contains(value);
}, // 统计
count : function() {
return keyArr.length;
} // 格式化
,toString : function() {
var arr = [];
for (var i = , n = keyArr.length; i < n; i++) {
arr.push('"' + encodeURIComponent(keyArr[i]) + '":' + c$.json2str(valueArr[i]));
}
return '{' + arr.join(',') + '}';
}
};
}; /**
* 设定iframe适应高度(必须在 iframe元素加载后执行,如在 onload 里面执行,否则无效)
* @param iframe iframe元素
* @return c$ 对象本身,以支持连缀
* @example <iframe src='test.html' onload='c$.setIframeHeight(this)' /> // 加载 iframe 时,让它自动调整高度
*/
c$.setIframeHeight = function(iframe) {
iframe = iframe || document.getElementsByTagName("iframe")[] || window.parent.document.getElementsByTagName("iframe")[];
if ( !iframe ) return this;
// IE
if ( iframe.Document && iframe.Document.body.scrollHeight ) {
iframe.height = iframe.Document.body.scrollHeight;
}
// Firefox
else if ( iframe.contentDocument && iframe.contentDocument.documentElement ) {
iframe.height = iframe.contentDocument.documentElement.scrollHeight + 'px';
//jQuery(iframe).height(jQuery(iframe.contentDocument.documentElement).height());
}
return this;
}; /**
* 添加收藏
* @param sURL 网站地址
* @param sTitle 网站名称
* @return c$ 对象本身,以支持连缀
*/
c$.addFavorite = function(sURL, sTitle) {
sURL = sURL || window.location.href;
sTitle = sTitle || document.title;
var fns = [
function () { window.external.addFavorite(sURL, sTitle);},// IE
function () { window.sidebar.addPanel(sTitle, sURL, "");},// firefox (仅当地址为 ftp://, http:// 开头时可以正常运行)
];
for (var i=, n=fns.length; i < n; i++) {
try { fns[i](); return this; }catch(e){}
} // 以上都不行
alert("加入收藏失败,请使用Ctrl+D进行添加");
return this;
}; /**
* 设为首页
* @param obj 设置对象
* @param url 网站地址
* @return c$ 对象本身,以支持连缀
* @example <a onclick="c$.setHome(this);">设为首页</a>
*/
c$.setHome = function(obj, url) {
// 默认地址为本页面
url = url || window.location.href;
try { // IE
obj = obj || document.body;
obj.style.behavior = 'url(#default#homepage)';
obj.setHomePage(url);
}
catch(e) {
if (window.netscape) {
try { // firefox
window.netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
}
catch (e) {
alert("此操作被浏览器拒绝!\n请在浏览器地址栏输入“about:config”并回车\n然后将 [signed.applets.codebase_principal_support]的值设置为'true',双击即可。");
}
var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(Components.interfaces.nsIPrefBranch);
prefs.setCharPref('browser.startup.homepage',url);
}
}
return this;
}; /**
* 设定为焦点
* @param element 对象
* @return c$ 对象本身,以支持连缀
* @example c$.setFocus(docuemnt.getElementById('text1')); // 在id为text1的元素上设置焦点
*/
c$.setFocus = function(element) {
//element.focus();
setTimeout(function(){try { element.focus(); } catch (e){}}, );
return this;
}; /* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
* Ajax start
* --------------------------------------------------------------- */ /**
* 创建 XMLHttpRequest
* @return XMLHttpRequest
*/
c$.createXMLHttpRequest = function() {
var fns = [
function () { return new XMLHttpRequest(); }, // w3c, IE7+
function () { return new ActiveXObject('Msxml2.XMLHTTP'); }, // IE6
function () { return new ActiveXObject('Microsoft.XMLHTTP'); }, // IE5
];
var xmlHttp = false;
for (var i=, n=fns.length; i < n; i++) {
try {
xmlHttp = fns[i]();
c$.createXMLHttpRequest = fns[i]; // 重置函数, 不用每次调用都重复判断
break;
}catch(e){}
}
return (xmlHttp || false);
}; /**
* 发送 Ajax 请求
* 需改变的参数则需写上,使用默认的不用写,所有的参数都可以不写
* @return paramObj 参数对象,具体参考下面的用例
* @return c$ 对象本身,以支持连缀
*
* c$.ajax({
* url : "submit.html", // 需要发送的地址(默认: 当前页地址)
* param : "a=1&b=2", // 需要发送的传参字符串
* async : true, // 异步或者同步请求(默认: true, 异步请求)。如果需要发送同步请求,请将此选项设置为 false
* cache : true, // 是否允许缓存请求(默认: true, 允许缓存)
* method : "GET", // 请求方式(默认: "GET"),也可用"POST"
* success : function(xmlHttp){....}, // 请求成功返回的动作
* error : function(xmlHttp, status){....}, // 请求失败时的动作
* complete : function(xmlHttp, status){....} // 请求返回后的动作(不管成败,且在 success 和 error 之后运行)
* });
*/
c$.ajax = function(paramObj) {
// 创建 XMLHttpRequest
var xmlHttp = c$.createXMLHttpRequest();
// 如果不支缓 Ajax,提示信息
if (!xmlHttp) {
alert("您的浏览器不支持 Ajax,部分功能无法使用!");
return this;
} // 需要发送的地址(默认: 当前页地址)
paramObj.url = paramObj.url || "#";
// 异步或者同步请求(默认: true, 异步请求)
paramObj.async = paramObj.async || true;
// 缓存策略(默认: 缓存)
if (false == paramObj.cache) {
//paramObj.url = c$.addTimeStamp(paramObj.url); // 发送地址,加上时间戳,下面改用设头部信息的形式,减少对传参的影响
xmlHttp.setRequestHeader("If-Modified-Since","");
xmlHttp.setRequestHeader("Cache-Control","no-cache");
}
// 请求方式(默认: "GET")
paramObj.method = paramObj.method || "GET";
// get形式,将参数放到URL上
if ("GET" == ("" + paramObj.method).toUpperCase() && paramObj.param) {
paramObj.url += (paramObj.url.indexOf("?") > ) ? "&" : "?";
paramObj.url += paramObj.param;
paramObj.param = null;
paramObj.url = c$.encodeUrl(paramObj.url);
}
// 发送请求
xmlHttp.open(paramObj.method, paramObj.url, paramObj.async);
// 执行回调方法
xmlHttp.onreadystatechange = function() {
// XMLHttpRequest对象响应内容解析完成
if ( !== xmlHttp.readyState) return;
// 状态正常时
if ( === xmlHttp.status) {
// 请求成功时的动作
if (paramObj.success) paramObj.success(xmlHttp);
}
else {
// 请求失败时的动作
if (paramObj.error) paramObj.error(xmlHttp, xmlHttp.status);
// 默认的出错处理
else alert("页面发生Ajax错误,请联系管理人员! \n错误类型:" + xmlHttp.status + ": “" + location.pathname + "”");
}
// 请求返回后的动作(不管成败,且在 success 和 error 之后运行)
if (paramObj.complete) paramObj.complete(xmlHttp, xmlHttp.status);
};
// 请求方式("POST")
if (paramObj.method.toUpperCase() === "POST") xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
// 发送参数
xmlHttp.send(paramObj.param);
return this;
}; /**
* 获取xmlHttp里符合的资料
* @param xmlHttp XMLHttpRequest
* @param tagName 资料的 TagName
* @param init 默认值
* @param index 第几个子元素
* @return 符合的数据的字符串
*/
c$.getAjaxValue = function(xmlHttp, tagName, init, index) {
init = init || "";
index = index || ;
// 没法继续执行
if (!xmlHttp || !tagName) return init; try {
//获取xmlHttp里对应的值
var element1 = xmlHttp.responseXML.getElementsByTagName(tagName)[index].firstChild;
var value = element1.nodeValue || element1.data;
//如果能获取值
if (value) return value;
}
catch (e) {}
// 异常或者没能取到值时,返回默认值
return init;
}; /* -------------------------------------------------------------------
* Ajax end
* ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ */ /**
* 获取元素
* @param str 直接写则是指元素的ID或者name
* 如果需要精确指定则使用“#”开头表示id,“@”开头表示name,“.”开头表示class,“$”开头表示tagName
* 根据 name、class、tagName 查找时,如果只找到一个则返回一个元素,找到多个则返回数组; 根据id查找时只会返回一个
* @param dom 需要选择的DOM对象,默认是 window.document
* @return 如果能找到指定名称的元素,返回元素对象; 如果找不到指定的元素,返回 null
*
* @example
* c$.getElement("mytext") // 返回 id 或者 name 为"mytext"的元素
* c$.getElement("#mytext") // 返回 id 为"mytext"的元素
* c$.getElement("@mytext") // 返回 name 为"mytext"的元素
* c$.getElement(".class1") // 返回 class 为"class1"的元素
* c$.getElement("$div") // 返回 标签 为"div"的所有元素
* c$.getElement("$div #text1") // 返回 div 标签里面 id 为"text1"的元素(支持多级查询,以空格分隔)
*/
c$.getElement = function(str, dom) {
if (!str) return null;
// 默认要查找的 dom 对象
dom = dom || document; // 如果本身是页面对象,直接返回
if (c$.isElement(str)) return str; // 判断返回:只有一个的时候,返回一个元素;多个则返回数组
var return_arr = function(elements) {
// 参数是数组
if (elements && elements.constructor === Array) {
// 空数组时
if (elements.length === ) return false;
// 只有一个的时候,直接返回一个元素
if (elements.length === && c$.isElement(elements[])) return elements[];
// 多个时传回数组
return elements;
}
// 参数是元素
if (c$.isElement(elements)) return elements;
// 没有符合的
return false;
} // 获取查找的类型,以及查找的字符串
var getType = function(str) {
var type = null;
var find_str = str.substr();
// 判断要查询的类型
switch(str.substr(, )) {
case "#": type = 'id'; break;
case "@": type = 'name'; break;
case ".": type = 'class'; break;
case "$": type = 'tagName'; break;
// 没有精确指定时
default: find_str = str;
}
return [type, find_str];
} // 获取dom里面的元素
var getDomElements = function(type, find_str, DOM) {
var elements = [];
if (DOM) {
// 如果 dom 是个数组
if (DOM.length && DOM.constructor === Array) {
for(var i=, length = DOM.length; i<length; i++){
if (DOM[i].getElementsByTagName) {
var tem_elements = [];
// 根据 tagName 获取元素
if (type === 'tagName') {elements = elements.concat(DOM[i].getElementsByTagName(find_str));}
// 获取 dom 里面的所有元素
else {elements = elements.concat(DOM[i].getElementsByTagName('*') || DOM[i].all);}
}
}
}
// 单个的 dom
else {
if (DOM.getElementsByTagName) {
// 根据 tagName 获取元素
if (type === 'tagName') {elements = DOM.getElementsByTagName(find_str);}
// 获取 dom 里面的所有元素
else {elements = DOM.getElementsByTagName('*') || DOM.all;}
}
}
}
if (elements && elements.length) {
var ets = []; // 返回值
for (var i=, length = elements.length; i < length; i++) {
var et = elements[i];
if (c$.isElement(et)) {
// 判断要查询的类型
switch(type) {
case 'id': if(et.id == find_str)ets.push(et); break;
case 'name': if(et.name == find_str)ets.push(et); break;
case 'class': if((" "+et.className+" ").indexOf(" "+find_str+" ") != -)ets.push(et); break;
case 'tagName': if(et.tagName.toUpperCase() == find_str.toUpperCase())ets.push(et); break;
// 没有精确指定时
default: if(et.id == find_str || et.name == find_str)ets.push(et);
}
}
}
var et = return_arr(ets);
if (et) return et;
}
// 没有找到时
return null;
} // 根据 string 来获取对象
if ("string" === typeof(str)) {
//按照空格分割参数
var values = str.trim().replace(/\s+/g, " ").split(" ");
var type = getType(values[])[];
var find_str = getType(values[])[];
// 优化一下效率; 根据 id 获取元素
if (dom.getElementById && (type === 'id' || type === null)) {
var element = dom.getElementById(find_str);
if (c$.isElement(element)) {
if (values.length === )return element;
dom = element;
values.shift();
}
}
// 优化一下效率; 根据 name 获取元素
if (dom.getElementsByName && (type === 'name' || type === null)) {
var elements = dom.getElementsByName(find_str);
var et = return_arr(elements);
if (et) {
if (values.length === )return et;
dom = et;
values.shift();
}
}
// 遍历查询
for(var i=, length = values.length; i<length; i++) {
type = getType(values[i])[];
find_str = getType(values[i])[];
dom = getDomElements(type, find_str, dom);
if (dom === null) return null; // 找不到时不再继续
}
if (dom) return dom;
} // 找不到元素,则返回 null
return null;
}; /**
* 获取元素的值
* @param name 元素的ID或者name
* @param init 默认值
* @return 元素的值(value 或者 innerHTML 或者 checkbox、radio选中的值)
*/
c$.getValue = function(name, init) {
//返回值
var retValue = "";
//如果没有传入默认值
if (arguments.length <= ) init = "";
var data = c$.getElement(name);
//如果没有找到所要的元素,则直接返回默认值
if (!data) return init; //如果它是选择框
if ("checkbox" === data.type) {
if (data.checked) return data.value;
return init;
}
//如果它是单选按钮
if ("radio" === data.type || ( < data.length && "radio" === data[].type)) {
return c$.getRadioValue(name, init);
} //获取元素的值; 没有value属性则取innerHTML
retValue = data.value || data.innerHTML;
//如果没有取到值,返回默认值
return (retValue || init);
}; /**
* 表单序列化
* @param form 表单的id,name 或者表单对象,给出的不是 form 元素而是 div,table 之类的元素也可以
* @param encode 是否将值转成 URL 编码
* @return 表单序列化后的字符串
*/
c$.serialize = function(form, encode) {
//元素列表
var elements = c$.getElements(form);
// 拼接参数
var param = "";
for (var i = , length = elements.length; i < length; i++) {
if (elements[i].type) {
var type = elements[i].type.toLowerCase();
// 选择项,没选中时跳过
if (type == "radio" || type == "checkbox") {
if (!elements[i].checked) continue;
}
// 按钮不需要序列化
if ("button" === type || "submit" === type || "reset" === type) continue;
}
// 保存名称和值
var name = elements[i].name;
var value = elements[i].value;
// 如果需要转变中文编码
value = encode ? encodeURIComponent(value) : value;
if (param.length > ) param += "&";
param += name + "=" + value;
}
return param;
}; /**
* 当DOM载入就绪时执行某函数(比window.onload更早)
* @param fun [必填]需要执行的函数
* @return c$ 对象本身,以支持连缀
*
* @example
* c$.ready(function(){alert('执行DOM加载完成事件');});
* c$(function(){alert('执行DOM加载完成事件');}); // 为 c$.ready(fun) 的缩写
*/
c$.ready = function (fun) {
if (!fun || typeof fun !== 'function') return this;
var thisFun = arguments.callee;
// thisFun.funList 作为本函数的全局变量,保证多次调用本函数时可以共用
thisFun.funList = thisFun.funList || [];
thisFun.funList.push(fun);
if (thisFun.funList.length > ) return this;
// 执行的函数
var doReady = function () {
var fn, i = , readyList;
if (thisFun.funList) {
// 为了减少变量查询带来的性能损耗,将它赋值给本地变量
readyList = thisFun.funList;
// 释放引用
thisFun.funList = null;
while( (fn = readyList[ i++ ]) ){
fn.call( document );
}
}
};
// FF, Opera, 高版webkit, 其他
if (document.addEventListener) {
document.addEventListener( "DOMContentLoaded", function(){
document.removeEventListener( "DOMContentLoaded", arguments.callee, false );
doReady();
}, false );
window.addEventListener('load', doReady, false); // 为了保险起见,还注册了 onload 事件
}
// IE
else if (document.attachEvent) {
document.attachEvent("onreadystatechange", function() {
if (document.readyState === "complete") {
document.detachEvent( "onreadystatechange", arguments.callee );
doReady();
}
});
window.attachEvent('onload', doReady); // 判断文档是否处于最顶层,如果文档处于iframe中,调用doScroll方法成功时并不代表DOM加载完毕
var isToplevel = false;
try {
isToplevel = window.frameElement == null;
} catch(e) {} if (document.documentElement.doScroll && isToplevel) {
(function(){
try {
document.documentElement.doScroll("left");
} catch (error) {
window.setTimeout(arguments.callee, );
return;
}
doReady();
})();
}
}
return this;
};

Js收藏-转的更多相关文章

  1. js收藏代码

    js收藏代码~ 1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键 <table border oncon ...

  2. js收藏

    //设为主页function SetHome(obj, vrl) { try { obj.style.behavior = 'url(#default#homepage)'; obj.setHomeP ...

  3. 前端js收藏

    1 爱心特效 <script type="text/javascript"> (function(window,document,undefined){ var hea ...

  4. js收藏展开与隐藏,返回顶部

    var a = document.getElementById("more");var b = document.getElementById("moreList&quo ...

  5. 收藏夹里的js

    释放右键 javascript:(function(){var doc=document;var bd=doc.body;bd.onselectstart=bd.oncopy=bd.onpaste=b ...

  6. 设为首页 和 收藏本站js代码 兼容IE,chrome,ff

    设为首页 和 收藏本站js代码 兼容IE,chrome,ff //设为首页 function SetHome(obj,url){ try{ obj.style.behavior='url(#defau ...

  7. 兼容所有浏览器的设为首页收藏本站js代码

    大家发现传统的收藏本站按钮在360浏览器下面没有效果了,但是360浏览器用户群却非常之大.所以我们在网上找到一个兼容所有浏览器的收藏本站解决方案,具体功能如下: 设为首页 和 收藏本站js代码 兼容I ...

  8. JS(javascript) 将网站加入收藏夹

    | 浏览:688 | 更新:2014-09-20 19:39 1 2 3 分步阅读 将网站网址加入收藏夹,方便下次访问! 工具/原料 网址: 电脑. 方法/步骤   //创建加入收藏夹JS函数 < ...

  9. javascript 设为首页 | 加入收藏夹 JS代码

    我们介绍一个可兼容所有浏览器的加入收藏代码代码,大概原理是这样的我们根据获取用户navigator.userAgent.toLowerCase()信息来判断浏览器,根据浏览器是否支持加入收藏js命令, ...

随机推荐

  1. Top 100 words for advanced learners.

    aberration (n.) something that differs from the norm (In 1974, Poland won the World Cup, but the suc ...

  2. 指定Action、Category调用系统Activity

    1.Intent对象详解 Android的应用程序包含三种重要组件:Activity.Service.BroadcastReceiver,应用程序采用一致的方式来启动它们----都是依靠Intent来 ...

  3. 人工神经网络简介和单层网络实现AND运算--AForge.NET框架的使用(五)

    原文:人工神经网络简介和单层网络实现AND运算--AForge.NET框架的使用(五) 前面4篇文章说的是模糊系统,它不同于传统的值逻辑,理论基础是模糊数学,所以有些朋友看着有点迷糊,如果有兴趣建议参 ...

  4. In App Purchases(IAP 应用程序內购买): 完全攻略

    原文: http://troybrant.net/blog/2010/01/in-app-purchases-a-full-walkthrough/ 参考: http://www.cocoachina ...

  5. 设置mysql数据库的密码

    mysql>set password=password("......");

  6. Google Code Jam 2012 round 2 problem A: Swinging Wild

    题目连接 题意:你要从起点经过绳子荡到终点,每次你必须抓住另一个绳子,在空中不能向下爬.问是否有合理的方案 做法: 直接模拟 #include <iostream> #include &l ...

  7. jQuery简单的Ajax调用示例

    jQuery确实方便,下面做个简单的Ajax调用: 建立一个简单的html文件: <!DOCTYPE HTML> <html> <head> <script ...

  8. HRBUST 1987 逃课的孩子

    Sol:HASH + 二分  字符串处理,很基础的操作. 题意很明确就是找重复的次数统计下,范围比较大1≤n≤10000,1≤m≤10000. #include <cstdio> #inc ...

  9. Mac phpstorm破解版安装(简单,有效)

    如果是公司作为商业用途的,还是希望你能购买正版的,如果是苦逼的穷学生,亦或是我这样的苦逼码农,那就往下看, 之前有个只需要在"License server address"里输入 ...

  10. CSU1659: Graph Center(最短路)

    Description The center of a graph is the set of all vertices of minimum eccentricity, that is, the s ...