// jQuery.browser 兼容高版本 jquery (function(jQuery){ if(jQuery.browser) return; jQuery.browser = {}; jQuery.browser.mozilla = false; jQuery.browser.webkit = false; jQuery.browser.opera = false; jQuery.browser.msie = false; var nAgt = navigator.userAgent; jQuery.browser.name = navigator.appName; jQuery.browser.fullVersion = ''+parseFloat(navigator.appVersion); jQuery.browser.majorVersion = parseInt(navigator.appVersion,10); var nameOffset,verOffset,ix; // In Opera, the true version is after "Opera" or after "Version" if ((verOffset=nAgt.indexOf("Opera"))!=-1) { jQuery.browser.opera = true; jQuery.browser.name = "Opera"; jQuery.browser.fullVersion = nAgt.substring(verOffset+6); if ((verOffset=nAgt.indexOf("Version"))!=-1) jQuery.browser.fullVersion = nAgt.substring(verOffset+8); } // In MSIE, the true version is after "MSIE" in userAgent else if ((verOffset=nAgt.indexOf("MSIE"))!=-1) { jQuery.browser.msie = true; jQuery.browser.name = "Microsoft Internet Explorer"; jQuery.browser.fullVersion = nAgt.substring(verOffset+5); } // In Chrome, the true version is after "Chrome" else if ((verOffset=nAgt.indexOf("Chrome"))!=-1) { jQuery.browser.webkit = true; jQuery.browser.name = "Chrome"; jQuery.browser.fullVersion = nAgt.substring(verOffset+7); } // In Safari, the true version is after "Safari" or after "Version" else if ((verOffset=nAgt.indexOf("Safari"))!=-1) { jQuery.browser.webkit = true; jQuery.browser.name = "Safari"; jQuery.browser.fullVersion = nAgt.substring(verOffset+7); if ((verOffset=nAgt.indexOf("Version"))!=-1) jQuery.browser.fullVersion = nAgt.substring(verOffset+8); } // In Firefox, the true version is after "Firefox" else if ((verOffset=nAgt.indexOf("Firefox"))!=-1) { jQuery.browser.mozilla = true; jQuery.browser.name = "Firefox"; jQuery.browser.fullVersion = nAgt.substring(verOffset+8); } // In most other browsers, "name/version" is at the end of userAgent else if ( (nameOffset=nAgt.lastIndexOf(' ')+1) < (verOffset=nAgt.lastIndexOf('/')) ) { jQuery.browser.name = nAgt.substring(nameOffset,verOffset); jQuery.browser.fullVersion = nAgt.substring(verOffset+1); if (jQuery.browser.name.toLowerCase()==jQuery.browser.name.toUpperCase()) { jQuery.browser.name = navigator.appName; } } // trim the fullVersion string at semicolon/space if present if ((ix=jQuery.browser.fullVersion.indexOf(";"))!=-1) jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,ix); if ((ix=jQuery.browser.fullVersion.indexOf(" "))!=-1) jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,ix); jQuery.browser.majorVersion = parseInt(''+jQuery.browser.fullVersion,10); if (isNaN(jQuery.browser.majorVersion)) { jQuery.browser.fullVersion = ''+parseFloat(navigator.appVersion); jQuery.browser.majorVersion = parseInt(navigator.appVersion,10); } jQuery.browser.version = jQuery.browser.majorVersion; })(jQuery); var WYAreaData = null; var WYAreaConfig = { url : { get : '//js.lsurl.cn/getArea?rd=' + Math.random(), version : '//js.lsurl.cn/version?rd=' + Math.random() }, prefix : 'wy_area_', pid : 0 , //1为快车 version : 0, //版本号 callback : function (level, val) { }, time : 300 //检测频率,单位 秒 }; var WYArea = { init : function(fn) { //初始化 if ( $.browser.msie ) { var v = parseFloat($.browser.version); if (v < 8) { $.getScript("//js.lsurl.cn/getArea?ie=true", function(){ WYArea.call(fn); }); return; } } WYAreaData = WYArea.data("data"); console.log(WYAreaData) WYAreaConfig.version = WYArea.data("version"); if (!WYAreaData) WYArea.update(fn); else { var lastCheck = WYArea.data("lc"); if (!lastCheck) { WYArea.data("lc", 1, WYAreaConfig.time); $.getScript(WYAreaConfig.url.version, function(){ if (WYAreaVersionUpdate !== WYAreaConfig.version) WYArea.update(fn); else WYArea.call(fn); }); } else WYArea.call(fn); } }, call : function(fn) { if (typeof fn === "function") fn(); }, update : function(fn) { $.getScript(WYAreaConfig.url.get, function(){ if (!WYAreaData) alert('地区数据初始化出错,请刷新页面,重新加载'); else { WYArea.data("data", WYAreaData); WYArea.data("version", WYAreaConfig.version); WYArea.call(fn); } }); }, data : function(k, v, t) { if (!v) return wyLocalData.LocalStorage.get(WYAreaConfig.prefix + k); wyLocalData.LocalStorage.set({key: WYAreaConfig.prefix + k, value:v, expires : t > 0 ? t * 1000 : null}); }, getAreaDataStr: function() { return WYAreaData; }, getProv: function() { //获取省份 return WYAreaData.match(/\d{6}0[^x00-xff]+[a-z]+/ig); }, getCity: function(prov) { //获取市级 prov = prov.toString().substr(0, 2); return this.getData(prov + '[0-9]{2}001[^x00-xff]+[a-z]+'); }, getArea: function(city) { //获取区县 city = city.toString().substr(0, 4); return this.getData(city + '[0-9]{2}2[^x00-xff]+[a-z]+'); }, getItemById: function(areacode) { //获取单个结点 var rs = this.getData(areacode + '(0|1|2)[^x00-xff]+[a-z]+', 'i'); return rs ? rs[0] : null; }, getItemByPY: function(py) { //根据拼音获取 var rs = this.getData('[0-9]{6}(0|1|2)[^x00-xff]+' + py, 'i'); return rs ? rs[0] : null; }, getByLetter: function(char, grade) { //根据首字母搜索, char = char.toLowerCase(), grade = grade ? grade : 2; return this.getData('[0-9]{6}' + grade + '[^x00-xff]+' + char + "[a-z]*"); }, getByName: function(name, grade) { //根据首字母搜索, grade = grade ? grade : 2; return this.getData('[0-9]{6}' + grade + '[^x00-xff]*?' + name + '[^x00-xff]*?[a-z]+'); }, getPath: function(id, order) { //根据areacode获取结点树 var rs = [], item = this.getItemById(id); rs.push(item); item = this.parser(item); if (item.grade === "2") { var city = this.getData(item.id.substr(0, 4) + '001[^x00-xff]+[a-z]+', 'i'); if (city) rs.push(city[0]); } if (item.grade !== "0") rs.push(this.getData(item.id.substr(0, 2) + '\\d{2}0\\d0[^x00-xff]+[a-z]+', 'i')[0]); return rs; }, getData: function(regex, ig) { //获取数据的公共方法 return WYAreaData.match(new RegExp(regex, ig ? ig : 'ig')); }, parser: function(item) { if (!item) return null; var py = item.replace(/[^x00-xff]+/ig, '').substr(7); return { id: item.substr(0, 6), grade: item.substr(6, 1), name: item.match(/[^x00-xff]+/ig)[0], py: py, letter: py.substr(0, 1).toUpperCase() }; }, select: function(opt, p, c, a, fn) { if (typeof opt !== "object") { opt = {id: parseInt(opt)}; opt.id = opt.id ? opt.id : 0; var level = 3; if (fn) opt.callback = fn; if (a) opt.level = 3, opt.prov = p, opt.city = c, opt.area = a; else if (c) opt.level = 2, opt.prov = p, opt.city = c, opt.area = ''; else if (p) opt.level = 1, opt.prov = p, opt.city = '', opt.area = ''; } var self = this; var def = { level: 3, //联动级别 可以是 1,2,3 firstLang : ['选择省', '选择市', '选择区'], first: '', prov: '#selectProv', city: '#selectCity', area: '#selectArea', id: 0, //初始化的地区编码,设置了id,data的预设值会无效 data: [0, 0, 0] //初始化的省市区编码 }; var config = jQuery.extend(def, opt); var isFirst = config.id; if (config.id) { var root = self.getPath(config.id); if (root) { config.data = [0, 0, 0]; for (var i = 0; i < root.length; i++) { var grade = parseInt(root[i].substring(6, 7)); config.data[grade] = root[i].substring(0, 6); } } } if (config.first) { if ($(config.prov)) { $(config.prov).html(config.first.replace('%lang%', config.firstLang[0])); } if ($(config.city)) { $(config.city).html(config.first.replace('%lang%', config.firstLang[1])); } if ($(config.area)) { $(config.area).html(config.first.replace('%lang%', config.firstLang[2])); } } function initData(obj, data, val, trigger) { for (var i = 0;i < data.length; i++) { var one = self.parser(data[i]); var select = ''; if (val == one.id) select = 'selected'; $(obj).append(''); } if (trigger) $(obj).trigger('change'); } function initProv() { var prov = self.getProv(); $(config.prov).empty(); if ($(config.prov)) $(config.prov).html(config.first ? config.first.replace('%lang%', config.firstLang[0]) : ''); if ($(config.city)) $(config.city).html(config.first ? config.first.replace('%lang%', config.firstLang[1]) : ''); if ($(config.area)) $(config.area).html(config.first ? config.first.replace('%lang%', config.firstLang[2]) : ''); if (!config.first && !config.data[0]) initData(config.prov, prov, prov[0].substring(0, 6)); else initData(config.prov, prov, config.data[0]); } function initCity(prov) { $(config.city).empty(); if ($(config.city)) $(config.city).html(config.first ? config.first.replace('%lang%', config.firstLang[1]) : ''); if ($(config.area)) $(config.area).html(config.first ? config.first.replace('%lang%', config.firstLang[2]) : ''); if (!prov) return; var city = self.getCity(prov); if (!city) { if (config.level == 2) { city = self.getArea(prov); config.data[1] = config.id; } else { city = [self.getItemById(prov)]; var str = self.parser(city[0]); if (isFirst) config.data[1] = str.id; } } if (!config.first && !config.data[1]) initData(config.city, city, city[0].substring(0, 6)); else initData(config.city, city, config.data[1], !isFirst); isFirst = false; } function initArea(city) { $(config.area).empty(); if (config.first) { $(config.area).html(config.first ? config.first.replace('%lang%', config.firstLang[2]) : ''); } if (!city) return; var area = self.getArea(city); if (!area) area = [self.getItemById(city)]; if (!config.first && !config.data[2]) initData(config.area, area, area[0].substring(0, 6)); else initData(config.area, area, config.data[2]); config.data[2] = 0; } $(config.prov).bind("change", function() { var prov = $(this).val(); if (config.level > 1) initCity(prov); config.callback && config.callback(0, prov); }); $(config.city).bind("change", function() { var city = $(this).val(); if (config.level > 2) initArea(city); config.callback && config.callback(1, city); }); config.callback && $(config.area).bind("change", function() { var area = $(this).val(); config.callback(1, area); }); initProv(0); if (config.level > 1 && config.data[0]) { $(config.prov).trigger('change'); config.data[0] = 0; } if (config.level > 2 && config.data[1]) { $(config.city).trigger('change'); config.data[1] = 0; } } }; function WYAreaStore (key, val, expires) { if (key === "__allkeys__") return wyLocalData.LocalStorage.getAllKeys(); if (val === undefined || val=== null) { return wyLocalData.LocalStorage.get({ key : key }); } else { if (typeof val === "object") { val = this.obj2str(val); } var obj = { key : key, value : val }; if (expires > 0) { obj.expires = expires * 1000; } wyLocalData.LocalStorage.set([obj]); } } if (!window.registNS) { window.registNS = function(fullNS,isIgnorSelf){ //命名空间合法性校验依据 var reg = /^[_$a-z]+[_$a-z0-9]*/i; // 将命名空间切成N部分, 比如baidu.libs.Firefox等 var nsArray = fullNS.split('.'); var sEval = ""; var sNS = ""; var n = isIgnorSelf ? nsArray.length - 1 : nsArray.length; for (var i = 0; i < n; i++){ //命名空间合法性校验 if(!reg.test(nsArray[i])) { throw new Error("Invalid namespace:" + nsArray[i] + ""); return ; } if (i != 0) sNS += "."; sNS += nsArray[i]; // 依次创建构造命名空间对象(假如不存在的话)的语句 sEval += "if(typeof(" + sNS + ")=='undefined') " + sNS + "=new Object();else " + sNS + ";"; } //生成命名空间 if (sEval != "") { return eval(sEval); } return {}; }; /** * 注册命名空间 */ window.registNS('wyLocalData'); /** * @class wyLocalData.LocalStorage * 跨浏览器的本地存储实现。高级浏览器使用localstorage,ie使用UserData。虽然说是本地存储,也请不要存储过大数据,最好不要大于64K. * 因为ie下UserData每页最大存储是64k。 * @singleton */ (function(){ /** * 验证字符串是否合法的键名 * @param {Object} key 待验证的key * @return {Boolean} true:合法,false:不合法 * @private */ function _isValidKey(key) { return (new RegExp("^[^\\x00-\\x20\\x7f\\(\\)<>@,;:\\\\\\\"\\[\\]\\?=\\{\\}\\/\\u0080-\\uffff]+\x24")).test(key); } //所有的key var _clearAllKey = "_wanyou.ALL.KEY_"; /** * 创建并获取这个input:hidden实例 * @return {HTMLInputElement} input:hidden实例 * @private */ function _getInstance(){ //把UserData绑定到input:hidden上 var _input = null; //是的,不要惊讶,这里每次都会创建一个input:hidden并增加到DOM树种 //目的是避免数据被重复写入,提早造成“磁盘空间写满”的Exception _input = document.createElement("input"); _input.type = "hidden"; _input.addBehavior("#default#userData"); document.body.appendChild(_input); return _input; } /** * 将数据通过UserData的方式保存到本地,文件名为:文件名为:config.key[1].xml * @param {String} key 待存储数据的key,和config参数中的key是一样的 * @param {Object} config 待存储数据相关配置 * @cofnig {String} key 待存储数据的key * @config {String} value 待存储数据的内容 * @config {String|Object} [expires] 数据的过期时间,可以是数字,单位是毫秒;也可以是日期对象,表示过期时间 * @private */ function __setItem(key,config){ try { var input = _getInstance(); //创建一个Storage对象 var storageInfo = config || {}; //设置过期时间 if(storageInfo.expires) { var expires; //如果设置项里的expires为数字,则表示数据的能存活的毫秒数 if ('number' == typeof storageInfo.expires) { expires = new Date(); expires.setTime(expires.getTime() + storageInfo.expires); } input.expires = expires.toUTCString(); } //存储数据 input.setAttribute(storageInfo.key,storageInfo.value); } catch (e) { } } /** * 将数据通过UserData的方式保存到本地,文件名为:文件名为:config.key[1].xml * @param {String} key 待存储数据的key,和config参数中的key是一样的 * @param {Object} config 待存储数据相关配置 * @cofnig {String} key 待存储数据的key * @config {String} value 待存储数据的内容 * @config {String|Object} [expires] 数据的过期时间,可以是数字,单位是毫秒;也可以是日期对象,表示过期时间 * @private */ function _setItem(key,config){ //保存有效内容 __setItem(key,config); //下面的代码用来记录当前保存的key,便于以后clearAll var result = _getItem({key : _clearAllKey}); if(result) { result = { key : _clearAllKey, value : result }; } else { result = { key : _clearAllKey, value : "" }; } if(!(new RegExp("(^|\\|)" + key + "(\\||$)",'g')).test(result.value)) { result.value += "|" + key; //保存键 __setItem(_clearAllKey,result); } } /** * 提取本地存储的数据 * @param {String} config 待获取的存储数据相关配置 * @cofnig {String} key 待获取的数据的key * @return {String} 本地存储的数据,获取不到时返回null * @example * wyLocalData.LocalStorage.get({ * key : "username" * }); * @private */ function _getItem(config){ try { var input = _getInstance(); //载入本地文件,文件名为:config.key[1].xml input.load(config.key); //取得数据 return input.getAttribute(config.key) || null; } catch (e) { return null; } } /** * 移除某项存储数据 * @param {Object} config 配置参数 * @cofnig {String} key 待存储数据的key * @private */ function _removeItem(config){ try { var input = _getInstance(); //载入存储区块 input.load(config.key); //移除配置项 input.removeAttribute(config.key); //强制使其过期 var expires = new Date(); expires.setTime(expires.getTime() - 1); input.expires = expires.toUTCString(); input.save(config.key); //从allkey中删除当前key //下面的代码用来记录当前保存的key,便于以后clearAll var result = _getItem({key : _clearAllKey}); if(result) { result = result.replace(new RegExp("(^|\\|)" + config.key + "(\\||$)",'g'),''); result = { key : _clearAllKey, value : result }; //保存键 __setItem(_clearAllKey,result); } } catch (e) { } } //移除所有的本地数据 function _clearAll(){ result = _getItem({key : _clearAllKey}); if(result) { var allKeys = result.split("|"); var count = allKeys.length; for(var i = 0;i < count;i++){ if(!!allKeys[i]) { _removeItem({key:allKeys[i]}); } } } } /** * 获取所有的本地存储数据对应的key * @return {Array} 所有的key * @private */ function _getAllKeys(){ var result = []; var keys = _getItem({key : _clearAllKey}); if(keys) { keys = keys.split('|'); for(var i = 0,len = keys.length;i < len;i++){ if(!!keys[i]) { result.push(keys[i]); } } } return result ; } /** * 判断当前浏览器是否支持本地存储:window.localStorage * @return {Boolean} true:支持;false:不支持 * @remark 支持本地存储的浏览器:IE8+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari4.0+、iPhone2.0+、Andrioid2.0+ * @private */ var _isSupportLocalStorage = ((navigator.cookieEnabled) && ('localStorage' in window) && (window['localStorage'] !== null)), _isSupportUserData = !!jQuery.browser.ie; wyLocalData.LocalStorage = { /** * 如果支持本地存储,返回true;否则返回false * @type Boolean */ isAvailable : _isSupportLocalStorage || _isSupportUserData, /** * 将数据进行本地存储(只能存储字符串信息) *
* //保存单个对象
* wyLocalData.LocalStorage.set({
* key : "username",
* value : "baiduie",
* expires : 3600 * 1000
* });
* //保存对个对象
* wyLocalData.LocalStorage.set([{
* key : "username",
* value : "baiduie",
* expires : 3600 * 1000
* },{
* key : "password",
* value : "zxlie",
* expires : 3600 * 1000
* }]);
*
* @param {Object} obj 待存储数据相关配置,可以是单个JSON对象,也可以是由多个JSON对象组成的数组
*
* //获取某一个本地存储,返回值为:{key:"",value:"",expires:""},未取到值时返回值为:null
* var rst = wyLocalData.LocalStorage.get({
* key : "username"
* });
* //获取多个本地存储,返回值为:["","",""],未取到值时返回值为:[null,null,null]
* wyLocalData.LocalStorage.get([{
* key : "username"
* },{
* key : "password"
* },{
* key : "sex"
* }]);
*
* @param {String} obj 待获取的存储数据相关配置,支持单个对象传入,同样也支持多个对象封装的数组格式
* @config {String} key 待存储数据的key
* @return {String} 本地存储的数据,传入为单个对象时,返回单个对象,获取不到时返回null;传入为数组时,返回为数组
*/
get : function(obj){
//获取某一个本地存储
var _get_ = function(config){
//结果
var result = null;
if(typeof config === "string") config = {key : config};
//key校验
if(!_isValidKey(config.key)) {return result;}
//支持本地存储的浏览器:IE8+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari4.0+、iPhone2.0+、Andrioid2.0+
if(_isSupportLocalStorage) {
result = window.localStorage.getItem(config.key);
//过期时间判断,如果过期了,则移除该项
if(result) {
var expires = window.localStorage.getItem(config.key + ".expires");
result = {
value : result,
expires : expires ? new Date(expires) : null
};
if(result && result.expires && result.expires < new Date()) {
result = null;
window.localStorage.removeItem(config.key);
window.localStorage.removeItem(config.key + ".expires");
}
}
} else if(_isSupportUserData) { //IE7及以下版本,采用UserData方式
//这里不用单独判断其expires,因为UserData本身具有这个判断
result = _getItem(config);
if(result) {
result = { value : result };
}
}
return result ? result.value : null;
};
var rst = null;
//判断传入的参数是否为数组
if(obj && obj.constructor === Array && obj instanceof Array){
rst = [];
for(var i = 0,len = obj.length;i < len;i++){
rst.push(_get_(obj[i]));
}
}else if(obj){
rst = _get_(obj);
}
return rst;
},
/**
* 移除某一项本地存储的数据
*
* //删除一个本地存储项
* wyLocalData.LocalStorage.remove({
* key : "username"
* });
* //删除多个本地存储项目 *
* wyLocalData.LocalStorage.remove([{
* key : "username"
* },{
* key : "password"
* },{
* key : "sex"
* }]);
*
* @param {String} obj 待移除的存储数据相关配置,支持移除某一个本地存储,也支持数组形式的批量移除
* @config {String} key 待移除数据的key
* @return 无
*/
remove : function(obj){
//移除某一项本地存储的数据
var _remove_ = function(config){
//支持本地存储的浏览器:IE8+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari4.0+、iPhone2.0+、Andrioid2.0+
if(_isSupportLocalStorage) {
window.localStorage.removeItem(config.key);
window.localStorage.removeItem(config.key + ".expires");
} else if(_isSupportUserData){ //IE7及以下版本,采用UserData方式
_removeItem(config);
}
};
//判断传入的参数是否为数组
if(obj && obj.constructor === Array && obj instanceof Array){
for(var i = 0,len = obj.length;i < len;i++){
_remove_(obj[i]);
}
}else if(obj){
_remove_(obj);
}
},
/**
* 清除所有本地存储的数据
*
* wyLocalData.LocalStorage.clearAll();
*
*/
clearAll : function(){
//支持本地存储的浏览器:IE8+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari4.0+、iPhone2.0+、Andrioid2.0+
if(_isSupportLocalStorage) {
window.localStorage.clear();
} else if(_isSupportUserData) { //IE7及以下版本,采用UserData方式
_clearAll();
}
},
/**
* 获取所有的本地存储数据对应的key
*
* var keys = wyLocalData.LocalStorage.getAllKeys();
*
* @return {Array} 所有的key
*/
getAllKeys : function(){
var result = [];
//支持本地存储的浏览器:IE8+、Firefox3.0+、Opera10.5+、Chrome4.0+、Safari4.0+、iPhone2.0+、Andrioid2.0+
if(_isSupportLocalStorage) {
var key;
for(var i = 0,len = window.localStorage.length;i < len;i++){
key = window.localStorage.key(i);
if(!/.+\.expires$/.test(key)) {
result.push(key);
}
}
} else if(_isSupportUserData) { //IE7及以下版本,采用UserData方式
result = _getAllKeys();
}
return result;
}
};
})();
}