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.逐渐增强.在原始的信息层上用其他 ...
随机推荐
- Mac卸载mysql数据库
mac下的应用程序中一般是无法找到mysql的安装文件进行直接删除的,所以,通常需要打开命令行工具Terminal后,使用如下的命令进行删除: 1 sudo rm /usr/local/mysql2 ...
- C之堆栈
栈* 自动申请,自动释放* 大小固定,内存空间连续* 从栈上分配的内存叫静态内存 堆* 程序员自己申请* new/malloc* 大小取决于虚拟内存的大小,内存空间不连续* java中自动回收,C中需 ...
- 13 Flutter仿京东商城项目 商品列表筛选以及上拉分页加载更多
ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...
- 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_12.RabbitMQ研究-工作模式-统配符工作模式测试
路由模式: 1.每个消费者监听自己的队列,并且设置带统配符的routingkey. 2.生产者将消息发给broker,由交换机根据routingkey来转发消息到指定的队列. 创建测试用例 交换机的名 ...
- Java 实现 telnet命令 验证主机端口的连通性
Java 实现 telnet命令 验证主机端口的连通性 1.Telnet 命令 Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式.它为用户提供了在本地计 ...
- 关于SVM的一些知识点
SVM支持向量机 定义:支持向量机是主要用于解决分类问题的学习模型.它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器. 分类 1-当训练样本线性可分,通过硬间隔最大化,学习一个线性分类 ...
- Adobe Acrobat 如何通过书签制作多级目录
废话不多说,直接上官方文档 看不清可 右击 > 在新标签页中打开图片
- 在图中寻找最短路径-----深度优先算法C++实现
求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例 ...
- Python报错:TypeError: data type not understood
K-Means聚类算法 def randCent(dataSet, k): m, n = dataSet.shape # numpy中的shape函数的返回一个矩阵的规模,即是几行几列 centrod ...
- Guava源码阅读-base-CharMatcher
package com.google.common.base; (部分内容摘自:http://blog.csdn.net/idealemail/article/details/53860439) 之前 ...