表单验证输入是我们经常做的一项工作,比如价格的输入,就只能输入小数而且保留最多两位小数,但是翻看input事件属性,onchange、oninput、onkeyup似乎都可以完成,真的是这样吗?其实那只是你还是没有吃透这几个事件的使用而已,下面我们就来具体看看它们有什么不同。
onchange
定义和用法:事件会在域的内容改变时发生。
支持该事件的 HTML 标签:<input type="text">, <select>,<textarea>
所有主流浏览器都支持 onchange 属性。
oninput
定义和用法:事件在用户输入时触发。
支持该事件的 HTML 标签: <input>,<textarea>
浏览器支持 :
onkeyup
定义和用法:事件会在键盘按键被松开时发生。
支持该事件的 HTML 标签:
很多
所有主流浏览器都支持 onkeyup 属性。
从以上对比可以看出很多不同,在这里我还是重点说下它们触发的时机是不一样的:
oninput 事件在元素值发生变化时立即触发(页面显示的是回调函数处理过后的内容)
onchange 在元素失去焦点时立即触发(首先显示的是未处理的内容,失去焦点的情况在才去进行回调函数的执行,改变输入的内容)
onkeyup是按键松开时触发(首先显示的是未处理的内容,一直按住不放一直进行输入,只有按键松开时才会触发事件)
所以说,比如我们进行价格输入验证,就只能用oninput,对于ie9一下可以使用onpropertychange(有兴趣的同学可以去查下它),完了希望童鞋们多去试试,熟练掌握。
一种为HTML表单元素添加onchange事件处理器是一种可行的方法,这也是用的最多的,但是onchange的实现有一些问题存在:
1.如果用户改变表单域的值,然后再修改回原始值,程序仍将认为表单的修改已经发生。
2.如果表单项的值是通过Javascript动态修改的,onchange事件不会被自动触发。
3.为每一个表单元素增加onchange事件会引起性能问题,特别是较大的表单。
4.如果将表单元素从DOM中增加或移除,你需要相应的注册或移除事件侦听。
5.checkbox和radio的onchange事件在某些浏览器下不能按预期工作(你应该知道是哪个浏览器)。
6.除了onchange,还有更简单有效的方案。
<script type="text/javascript" src="jquery.js"></script>
<script>
$(function() {
$("#myform :input").change(function(){
$("#myform").data("changed",true);
});
})
者:魔王哪吒 来自掘金
小伙伴们,下午好。关于JavaScript学习相关文章,小编我最少发布了十几篇文章了,具体请见本篇文章底部,有兴趣的小伙伴可以看看。
var a=[1, 2, 5];
for(var k in a){
console.log(k); // k 为当前元素的下标
}
for(var m of a){
console.log(m); // m 为当前元素的值
}
VM215:3 0
VM215:3 1
VM215:3 2
VM215:6 1
VM215:6 2
VM215:6 5
复制代码
代码:
// ES5
var a='web';
window.a; // 'web'
// ES6
let b='web';
window.b; // undefined
复制代码
代码:
// 单行注释
/*
多行注释
*/
复制代码
代码:
// ES5及之前
console.log(a); // undefined
var a=1;
console.log(a); // 1
// ES6开始
console.log(b); // Uncaught ReferenceError: b1 is not defined
let b=2;
console.log(b); // 2
复制代码
代码:
// 函数声明
f(); // 'web'
function(){
console.log('web');
};
复制代码
// 函数表达式
g(); // Uncaught TypeError: g is not a function
var g=function(){ // 换成 let 声明也一样
console.log('web');
}
复制代码
示例{}包含的内容表示一个代码块
代码:
if(test1=="red") {
test1="blue";
alert(test1);
}
复制代码
JavaScript关键字:
break,else,new,var
case,finally,return,void
catch,for,switch,while
continue,function,this,with
default,if,throw
delete,in,try
do,instanceof,typeof
复制代码
在javascript中,变量是存储信息的容器,变量存在两种类型的值,即为原始值和引用值。
代码:
console.log( null==undefined); // true
复制代码
使用isFinite()方法判断参数值是否是有穷的。
示例:
console.log(NaN==NaN) // false
console.log(isNaN("66")); // false
复制代码
返回值:
undefined,变量是Undefined类型
boolean,变量是Boolean类型的
number,变量是Number类型的
string,变量是String类型的
object,变量是一种引用类型或者Null类型
复制代码
示例:
console.log(typeof 12); // number
复制代码
typeof运算符对null的值返回Object。
示例:
<script>
var a=new Array();
if(a instanceof Array) {
console.log('a是一个数组类型');
}else{
console.log('a不是一个数组类型');
}
</script>
复制代码
示例:
赋值运算符的符号为=算数运算符:+,-,*,/,%
比较运算符:>,>=,<,<=,!=,==,===,!==逻辑运算符:
&&,逻辑与,表示表达式前后全为true才能返回true
||,逻辑或,表示表达式前后只要有一个true就返回true
!,逻辑取反,表示表达式后若为true,则返回false,否则反之。
复制代码
示例:
if(条件 1) {
当条件1为true时执行的代码
}else if(条件 2){
当条件2为true时执行的代码
}else{
当条件1和条件2都不为true时执行的代码
}
复制代码
示例:
switch(n){
case1:
执行代码块1
break;
case2:
执行代码块2
break;
default:
...
}
复制代码
示例:
for(语句1;语句2;语句3){
被执行的代码块
}
复制代码
示例:
for(键 in 对象) {
代码块
}
复制代码
示例:
while(表达式){
代码块
}
复制代码
示例:
do {
代码
}while(表达式)
复制代码
数组的属性和方法:
concat()
连接两个或更多的数组,并返回一个新数组。
语法:
arr.concat(a1, a2, ..., an)
复制代码
参数:
join()
使用指定分隔符,连接两个或多个数组的元素,返回一个字符串。
pop()和push()
shift()和unshift()
示例:
let arr=[1, 2, 3, 5, 6];
let a1=arr.slice(2); // [3, 5, 6]
let a2=arr.slice(2,3); // [3]
let arr=[1, 2, 3, 4];
let a=arr.splice(1, 2, "web", "a");
// a=> [2, 3]
// arr=> [1, "web", "a", 4]
复制代码
代码:
let a=[1,3,5,7];
a.forEach(function(val, index, arr){
arr[index]=val * 2
})
a ; // [2, 6, 10, 14]
复制代码
代码:
arr.every(callback)
测试数组的所有元素是否都通过了指定函数的测试。
some()
测试数组中的某些元素是否通过由提供的函数实现的测试。
复制代码
示例:
let a=[1, "", "aa", 2, 6];
let res=a.filter(function(val, index, arr){
return typeof val=="number";
})
res;//[1, 2, 6]
复制代码
对每个元素执行此方法,并返回一个执行后的数组。
示例:
let a=[1, 3, 5];
let b=a.map(function(val, index, arr){
return val + 1;
})
b; //[2, 4, 6]
复制代码
拓展运算符使用(...)
示例:
console.log(...[1, 2, 3]); // 1 2 3
console.log(1, ...[2,3], 4); // 1 2 3 4
复制代码
// 通常情况 浅拷贝
let a1=[1, 2];
let a2=a1;
a2[0]=3;
console.log(a1,a2); // [3,2] [3,2]
// 拓展运算符 深拷贝
let a1=[1, 2];
let a2=[...a1];
// let [...a2]=a1; // 作用相同
a2[0]=3;
console.log(a1,a2); // [1,2] [3,2]
复制代码
let [a, ...b]=[1, 2, 3, 4];
// a=> 1 b=> [2,3,4]
let [a, ...b]=[];
// a=> undefined b=> []
let [a, ...b]=["abc"];
// a=> "abc" b=> []
复制代码
new Array(3).fill('a'); // ['a','a','a']
[1,2,3].fill('a'); // ['a','a','a']
[1,2,3].fill('a',1,2);// [1, "a", 3]
复制代码
代码:
[1,2,3].includes(3,3); // false
[1,2,3].includes(3,4); // false
[1,2,3].includes(3,-1); // true
[1,2,3].includes(3,-4); // true
复制代码
示例:
var arr1=[1, 2, [3, 4]];
arr1.flat();
// [1, 2, 3, 4]
var arr2=[1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]
var arr3=[1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]
复制代码
var arr4=[1, 2, , 4, 5];
arr4.flat();
// [1, 2, 4, 5]
复制代码
语法
var new_array=arr.flatMap(function callback(currentValue[, index[, array]]) {
// return element for new_array
}[, thisArg])
复制代码
var arr1=[1, 2, 3, 4];
arr1.map(x=> [x * 2]);
// [[2], [4], [6], [8]]
arr1.flatMap(x=> [x * 2]);
// [2, 4, 6, 8]
// only one level is flattened
arr1.flatMap(x=> [[x * 2]]);
// [[2], [4], [6], [8]]
复制代码
let arr1=["it's Sunny in", "", "California"];
arr1.map(x=> x.split(" "));
// [["it's","Sunny","in"],[""],["California"]]
arr1.flatMap(x=> x.split(" "));
// ["it's","Sunny","in", "", "California"]
复制代码
reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
var sum=[0, 1, 2, 3].reduce(function (accumulator, currentValue) {
return accumulator + currentValue;
}, 0);
// 和为 6
var total=[ 0, 1, 2, 3 ].reduce(
( acc, cur )=> acc + cur,
0
);
复制代码
语法
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
initialValue可选
作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
复制代码
字符串对象属性
字符串对象方法
indexOf(),lastIndexOf(),search()和match()。
3种字符串截取方法:substring(),slice(),substr()
字符串替换
replace(),replace(正则表达式/要被替换的字符串,要替换成为的子字符串)。
字符串切割
split()用于将一个字符串分割成字符串数组,语法为字符串。split(用于分割的子字符串,返回数组的最大长度),返回数组的最大长度一般情况下不设置。
事件流:
事件的处理过程主要有三个阶段:捕获阶段,目标阶段,冒泡阶段 事件流包含三个阶段:事件捕获阶段,处于目标阶段和事件冒泡阶段。
事件冒泡和事件捕获
事件触发方式
代码:
addEventListener("click","doSomething","true")
复制代码
第三个参数为true,表示采用事件捕获,若false,表示采用事件冒泡。
<!DOCTYPE html>
<html lang="en>
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
html,body{
width:100%;
height:100%;
}
</style>
<script>
window.onload=function(){
d1=document.getElementById("d1");
d2=document.getElementById("d2");
d3=document.getElementById("d3");
// true 表示在捕获阶段响应
// false 表示在冒泡阶段响应
d1.addEventListener("click",function(event){
console.log("d1")
},"true");
d2.addEventListener("click",function(event){
console.log("d2")
},"true")
d3.addEventListener("click",function(event){
console.log("d3")
},"true")
}
</script>
</head>
<body>
<div id="d1" style="background: #0000ff; width: 500px; height: 500px">
<div id="d2" style="background: #00ff00; width: 400px; height: 400px">
<div id="d3" style="background: #ff0000; width: 200px; height: 200px">
</div>
</div>
</div>
</body>
</html>
复制代码
addEventListener网页,点击跳转:addEventListener.html
一个响应事件委托到另一个元素。
<ul id="btn">
<li id="btn1">按钮1</li>
<li id="btn2">按钮2</li>
<li id="btn3">按钮3</li>
</ul>
var btn1=document.getElementById('btn1');
var btn2=document.getElementById('btn2');
var btn3=document.getElementById('btn3');
webbtn.myAddFun(btn1, 'click', function(event){
alert('1点击');
});
webbtn.myAddFun(btn2, 'click', function(event){
alert('2点击');
});
webbtn.myAddFun(btn3, 'click', function(event){
alert('3点击');
});
复制代码
添加一个事件处理函数,来做事件委托
var btn=document.getElementById('btn');
webbtn.myAddFun(btn, 'click', function(event){
event=webbtn.getMyEvent(event);
var target=webbtn.getMyTarget(event);
switch(target.id){
case "btn1":
alert('1点击');
break;
case "btn2":
alert('2点击');
break;
case "btn3":
alert('3点击');
break;
}
});
复制代码
键盘事件就是有关键盘操作所触发的世界。
键盘事件:
鼠标绑定onmousedown(),onmousemove(),onmouseup()事件。
mouse网页,点击跳转:mouse.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>mouse</title>
<style>
html,body{
width: 100%;
height: 100%;
}
#dd {
width: 120px;
height: 120px;
background: #00ff00;
position: absolute;
}
</style>
<script>
var dd;
var mflag=false;
function ondown() {
dd=document.getElementById('dd');
mflag=true;
}
function onmove(e){
if(mflag) {
dd.style.left=e.clientX - 60 + "px";
dd.style.top=e.clientY - 60 + "px";
}
}
function onup() {
mflag=false;
}
</script>
</head>
<body onmousemove="onmove(event)">
<div id="dd" onmousedown="ondown()" onmouseup="onup()" style="left: 80px;top: 120px;"
</body>
</html>
复制代码
鼠标事件:
示例:
function web(e) {
mouseX=e.clientX;
mouseY=e.clientY;
console.log("x:"+mouseX + "," + "y:"+mouseY)
}
<body onclick="web(event)">
复制代码
窗口事件:
load事件,表示当页面完全加载完之后,就会触发window上面的load事件。包含所有的图像,js文件,css文件等外部资源。
示例:
window.onload=function(){}
复制代码
当页面完全加载完之后执行其中的函数。
示例:
<script>
window.onload=function() {
var mydiv=document.getElementById("mydiv");
console.log(mydiv.innerText);
}
</script>
<body>
<div id="mydiv"></div>
</body>
复制代码
示例:
function imgLoad() {
myimg=document.getElementById("myimg");
// 图片加载完成后,给图片加载框
myimg.style.border="9px solid $00ff00";
}
<img id="myimg src="" onload="imgLoad()">
复制代码
resize事件
示例:
document.body.clientWidth和document.body.clientHeight获得窗口的宽和高。
html,body {
width: 100%;
height: 100%;
}
<script>
function winChange() {
winWidth=document.body.clientWidth;
winHeight=document.body.clientHeight;
}
</script>
<body onresize="winChange()">
</body>
复制代码
scrol事件,文档或者浏览器窗口被滚动时触发scroll事件
示例:
<script>
function scrollChange() {
srpos=document.getElementById("srpos");
srpos.innerText=document.documentElement.scrollTop;
srpos.style.top=docuemnt.documentElement.scrollTop+"px";
}
</script>
<body onscroll="scrollChange()">
<div style="height:300%;">
<br/>
<font id="srpos" style="position: relative;top: 0px">滚动条滚动到0px</font>
</div>
</body>
复制代码
焦点事件
示例:
<script>
var note;
function myfocus(fname,notename) {
note=document.getElementById(notename);
note.innerText=fname+'获得焦点';
}
function myblur(fname,notename) {
note=document.getElementById(notename);
note.innerText=fname + '失去焦点';
}
</script>
<body>
<form name="myform">
<input type="text" name="uname" onfocus="myfocus('uname','unote')" onblur="myblur('uname','unote')"/><font id="unote"></font>
<br/>
<input type="text" name="pwd" onfocus="myfocus('pwd','pnot')" onblur="myblur('pwd','pnote')"/><font id="pnote"></font>
</form>
</body>
复制代码
事件方法
窗口事件
鼠标事件
键盘事件与事件冒泡,获取
JavaScript的DOM操作,包含获取节点,获取,设置元素的属性值,创建,添加节点,删除节点,属性操作。
获取节点的方法:
document.getElementById(idName)
复制代码
document.getElementsByName(name)
复制代码
document.getElementsByClassName(className)
复制代码
document.getElementsByTagName(tagName)
复制代码
获取,设置元素的属性值
示例:
<script>
window.onload=function(){
mytable=document.getElementById('mytable');
// 获取mytable中标签名为tr的字节点
trs=mytable.getElementsByTagName("tr");
len=trs.length;
flag=true;
for(i=0;i<len;i++){
if(flag){
trs[i].setAttribute('bgcolor','#cccccc');
flag=false;
}else{
flag=true;
}
}
ww=mytable.getAttribute('width');
}
</script>
<body>
<table id="mytable' align='center' width="80%" border="1">
<tr bgcolor="#cccccc">
<td>aaa</td>
<td>bbb</td>
<td>ccc</td>
</tr>
</table>
</body>
复制代码
创建,添加节点
代码:
// 创建节点:
document.createElement("h1");
document.createTextNode(String);
document.createAttribute("class");
复制代码
代码:
element.appendChild(Node);
element.insertBefore(newNode, existingNode);
复制代码
代码:
element.removeChild(Node)
复制代码
属性操作:获取当前元素的父节点,获取当前元素的子节点,获取当前元素的同级元素,获取当前元素的文本,获取当前节点的节点类型,设置样式。
代码:
element.parentNode
复制代码
代码:
element.chlidren
复制代码
代码:
element.nextElementSibling
element.previousElementSibling
复制代码
代码:
element.innerHTML
element.innerText
复制代码
代码:
node.nodeType
复制代码
document对象
document属性和方法:
location对象
location属性和方法:
navigator 对象
navigator对象包含有关浏览器的信息
screen对象
screen对象的属性:
history对象
history对象的属性:
数学函数
日期函数
代码:
function 函数名(参数){
函数体
return 返回值
}
复制代码
代码:
function web1 () {
document.write("1");
}
web1();
var web2=function(){
document.write("2")
}
web2();
// 无须调用,直接执行,此方法不常用
var web3=new function(
document.write("3")
);
复制代码
在js中一个函数在另一个函数中定义,就可以访问到父函数的成员,内部的函数就称为闭合函数。
闭合是词法闭包的简称,是引用了自由变量的函数。
闭包函数的特点:
代码:
function init() {
var name="web"; // name 是一个被 init 创建的局部变量
function displayName() { // displayName() 是内部函数,一个闭包
alert(name); // 使用了父函数中声明的变量
}
displayName();
}
init();
复制代码
init() 创建了一个局部变量 name 和一个名为 displayName() 的函数。
displayName() 是定义在 init() 里的内部函数,并且仅在 init() 函数体内可用。
displayName() 没有自己的局部变量。然而,因为它可以访问到外部函数的变量,所以 displayName() 可以使用父函数 init() 中声明的变量 name 。
displayName() 函数内的 alert() 语句成功显示出了变量 name 的值(该变量在其父函数中声明)。
这个词法作用域的例子描述了分析器如何在函数嵌套的情况下解析变量名。
词法指,词法作用域根据源代码中声明变量的位置来确定该变量在何处可用。嵌套函数可访问声明于它们外部作用域的变量。
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
JavaScript中所有的function都是一个闭包。不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”。
闭包的作用
在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
代码如下:
for(var i=0 ; i<10; i++){
setTimeout(function(){
console.log(i);
},100);
}
复制代码
返回的是10个10。
解决:
for(var i=0; i<10 ; i++){
(function(i){
setTimeout(function(){
console.log(i);
}, i*100);
})(i);
}
复制代码
ES6之前,使用var声明变量会变量提升问题:
for(var i=0 ; i<10; i++)
{
console.log(i)
};
console.log(i);
// 变量提升 返回10
复制代码
示例:
// 1
var Person=function(id,name){
this.id=di;
this.name=name;
}
var user1=new Person(1,"web");
// 2
var web1={id:1,name:"web"};
var web2=Object.create({id:2,name:"web"});
复制代码
创建正则表达式
使用一个正则表达式字面量:
let reg=/ab+c/;
let reg=/^[a-zA-z]/gi;
复制代码
字符串方法
正则对象方法
RegExp对象方法
[a-z]
匹配小写字母从a到z中的任意一个字符
复制代码
[A-Z]
匹配大写字母从a到z中的任意一个字符
复制代码
[0-9]
匹配数字0到9中任意一个字符,等于 \d
复制代码
[0-9a-z]
匹配数字0到9或者小写字母a到z中任意一个字符。
复制代码
[0-9a-zA-Z]
匹配数字0到9或小写a到z或大写A到Z中任意一个字符
复制代码
[abcd]
匹配字符abcd中的任意一个字符
复制代码
[^a-z]
匹配除小写字母a到z外的任意一个字符
复制代码
[^0-9]
匹配除数字0到9外的任意一个字符
复制代码
[^abcd]
匹配除abcd外的任意一个字符
复制代码
元字符是拥有特殊含义的字符:
.
查找单个字符,除了换行和行结束符。
复制代码
\w
查找单词字符。
复制代码
\W
查找非单词字符。
复制代码
\d
查找数字。
复制代码
\D
查找非数字字符。
复制代码
\s
查找空白字符。
\S
查找非空白字符。
复制代码
\0
查找 NUL 字符。
\n
查找换行符。
\f
查找换页符。
\r
查找回车符。
\t
查找制表符。
\v
查找垂直制表符。
复制代码
\xxx
查找以八进制数 xxx 规定的字符。
\xdd
查找以十六进制数 dd 规定的字符。
\uxxxx
查找以十六进制数 xxxx 规定的 Unicode 字符。
复制代码
量词描述
.定位符
定位符可以将一个正则表达式固定在一行的开始或者结束,也可以创建只在单词内或者只在单词的开始或者结尾处出现的正则表达式。
复制代码
^
匹配输入字符串的开始位置
复制代码
$
匹配输入字符串的结束位置
复制代码
\b
匹配一个单词边界
复制代码
\B
匹配非单词边界
复制代码
/^[\d]{4}-[\d]{1,2}-[\d]{1,2}${1,2}$]/
日期字符
复制代码
转义符
使用转义符(反斜杠\)进行转义
复制代码
new RegExp(str[, attr])接收2个参数,str是一个字符串,指定正则表达式匹配规则,attr可选,表示匹配模式,值有g(全局匹配),i(区分大小写的匹配)和m(多行匹配)。
表达式:g,i,m
g 表示全局模式
应用于所有字符串,而非在发现第一个匹配项就停止
i 表示不区分大小写模式
m 表示多行模式
继续查找下一行中是否存在模式匹配的项
复制代码
函数的实际参数会被保存在一个类数组对象 arguments 对象中,通过索引访问具体的参数:
var a=arguments[i]
复制代码
onBlur:当失去输入焦点后产生该事件
onFocus:当输入获得焦点后,产生该文件
Onchange:当文字值改变时,产生该事件
Onselect:当文字加亮后,产生该文件
1.如果本文对你有帮助,就点个赞支持下吧,你的「赞」是我创作的动力。
《关于前端174道 JavaScript知识点汇总(一)》
《关于前端174道 JavaScript知识点汇总(二)》
《关于前端174道 JavaScript知识点汇总(三)》
《JavaScript ECMAScript语法概括【思维导图】》
《都2020年了,你还不会JavaScript 装饰器?》
《100个原生JavaScript代码片段知识点详细汇总【实践】》
《送你 43 道 JavaScript 面试题》
《70个JavaScript知识点详细总结(上)【实践】》
《70个JavaScript知识点详细总结(下)【实践】》
《3个很棒的小众JavaScript库,你值得拥有》
《Echa哥教你彻底弄懂 JavaScript 执行机制》
《3个很棒的小众JavaScript库,你值得拥有》
《几个非常有意思的javascript知识点总结【实践】》
《开源了一个 JavaScript 版敏感词过滤库》
《推荐7个很棒的JavaScript产品步骤引导库》
《一个合格的中级前端工程师需要掌握的 28 个 JavaScript 技巧》
作者:魔王哪吒
转发链接:https://juejin.im/post/5e8089dde51d4546d72d2099
*请认真填写需求信息,我们会在24小时内与您取得联系。