2022/12/15 15:39:40
keyCode 8 = BackSpace BackSpace
keyCode 9 = Tab Tab
keyCode 12 = Clear
keyCode 13 = Enter
keyCode 16 = Shift_L
keyCode 17 = Control_L
keyCode 18 = Alt_L
keyCode 19 = Pause
keyCode 20 = Caps_Lock
keyCode 27 = Escape Escape
keyCode 32 = space
keyCode 33 = Prior
keyCode 34 = Next
keyCode 35 = End
keyCode 36 = Home
keyCode 37 = Left
keyCode 38 = Up
keyCode 39 = Right
keyCode 40 = Down
keyCode 41 = Select
keyCode 42 = Print
keyCode 43 = Execute
keyCode 45 = Insert
keyCode 46 = Delete
keyCode 47 = Help
keyCode 48 = 0 equal braceright
keyCode 49 = 1 exclam onesuperior
keyCode 50 = 2 quotedbl twosuperior
keyCode 51 = 3 section threesuperior
keyCode 52 = 4 dollar
keyCode 53 = 5 percent
keyCode 54 = 6 ampersand
keyCode 55 = 7 slash braceleft
keyCode 56 = 8 parenleft bracketleft
keyCode 57 = 9 parenright bracketright
keyCode 65 = a A
keyCode 66 = b B
keyCode 67 = c C
keyCode 68 = d D
keyCode 69 = e E EuroSign
keyCode 70 = f F
keyCode 71 = g G
keyCode 72 = h H
keyCode 73 = i I
keyCode 74 = j J
keyCode 75 = k K
keyCode 76 = l L
keyCode 77 = m M mu
keyCode 78 = n N
keyCode 79 = o O
keyCode 80 = p P
keyCode 81 = q Q at
keyCode 82 = r R
keyCode 83 = s S
keyCode 84 = t T
keyCode 85 = u U
keyCode 86 = v V
keyCode 87 = w W
keyCode 88 = x X
keyCode 89 = y Y
keyCode 90 = z Z
keyCode 96 = KP_0 KP_0
keyCode 97 = KP_1 KP_1
keyCode 98 = KP_2 KP_2
keyCode 99 = KP_3 KP_3
keyCode 100 = KP_4 KP_4
keyCode 101 = KP_5 KP_5
keyCode 102 = KP_6 KP_6
keyCode 103 = KP_7 KP_7
keyCode 104 = KP_8 KP_8
keyCode 105 = KP_9 KP_9
keyCode 106 = KP_Multiply KP_Multiply
keyCode 107 = KP_Add KP_Add
keyCode 108 = KP_Separator KP_Separator
keyCode 109 = KP_Subtract KP_Subtract
keyCode 110 = KP_Decimal KP_Decimal
keyCode 111 = KP_Divide KP_Divide
keyCode 112 = F1
keyCode 113 = F2
keyCode 114 = F3
keyCode 115 = F4
keyCode 116 = F5
keyCode 117 = F6
keyCode 118 = F7
keyCode 119 = F8
keyCode 120 = F9
keyCode 121 = F10
keyCode 122 = F11
keyCode 123 = F12
keyCode 124 = F13
keyCode 125 = F14
keyCode 126 = F15
keyCode 127 = F16
keyCode 128 = F17
keyCode 129 = F18
keyCode 130 = F19
keyCode 131 = F20
keyCode 132 = F21
keyCode 133 = F22
keyCode 134 = F23
keyCode 135 = F24
keyCode 136 = Num_Lock
keyCode 137 = Scroll_Lock
keyCode 187 = acute grave
keyCode 188 = comma semicolon
keyCode 189 = minus underscore
keyCode 190 = period colon
keyCode 192 = numbersign apostrophe
keyCode 210 = plusminus hyphen macron
keyCode 211 =
keyCode 212 = copyright registered
keyCode 213 = guillemotleft guillemotright
keyCode 214 = masculine ordfeminine
keyCode 215 = ae AE
keyCode 216 = cent yen
keyCode 217 = questiondown exclamdown
keyCode 218 = onequarter onehalf threequarters
keyCode 220 = less greater bar
keyCode 221 = plus asterisk asciitilde
keyCode 227 = multiply division
keyCode 228 = acircumflex Acircumflex
keyCode 229 = ecircumflex Ecircumflex
keyCode 230 = icircumflex Icircumflex
keyCode 231 = ocircumflex Ocircumflex
keyCode 232 = ucircumflex Ucircumflex
keyCode 233 = ntilde Ntilde
keyCode 234 = yacute Yacute
keyCode 235 = oslash Ooblique
keyCode 236 = aring Aring
keyCode 237 = ccedilla Ccedilla
keyCode 238 = thorn THORN
keyCode 239 = eth ETH
keyCode 240 = diaeresis cedilla currency
keyCode 241 = agrave Agrave atilde Atilde
keyCode 242 = egrave Egrave
keyCode 243 = igrave Igrave
keyCode 244 = ograve Ograve otilde Otilde
keyCode 245 = ugrave Ugrave
keyCode 246 = adiaeresis Adiaeresis
keyCode 247 = ediaeresis Ediaeresis
keyCode 248 = idiaeresis Idiaeresis
keyCode 249 = odiaeresis Odiaeresis
keyCode 250 = udiaeresis Udiaeresis
keyCode 251 = ssharp question backslash
keyCode 252 = asciicircum degree
keyCode 253 = 3 sterling
keyCode 254 = Mode_switch
键值对应表
A 0X65 U 0X85
B 0X66 V 0X86
C 0X67 W 0X87
D 0X68 X 0X88
E 0X69 Y 0X89
F 0X70 Z 0X90
G 0X71 0 0X48
H 0X72 1 0X49
I 0X73 2 0X50
J 0X74 3 0X51
K 0X75 4 0X52
L 0X76 5 0X53
M 0X77 6 0X54
N 0X78 7 0X55
O 0X79 8 0X56
P 0X80 9 0X57
Q 0X81 ESC 0X1B
R 0X82 CTRL 0X11
S 0X83 SHIFT 0X10
T 0X84 ENTER 0XD
如果要使用组合键,则可以判断是否同时按下了这几个键,比如Ctrl键、Shift键以及Alt键的组合使用就可以判断是否多按下了Ctrl键、Shift键以及Alt键。
$(document).keydown(function (event) {
if (event.keyCode == 13) {
// 按下回车
}
});
<script type="text/javascript" language=JavaScript charset="UTF-8">
document.onkeydown = function(event) {
var e = event || window.event || arguments.callee.caller.arguments[0];
if (e && e.keyCode == 27) { // 按 Esc
//要做的事情
}
if (e && e.keyCode == 113) { // 按 F2
//要做的事情
}
if (e && e.keyCode == 13) { // enter 键
//要做的事情
}
};
</script>
2022/12/15 15:37:11
AI魔术橡皮擦:https://jpgrm.com/
AI人工智能图片放大:https://bigjpg.com/
人工智能视频无损放大:https://bigmp4.com/
人工智能老照片无损修复:https://jpghd.com/
2022/12/15 15:06:29
我们开发软件或者制作 PPT 的时候,常常会需要到网上找一些素材图片。但有时找到的图片分辨率可能太小,这时如果使用 PS 或其它一些软件直接放大,会发现放大后的图片会变得不清晰,出现模糊、边缘重影等问题。
这里推荐一些网站,可以实现照片的无损放大。
地址:https://www.upscale.media/
一个国外的图片放大网站,转换速度非常快,相比下面的纯图片放大网站功能更丰富,且完全免费
Upscale media可将图片最高放大到四倍,最大支持1500×1500像素的照片,支持url地址上传图片,支持png、jpeg、jpg、webp四种格式,可以放大对比转换后的效果。
地址:http://waifu2x.udp.jp/
每次使用都有个烦人的人机验证,很不爽;
文件大小不得超过5MB;可降噪图像的最大尺寸:3000x3000px;可放大图像的最大尺寸:1500x1500px。
来自 GitHub 上的一个著名的开源项目,使用深度卷积神经网络实现图片无损放大。可选择插图或照片,放大 1~2 倍,支持降噪处理。
可以使用第三方开源 Windows 客户端 waifu2x-caffe,支持批量处理,更大的放大倍数和更多的优化选项。
GitHub:https://github.com/nagadomi/waifu2x/
GitHub:https://github.com/lltcggie/waifu2x-caffe
地址:http://www.bigjpg.com/
网站只有一个功能,就是使用开源 waifu2x 人工智能深度卷积神经网络智能无损放大图片,它会将噪点和锯齿的部分进行补充,生成新的图,从而实现图片的无损放大。
动漫、插画图片的放大几乎可以说是完美的。将小图片放大后,无论是色彩、细节、边缘,效果都很出色。同时也兼容普通的照片放大。
由于是网站,我们全部操作都能在线完成,最多可以将图片无损放大 16 倍。缺点是每次处理速度会有些慢(确实有点慢)。
地址:https://imglarger.com/
支持JPG或PNG格式, 最大10MB或4000×4000像素(付费订阅用户)
最高可以放大8倍,自动分析图片噪点与锯齿,并恢复细节
AI Image Enlarger是一个国外网站,不过有中文语言选择,国人使用无障碍,不过该网站并不是完全免费,免费账户仅8个图片转换额度,最大支持5MB、1200*1200px的图片
必须注册账户才能使用,而最可恶的是当你选择简体中文的时候,你根本无法注册,只能选择其他语言注册
所以,不推荐使用!!!
2022/12/15 14:57:34
话不多说,直接上代码
function getUserData(callback) {
$.post('/requestURL', {
paramOne: value,
paramTwo: value
......
}, function(respData) {
if (callback && typeof callback === 'function') callback(respData);
});
}
2022/12/15 14:32:08
话不多说,先举个例子
let source = { a: 1 };
let target = Object.assign({}, source);
console.log(target) // { a: 1 }
source.a = 2;
console.log(source) // { a: 2 }
console.log(target) // { a: 1 }
target的值并没有随着source的变化而变化,到这里有人会说,这一看就是深拷贝嘛,来再举个例子
let source = { a: { b : 1 }, c: 1 };
let target = Object.assign({}, source);
console.log(target) // { a: { b: 1 }, c: 1 }
source.a.b = 2;
source.c = 3
console.log(source) // { a: { b: 2 }, c: 3 }
console.log(target) // { a: { b: 2 }, c: 1 }
神奇的事情发生了,target.a.b的值随着source变化而变化,但是target.c的值并没有随着source变化
看下阮一峰老师对Object.assign()的解释:
Object.assign()方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)
JS对象分为基础类型和引用类型,基础类型(Number, String, Boolean…)直接存储于栈中,引用类型(Object…)栈中存储指向存储在堆中的对象的指针。
Object.assign()拷贝的是属性值,如果源对象的属性值是一个指向对象的指针,那也只拷贝那个指针。所以如果对象的属性值为基础类型,对于通过Object.assign()拷贝的那个属性而言是深拷贝;如果对象的属性值为引用,对于通过通过Object.assign()拷贝的那个属性而言其实是浅拷贝的。
2022/12/15 11:17:49
$.extend( target [, object1 ] [, objectN ] )
用途:复制js对象,或将两个或更多对象的内容合并到第一个对象。
指示是否深度合并对应的参数就是[deep]
(深浅拷贝),是可选的,为true或false。默认情况是false(浅拷贝),并且false是不能够显示的写出来的。如果想写,只能写true(深拷贝),在默认情况下,通过$.extend()
合并操作不是递归的(浅拷贝);如果第一个对象的属性本身是一个对象或数组,那么它将完全用第二个对象相同的key重写一个属性。这些值不会被合并。然而,如果将true
作为该函数的第一个参数,那么会在对象上进行递归的合并(深拷贝)。
浅拷贝(false 默认):如果第二个参数对象有的属性第一个参数对象也有,那么不会进行相同参数内部的比较,直接将第一个对象的相同参数覆盖。
深拷贝(true):如果第二个参数对象有的属性第一个参数对象也有,还要继续在这个相同的参数向下一层找,比较相同参数的对象中是否还有不一样的属性,如果有,将其继承到第一个对象,如果没有,则覆盖。
$.extend( [deep ], target, object1 [, objectN ] )
参数 | 描述 |
---|---|
deep | 可选。 Boolean类型 指示是否深度合并对象,默认为false。如果该值为true,且多个对象的某个同名属性也都是对象,则该"属性对象"的属性也将进行合并。 |
target | Object类型 目标对象,其他对象的成员属性将被附加到该对象上。 |
object1 | 可选。 Object类型 第一个被合并的对象。 |
objectN | 可选。 Object类型 第N个被合并的对象。 |
let copiedArray = $.extend(true, [], targetArray);
就是将第三个参数中所有的字段深度复制到第二个参数中,若第二个参数与第三个参数有相同字段,那么第二个参数中该字段的值将会被第三个参数中相同字段的值覆盖。
let copiedObj = $.extend(true, {}, targetObj);
2022/12/12 16:30:49
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS实现0.5px分割线</title>
<style type="text/css">
.separator {
width: 100%;
}
.separator::before {
display: block;
content: "";
transform: scaleY(.5);
box-sizing: border-box;
height: 1px;
border-color: inherit;
border-style: inherit;
border-width: 1px 0 0;
background-color: red;
}
</style>
</head>
<body>
<div class="separator"></div>
</body>
</html>
2022/12/12 11:38:19
当使用tinymce富文本插件时,只要在编辑区有过操作(输入文字、上传图片等)即使将其清空后关闭页面时也会弹出“确认要离开此页吗?”确认框。以下是取消该项的解决方案。
将
option.plugins = option.plugins ? option.plugins : 'quickbars print preview searchreplace autolink directionality visualblocks visualchars fullscreen image axupimgs link media template code codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount imagetools textpattern help paste emoticons autosave bdmap indent2em ';
修改为
option.plugins = option.plugins ? option.plugins : 'quickbars print preview searchreplace autolink directionality visualblocks visualchars fullscreen image axupimgs link media template code codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount imagetools textpattern help paste emoticons bdmap indent2em '; // 移除autosave避免刷新、离开当前页面会有“系统可能不会保存您所做的更改”警告提示
// 主要的是plugins属性
var tinymceEditor = tinymce.render({
elem: "#contentInfo",
base_url: '/xxx/xxx',
images_upload_url: '/xxx/pic/upload',
height: 500,
plugins: 'quickbars print preview searchreplace autolink directionality visualblocks visualchars fullscreen image axupimgs link media template code codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount imagetools textpattern help paste emoticons bdmap indent2em '
});
2022/09/15 15:35:57
java -jar xxx.jar
@echo off
java -jar xxx.jar
exit
@echo off
start javaw -jar F:\test\visual.jar
exit
2022/09/13 17:32:26
import org.apache.commons.lang3.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DemoUtil {
/**
* 判断是否为手机号码
* @param phone 手机号码
* @return true or flase
*/
public static Boolean isPhone(String phone) {
Pattern p = Pattern.compile("^1([358][0-9]|4[579]|66|7[0135678]|9[589])[0-9]{8}$");
Matcher m = p.matcher(phone);
return m.matches();
}
/**
* 移动手机号码脱敏
* @param mobile 移动手机号码
* @return 已脱敏的移动手机号码
*/
public static String mobilePhoneSensitive(String mobile) {
return StringUtils.left(mobile, 3).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(mobile, 4), StringUtils.length(mobile), "*"), "***"));
}
/**
* 座机号码脱敏
* @param fixedPhone 座机号码
* @return 已脱敏的座机号码
*/
public static String fixedPhoneSensitive(String fixedPhone) {
return StringUtils.left(fixedPhone, 2).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(fixedPhone, 4), StringUtils.length(fixedPhone), "*"), "***"));
}
}