/**
* Author: shiddong
*/
/**
* 扩展字符串的方法:翻转字符串
* @param
* str: 需要翻转的字符串
*
* @description
* 数组有reverse方法,先将字符串分隔成数组,翻转之后再拼接
*/
function reverse(str) {
return str.split('').reverse().join('');
}
/**
* 检查属性是否是在原型中
* @param
* obj: 检查的对象
* attr: 检查的属性
*
* @description
* hasOwnProperty()方法检查对象实例中的属性,in操作符会两个都检查(实例和原型中)
* 即:hasOwnProperty()只在属性存在于实例中才返回true,而in操作符只要通过对象能够访问到属性就返回true
*/
function hasPrototyeProperty(obj, attr) {
return !obj.hasOwnProperty(attr) && (attr in obj);
}
/**
* 动态加载 JavaScript 脚本
*
* @param
* url: JavaScript 文件的 URL
* callback: 当 JavaScript 接收完成时触发的回调函数
*
* @description
* 1.Firefox、Opera, Chorme 和 Safari 3+会在<script>节点接收完成之后发出一个 onload 事件。您可以监听这一事件,以得到脚本准备好的通知。
* 2.Internet Explorer 支持另一种实现方式,它发出一个 readystatechange 事件。<script>元素有一个 readyState 属性,它的值随着下载外部文件的过程而改变。readyState 有五种取值:
* "uninitialized":默认状态
* "loading":下载开始
* "loaded":下载完成
* "interactive":下载完成但尚不可用
* "complete":所有数据已经准备好
*
* 微软文档上说,在<script>元素的生命周期中,readyState 的这些取值不一定全部出现,但并没有指出哪些取值总会被用到。实践中,我们最感兴趣的是“loaded”和“complete”状态。
* Internet Explorer 对这两个 readyState 值所表示的最终状态并不一致,有时<script>元素会得到“loader”却从不出现“complete”,但另外一些情况下出现“complete”而用不到“loaded”。
* 最安全的办法就是在 readystatechange 事件中检查这两种状态,并且当其中一种状态出现时,删除 readystatechange 事件句柄(保证事件不会被处理两次)。
*
* @示例:
* loadScript("script.js", function(){
* alert("File is loaded!");
* });
*
* 可以在页面中动态加载很多 JavaScript 文件,但要注意,浏览器不保证文件加载的顺序。所有主流浏览器之中,只有 Firefox 和 Opera 保证脚本按照你指定的顺序执行。
* 其他浏览器将按照服务器返回它们的次序下载并运行不同的代码文件。
*
* 我们可以将下载操作串联在一起以保证他们的次序:
* loadScript("script1.js", function(){
* loadScript("script2.js", function(){
* loadScript("script3.js", function(){
* alert("All files are loaded!");
* });
* });
* });
* 如果多个文件的次序十分重要,更好的办法是将这些文件按照正确的次序连接成一个文件。独立文件可以一次性下载所有代码(由于这是异步进行的,使用一个大文件并没有什么损失)。
*/
function loadScript(url, callback) {
var script = document.createElement("script")
script.type = "text/javascript";
if (script.readyState) {
script.onreadystatechange = function () {
if (script.readyState == "loaded" || script.readyState == "complete") {
script.onreadystatechange = null;
callback();
}
};
} else {
script.onload = function () {
callback();
};
}
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);
}
function addScriptTag(src) {
var script = document.createElement('script');
script.setAttribute("type","text/javascript");
script.src = src;
document.body.appendChild(script);
}
function callbackFn(data) {
console.log('Your public IP address is: ' + data.ip);
};
window.onload = function () {
addScriptTag('http://example.com/ip?callback=callbackFn');
}
function sleep(milliSeconds) {
var startTime = new Date().getTime();
while (new Date().getTime() < startTime + milliSeconds);
}
function isPrime(element) {
var start = 2;
while (start <= Math.sqrt(element)) {
if (element % start++ < 1) {
return false;
}
}
return element > 1;
}
function safeApply (fn){
var phase = this.$root.$$phase;
if (phase == '$apply' || phase == '$digest') {
fn && (typeof fn === 'function') && fn();
} else {
this.$apply(fn);
}
}
function isChinese (text) {
return /^[\u4e00-\u9fa5]+$/.test(text);
}
function isEmptyObject(obj) {
var prop;
for (prop in obj) {
return false;
}
return true;
}
if (!Object.keys) {
Object.keys = (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !({toString: null}).propertyIsEnumerable('toString'),
dontEnums = ['toString', 'toLocaleString', 'valueOf', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'constructor' ],
dontEnumsLength = dontEnums.length;
return function (obj) {
if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');
var result = [];
for (var prop in obj) {
if (hasOwnProperty.call(obj, prop)) result.push(prop);
}
if (hasDontEnumBug) {
for (var i=0; i < dontEnumsLength; i++) {
if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
}
}
return result;
};
})();
};
function setLocalStorage(name, value) {
var cache = {
data: value,
preTime: new Date().getTime()
};
localStorage.setItem(name, JSON.stringify(cache));
};
function getLocalStorage(name, overtime) {
var cache = localStorage.getItem(name);
if (cache && cache !== 'undefined') {
cacheObj = JSON.parse(cache);
var now = new Date().getTime();
if (cacheObj && cacheObj.preTime && now - cacheObj.preTime < overtime) {
return cacheObj.data;
}
}
return null;
}
function isIEBrowser () {
var userAgent = navigator.userAgent;
var isOpera = userAgent.indexOf("Opera") > -1;
if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) {
return true;
}
return false;
}
function int(str) {
return parseInt(str, 10);
}
var lowercase = function(string){return isString(string) ? string.toLowerCase() : string;};
msie = int((/msie (\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);
if (isNaN(msie)) {
msie = int((/trident\/.*; rv:(\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);
}
function isString(value){return typeof value === 'string';}
function isArrayLike(obj) {
if (obj == null || isWindow(obj)) {
return false;
}
var length = obj.length;
if (obj.nodeType === 1 && length) {
return true;
}
return isString(obj) || isArray(obj) || length === 0 ||
typeof length === 'number' && length > 0 && (length - 1) in obj;
}
var CookieUtil = {
get: function (name){
var cookieName = encodeURIComponent(name) + "=",
cookieStart = document.cookie.indexOf(cookieName),
cookieValue = null,
cookieEnd;
if (cookieStart > -1){
cookieEnd = document.cookie.indexOf(";", cookieStart);
if (cookieEnd == -1){
cookieEnd = document.cookie.length;
}
cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd));
}
return cookieValue;
},
set: function (name, value, expires, path, domain, secure) {
var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
if (expires instanceof Date) {
cookieText += "; expires=" + expires.toGMTString();
}
if (path) {
cookieText += "; path=" + path;
}
if (domain) {
cookieText += "; domain=" + domain;
}
if (secure) {
cookieText += "; secure";
}
document.cookie = cookieText;
},
unset: function (name, path, domain, secure){
this.set(name, "", new Date(0), path, domain, secure);
}
};
function getPreMonth(prev, dateIn, computerTime) {
var tips = 'Please input a correct number. the interface is like: [getPreMonth(prev, dateIn, humanTime)].'
if (prev < 0) throw (tips);
var date = dateIn ? new Date(dateIn) : new Date(),
year = date.getFullYear(),
month = date.getMonth() + 1;
var preYear = parseInt(prev / 12),
preMonth = prev % 12;
var reYear, reMonth;
if (preMonth >= month) {
reMonth = month - preMonth + 12;
reYear = year - preYear - 1;
} else {
reMonth = month - preMonth;
reYear = year - preYear;
}
if (computerTime) {
--reMonth;
}
return {
year: reYear,
month: reMonth
}
}
function isUndefined(value){return typeof value === 'undefined';}
function isDefined(value){return typeof value !== 'undefined';}
function isObject(value){return value != null && typeof value === 'object';}
function isString(value){return typeof value === 'string';}
function isNumber(value){return typeof value === 'number';}
function isDate(value) {
return toString.call(value) === '[object Date]';
}
var isArray = (function() {
if (!isFunction(Array.isArray)) {
return function(value) {
return toString.call(value) === '[object Array]';
};
}
return Array.isArray;
})();
function isFunction(value){return typeof value === 'function';}
function isRegExp(value) {
return toString.call(value) === '[object RegExp]';
}
function isWindow(obj) {
return obj && obj.document && obj.location && obj.alert && obj.setInterval;
}
function isScope(obj) {
return obj && obj.$evalAsync && obj.$watch;
}
function isFile(obj) {
return toString.call(obj) === '[object File]';
}
function isBlob(obj) {
return toString.call(obj) === '[object Blob]';
}
function isBoolean(value) {
return typeof value === 'boolean';
}
var trim = (function() {
if (!String.prototype.trim) {
return function(value) {
return isString(value) ? value.replace(/^\s\s*/, '').replace(/\s\s*$/, '') : value;
};
}
return function(value) {
return isString(value) ? value.trim() : value;
};
})();
function isElement(node) {
return !!(node &&
(node.nodeName
|| (node.prop && node.attr && node.find)));
}
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版