JS 编程艺术
避免登录页被框架嵌套成子页
if (window != top) {
top.location.href = location.href;
}
参数覆盖
/*
* 对象参数配置
* @param userOption {Object} 用户参数对象
* @param defaultOption {Object} 默认参数对象
* @return {Object} 参数对象
*/
function paramsExtend(userOption, defaultOption) {
if (!userOption) return defaultOption;
for (var key in defaultOption) {
if (userOption[key] == null) {
userOption[key] = defaultOption[key];
} else if (typeof userOption[key] === 'object') {
paramsExtend(userOption[key], defaultOption[key]);
}
}
return userOption;
}
日期
/**
*对Date的扩展,将 Date 转化为指定格式的String
*月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
*年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
*例子:
*(new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
*(new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
*/
Date.prototype.format = function (fmt) {
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小时
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
/**
* 获取上一个月或下一个月日期
* @date 日期
* @type 上prev | 下next
*/
function getPreOrAfterDate(date, type) {
date = new Date(date);
var year = date.getFullYear(), //获取当前日期的年份
month = date.getMonth(), //获取当前日期的月份index
day = date.getDate(); //获取当前日期的日
var days = new Date(year, month + 1, 0);
days = days.getDate(); //获取当前日期中月的天数
var newYear = year, newMonthIndex = 0;
//月
if(type == "prev"){
newMonthIndex = parseInt(month) - 1;
if(newMonthIndex < 0){
newYear = parseInt(newYear) - 1;
newMonthIndex = 11;
}
}else if(type == "next"){
newMonthIndex = parseInt(month) + 1;
if(newMonthIndex > 11){
newYear = parseInt(newYear) + 1;
newMonthIndex = 0;
}
}
//日
var newDay = day;
var newDate = new Date(newYear, newMonthIndex+1, 0);
newDays = newDate.getDate();
if(type == "prev"){
if(newDay > newDays){
newDay = newDays;
}
}else if(type == "next"){
newDay = newDays;
}
return new Date(newYear, newMonthIndex, newDay);
}
/**
* 获取上一个月或下一个月日期
* @date 格式为yyyy-mm-dd的日期
* @type 上prev | 下after
*/
function getPreOrAfterDate(date, type) {
var arr = date.split('-');
var year = arr[0], //获取当前日期的年份
month = arr[1], //获取当前日期的月份
day = arr[2]; //获取当前日期的日
var days = new Date(year, month, 0);
days = days.getDate(); //获取当前日期中月的天数
var step = 1, type = type || 'after';
var year2 = year,
month2 = parseInt(month);
if(type == 'prev'){
month2 = month2 - step;
}else if(type == 'after'){
month2 = month2 + step;
}
if (month2 == 0) {//如果是1月份,则取上一年的12月份
year2 = parseInt(year2) - 1;
month2 = 12;
}else if (month2 == 13) {
year2 = parseInt(year2) + 1;
month2 = 1;
}
var day2 = day,
days2 = new Date(year2, month2, 0);
days2 = days2.getDate();
if (day2 > days2) {//如果原来日期大于上一月的日期,则取当月的最大日期。比如3月的30日,在2月中没有30
day2 = days2;
}
if (month2 < 10) {
month2 = '0' + month2;//月份填补成2位。
}
var res = year2 + '-' + month2 + '-' + day2;
return res;
}
function getFullDate(date) {
//返回 YYYY年MM月DD日
var year = month = day = ' ';
if (isNaN(date) && !isNaN(Date.parse(date))) {
var newDate = new Date(date);
year = newDate.getFullYear();
month = newDate.getMonth() + 1;
day = newDate.getDate();
month = month < 10 ? '0' + month : month;
day = day < 10 ? '0' + day : day;
}
return year + '年' + month + '月' + day + '日';
}
金额
function getUpperDigit(n) {
//数字转大写
var fraction = ['角', '分'];
var digit = [
'零', '壹', '贰', '叁', '肆',
'伍', '陆', '柒', '捌', '玖'
];
var unit = [
['元', '万', '亿'],
['', '拾', '佰', '仟']
];
var head = n < 0 ? '欠' : '';
n = Math.abs(n);
var s = '';
for (var i = 0; i < fraction.length; i++) {
s += (digit[Math.floor(n * 10 * Math.pow(10, i)) % 10] + fraction[i]).replace(/零./, '');
}
s = s || '整';
n = Math.floor(n);
for (var i = 0; i < unit[0].length && n > 0; i++) {
var p = '';
for (var j = 0; j < unit[1].length && n > 0; j++) {
p = digit[n % 10] + unit[1][j] + p;
n = Math.floor(n / 10);
}
s = p.replace(/(零.)*零$/, '').replace(/^$/, '零') + unit[0][i] + s;
}
return head + s.replace(/(零.)*零元/, '元').replace(/(零.)+/g, '零').replace(/^整$/, '零元整');
}
JS 编程艺术的更多相关文章
- 【js 编程艺术】小制作一
最近在看js编程艺术,照葫芦画瓢,做了一个小网页.作为一枚前端渣渣,遇到了好多坑,在这里就不提了. 首先是html代码 /*gallery.html*/<!DOCTYPE html> &l ...
- 【js编程艺术】小制作六
1.html /* movie.html*/<!DOCTYPE html> <html> <head> <meta charset="utf-8&q ...
- 【js编程艺术】小制作五
1.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <ti ...
- 【js 编程艺术】小制作四
1. html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...
- 【js 编程艺术】小制作三
1.html文件 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- 【js 编程艺术】小制作二
首先是一个html文档 /* explanation.html */<!DOCTYPE html> <html> <head> <meta charset=& ...
- 【js编程艺术】 之有用的函数
学习js的过程中有几个有用的函数. //添加事件函数 function addLoadEvent(func) { var oldonload = window.onload; if(typeof wi ...
- JavaScript DOM 编程艺术·setInterval与setTimeout的动画实现解析
先贴上moveElement()函数的大纲,为了方便观看,删了部分代码,完整版粘到文章后面. function moveElement(elementID,final_x,final_y,interv ...
- 学习Javascript DOM 编程艺术的一点心得
最近又看了一遍JS DOM编程艺术,照例来写一写读后感. 其实,我从中学到最深的是几个概念:1.平稳退化.当浏览器并不支持JS的时候网页的基本核心功能是还可以用的:2.逐渐增强.在原始的信息层上用其他 ...
随机推荐
- SQL-W3School-高级:SQL SELECT INTO 语句
ylbtech-SQL-W3School-高级:SQL SELECT INTO 语句 1.返回顶部 1. SQL SELECT INTO 语句可用于创建表的备份复件. SELECT INTO 语句 S ...
- vue2.0+vue-video-player实现hls播放的案例
1. 安装依赖. npm install vue-video-player --save 2. 在main.js引入vue-video-player. import VueVideoPlayer fr ...
- 手把手教你实现RecyclerView的下拉刷新和上拉加载更多
手把手教你实现RecyclerView的下拉刷新和上拉加载更多 版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...
- Jmeter启动闪退
背景:使用Jmeter进行性能测试脚本开发,实现Jmeter接口开发Java请求 问题再现: 1.在官网上下载Jmeter3.2版本,打开jmeter.bat,启动成功 2.在IDEA中创建测试项目和 ...
- Servlet 的三种跳转方式
1.Forword request.getRequestDispatcher (“url”).forword (request,response) 是请求转发,也就是说,一个 Servlet 向当前的 ...
- java处理jqueryGantt甘特图数据的task.depends依赖规则方法
前端采用jqueryGantt,github地址为:https://github.com/robicch/jQueryGantt 原以为后端只需要简单地保存甘特图任务列表和返回任务列表就行了. 但功能 ...
- golang web框架设计6:上下文设计
context,翻译为上下文,为什么要设计这个结构?就是把http的请求和响应,以及参数结合在一起,便于集中处理信息,以后框架的扩展等.好多框架比如gin,都是有这个上下文结构. context结构为 ...
- Run Hyper-V and VirtualBox on the same machine (轉載)
Run Hyper-V and VirtualBox on the same machine Posted on September 5, 2012 by derek gusoff Recently ...
- webdriervAPI(鼠标事件)
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains 导 ...
- eNSP——配置Trunk接口
原理: 在以太网中,通过划分 VLAN 来隔离广播域和增强网络通信的安全性.以太网通常由多台交换机组成,为了使 VLAN 的数据帧跨越多台交换机传递,交换机之间互连的链路需要设置为干道链路( Trun ...