字面量的方式
var reg = /abc/
内置构造函数
var reg = new RegExp ("abc")
字面量有
text()
的方法,用于检测文字中是否含有输入的字面量
\d
代表着一位数字,即输入0~9之间的一位或以上的数字,写N个\d
即为N个以上\D
代表着一个非数字,即包含一个或以上,\Dk\D
这种为中间必须有k而且是非数字\s
代表着一位空白(空格 缩进 换行)有几个\s
即为有几个空白\S
代表着有一位非空白内容,有几个\S
即为有几个非空白\n
换行符\w
包含字母,数字,下划线,有几个\w
即为有几个字母,数字,下划线\W
包含非(字母,数字,下划线),有几个\W
即为有几个非(字母,数字,下划线).
任意内容(不包含换行)\
转义字符,可将上述基本元素转换成普通字符^
开头边界符
\d
前面即^\d
,表示开头第一个字符必须是数字$
结尾边界符
\d
后米即\d$
,表示结尾最后一个字符必须是数字/^开头结尾$/
var reg = /^abc$/
*
0~多次
+
1~多次
exec
方法可以截取出来数字的位置与长度?
0~1
{n}
指定次数
{n,}
大于等于n次
{n,m}
大于等于n小于等于m
()
整体
/(abc){2}/
|
或
/a|b/
[]
代表一个
-
来省略范围[a-z]
表示从a到z,[0-9]
表示从0到9,[a-zA-Z0-9_]
就相当于\w
/[asdfgh]/
[^]
取反
全局标识符g
g
然后多次调用正则表达式来逐个提取出来标识符i
/[a-z]/i
i
时代表着取得范围时a~z并且必须时小写,加上i
之后大写也可以提取/\d{1,4}/
?
/\d{1,4}?/
?
对于限定范围内有效var newstr = str.replace(/a/g,"*")
//g
则只能提取出第一个avar oinput= document.querySelector("input")
var ospan= document.querySelector("span")
var reg1 = /\d/
var reg2 = /[a-z]/
var reg3 = /[!@#$%^&*()]/
oinput.oninput =function(){
this.value
var level =0
if (reg1.test(this.value)) level++
if (reg2.test(this.value)) level++
if (reg3.test(this.value)) level++
for(var i=0;i<=ospan.lenght;i++;){
ospan[i].classList.remove("active")
if(i<level){
ospan[i].classList.add("active")
}
}
}
var obj = {
name : "asdf"
test : function(){
console.log("111",this.name)
}
}
obj.test()
//此时控制台出现的就是"111,asdf"
call
call()
指向括号内部的值apply
bind
let
const
var oHeaderItems = document.querySelectorAll(".header li")
var oBoxItems = document.querySelectorAl1( ".box li")
for(let i=0; i<oHeaderItems.length; i++){
oHeaderItems[i].dataset.index = i
oHeaderItems[i].onclick = function(){
}
}
function(){}
改变成了()=>{}
特点
{}
(只有返回值时可以省略return,只有一句代码时)默认参数
在函数的形参区域先给参数定义一个值
var arr = ["asd","132","12sd"]
let [x,y,z]
console.log(x,y,z)
var a = 10
var b = 20
var [b,a] = [a,b]
var arr = [1,2,[3,4,[5]]]
//想获取5,需要arr[2][2][0]
var [a,b,[c,d,[e]]] = arr
//直接取e即可
对象
var obj = {
name = "zhangsan"
age = 100
location:"henaN"
}
let {name , age, location:mylocation} = obj
对象结构中,key与后面的变量相同时,可以不写变量的名称
mybtn.onclick = function(){
let usesrname = myusername.value
let password = password.value
var obj = {
username,
password
}
}
...
展开运算符
展开数组
var a = [1,2,3]
var b = [2,3,4,5]
var c = [...a...b]
//此时c数组等与a与b数组合并
arr a = [1,2,3]
var b = [...a]
var test = (...arr)=>{
console.log(arr)
}
test(1,2,3,4,5)
var arr = [1,2,3,4,5]
var res = Math.max(...arr)
function test(){
var arr = [...arguments]
}
test(1,2,3,4,5)
展开对象
var obj1 = {
name:"zhangsan"
age:100
}
var obj1 = {
name:"zhangsan"
age:100
}
var obj = {
...obj1,
...obj2
}
//出现相同的key时下面的会覆盖掉上面的
私密不漏
export{}
中,以对象的方式script
里的type
中添加module
,紧接着用import{}from './module/XXX'
的 { }中加入export{}
中的方法重名不怕
依赖不乱
function createObject(name){
var obj = {}
obj.name = name
//if(name==XXX){执行XXX}
onj.matical = []
return obj
}
var obj1 = createObject('shaokao')
function createObject(name){
this.name = name
this.martical = []
this.coke = function(){
}
}
var obj2=new createObject("第三次")
首字母大写
function CreateObject(){}
构造函数中不写return
构造函数可以当成不同函数用,不过里面加了this会指向window
this指向
function createObject(name){
this.name = name
this.martical = []
this.coke = function(){
}
}
new CreateObj()//new过程 == 实例化这个过程,实例化后,,this指向实例化对象
概念:
对象原型__proto__
<head>
<style>
*{
margin:0;
padding:0;
}
ul{
list-style: none;
}
.header{
dispLay: flex;
width:500px;
}
.header li {
flex:1;
height: 50px;
line-height: 50px;
text-align: center;
border:1px solid black;
}
.box {
position: relative;
height: 200px;
}
.box li {
position: absolute;
left:0;
top:0;
width: 500px;
height: 200px;
background-color:yellow;
display:none;
}
.header .active{
background-color: red;
}
.box .active{
dispLay: block;
}
</style>
</head>
<body>
<div class="container1">
<ul class=" header">
<li class="active">1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
</div>
<div class="container2">
<ul class="box">
<li class="active">111</li>
<li>222</li>
<li>333</li>
<li>444</li>
</ul>
</div>
<script>
function Tabs(select,type){
var container = document.querySelector(select)
this.oHeaderItems = container.querySelectorAll(".heraer li")
this.oBoxItems = document.querySelectorAl1( ".box li")
this.type = type
this.change()
}
Tabs.prototype.change = function(){
for(let i=0; i<oHeaderItems.length; i++){
this.oHeaderItems[i].addEventListener(type,()=>{
var index =i
for(var m=0;m<oHeaderitems.length; m++){
this.oHeaderItems[m].classList.remove("active")
this.oBoxItems[m].classList.remove( "active")
}
this.oHeaderItems[index].classList.add( "active")
this.oBoxItems [index].classList.add ( "active")
})
}
}
new Tabs(".container1","click")
new Tabs(".container2","mouserover")
</script>
</body>
cLass createobj {
//构造器函数
constructor( name){
this.name =name
}
}
function Person(name,age){
this.name = name
this.age = age
}
Person.prototype.say = function(){
console.log(this.name,this.age)
}
function student(name,age,classroom){
Person.call(this,name,age)
this.classroom = classroom
}
student.prototype = new Person()
function Person(name,age){
this.name = name
this.age = age
}
Person.prototype.say = function(){
console.log(this.name,this.age)
}
function student(name,age,classroom){
Person.call(this,name,age)
this.classroom = classroom
}
student.prototype = new Person()
var obj1 = new student("lu",18,474)
console.log(obj1)
obj1.say()
<div class="box1">
<h1></h1>
<ul></ul>
</div>
<div class="box2">
<h1></h1>
<img src="">
<ul></ul>
</div>
<script>
var data1 = {
title: "体育",
list:["体育-1","体育-2","体育-3"]
}
var data2 = {
title:"综艺",
url:""
list:["综艺-1","综艺-2","综艺3"]
}
function CreateList(select,data={}) {
this.ele = document.queryselector(select)
this.title = data.title,
this.list = data.list
}
CreateList.prototype.render = function () {
//渲染页面
var h1 = this.ele.querySelector("h1")
var ul = this.ele.querySelector("ul")
// console.log(h1,ul)
h1.innerHTML = this.title
ul.innerHTML = this.list.map(item => `${item}`).join("")
}
var obj1 = new CreateList( ".box1", data1)
obj1.render()
function CreateImgList(select,data){
CreateList.call(this,select,data)
this.imgUrl = data.url
}
CreateImgList.prototype = new CreateList()
CreateImgList.prototype.enhenceRender = function(){
this.render()
var img = this.ele.querySelector("img")
img.src = this.imgUrl
}
var obj2 = new CreateImgList( ".box2" , data2)
obj2.enhenceRender()
<script>
//父类
class Person{
constructor(name,age){
this.name = name
this.age = age
}
say(){
console.log("hello")
}
}
//子类
//extends继承
class Student extends Person{
constructor(name,age,grade){
super(name,age)
//super相当于Person.call(this,name,age).而且super必须写到constructor里面的第一行
this.grad = grade
}
//直接可以改变Parson里面的方法使自己使用
say(){
super.say()//调用父元素的say()使其不会被覆盖
document.write("bjsad")//修改say()方法,将其覆盖,若加上super就不会被覆盖
}
}
var obj = new Student("asd",100,100)
console.log(obj.grad)
obj.say()
AJAX 的优势
AJAX 的使用
创建步骤:
ajax状态码 200 ok 404 error
xhr.readyState
readyState === 0
:表示未初始化完成,也就是open
方法还没有执行readyState ===1
:表示配置信息已经完成,也就是执行完open
之后readystate === 2
: 表示send
方法已经执行完成readystate ===
3 :表示正在解析响应内容readystate ===
4 :表示响应内容已经解析完毕,可以在客户端使用了readystate === 4
的时候,我们才可以正常使用服务端给我们的数据 所以,配合 http 状态码为 200 ~ 299 var xhr = new XMLHttpRequest()
// ip:js%E5%AE%9E%E6%88%98%E7%BB%83%E4%B9%A0
xhr.open("GET","http://127.0.0.1:5500/js%E5%AE%9E%E6%88%98%E7%BB%83%E4%B9%A0/01.text")
xhr.send()
//当后端与前端接上头后执行该函数
xhr.onreadystatechange = function(){
// console.log("edkw");
if(xhr.readyState===4 &&xhr.status === 200){
console.log("此时已经加载完毕");
}else if(xhr.readyState === 4 &&xhr.status===404){
console.log("没有找到这个对象");
}
}
//两种区别为:onload判断一次,而onreadstatechange判断四次
xhr.onload = function(){
console.log(xhr.responseText)
if(xhr.status==200){
document.write(xhr.responseText)
}else if(xhr.status===404){
console.error("没有找到这个页面")
location.href ="404.html
}
}
readyStateChange
const xhr = new XMLHttpRequest(
xhr.open( 'get', './data.php ')
xhr.send()
xhr.onreadystatechange = function(){
//每次readystate改变的时候都会触发该事件
//我们就在这里判断readystate的值是不是到4
//并且 http的状态码是不是200 ~ 299
if (xhr.readystate === 4&&/^2\d{2|S$/.test(xhr.status)) {
//这里表示验证通过
//我们就可以获取服务端给我们响应的内容了}
```
}
}
JavaScript部分
<ul id="malist"></ul>
<button id="btn">lisy</button>
<script>
btn.onclick = function(){
var xhr = new XMLHttpRequest()
// ip:js%E5%AE%9E%E6%88%98%E7%BB%83%E4%B9%A0
xhr.open("GET","http://127.0.0.1:5500/js%E5%AE%9E%E6%88%98%E7%BB%83%E4%B9%A0/data.json")
xhr.send()
//当后端与前端接上头后执行该函数
xhr.onreadystatechange = function(){
// console.log("edkw");
if(xhr.readyState===4 && xhr.status === 200){
console.log("此时已经加载完毕");
var jsondata = JSON.parse(xhr.responseText)
rader(jsondata)
}else if(xhr.readyState === 4 && xhr.status===404){
console.log("没有找到这个对象");
}
}
function rader(jsondata){
var html = jsondata.data.list.map(item=>`
${item.imageUrl} "/>
${item.name}
`)
malist.innerHTML = html.join('')
}
}
json部分
{
"data":{
"list":[
{
"namne":"1111",
"imageUrl":"https://ts1.cn.mm.bing.net/th?id=ORMS.7bf3e9347df69e68f66692e0f32f7bc9&pid=Wdp&w=612&h=304&qlt=90&c=1&rs=1&dpr=1.25&p=0"
},
{
"namne":"1111",
"imageUrl":"https://ts1.cn.mm.bing.net/th?id=ORMS.7bf3e9347df69e68f66692e0f32f7bc9&pid=Wdp&w=612&h=304&qlt=90&c=1&rs=1&dpr=1.25&p=0"
},
{
"namne":"1111",
"imageUrl":"https://ts1.cn.mm.bing.net/th?id=ORMS.7bf3e9347df69e68f66692e0f32f7bc9&pid=Wdp&w=612&h=304&qlt=90&c=1&rs=1&dpr=1.25&p=0"
}
]
}
}
通过里面的第三个参数判断
xhr.open("GET","地址",true)
true
表示异步请求:表示会进行后面的函数,等返回值调回来的时候跟着回去
false
表示同步请求:要等到返回的数据回来过后才会执行后面的代码,所以容易造成数据的堵塞
get 偏向获取数据
post 偏向提交数据
put 偏向更新(全部)
delete偏向删除信息
patch 偏向部分修改
const xhr = new XMLHttpRequest();
//设置响应体数据类型
xhr.responseType='json'
xhr.open('GET','http://127.0.0.1:8080/server-json /*?(传参位置,可以获取想得到的数据,如果不加就是全部取出 例:username=ximen)*/ ')
xhr.send()
xhr.onreadystatechange=function(){
if(xhr.readyState===4){
if(xhr.status >= 200 ){
console.log(xhr.response);
}
}
}
const xhr = new XMLHttpRequest();
//设置响应体数据类型
xhr.responseType='json'
xhr.open('POST','http://127.0.0.1:8080/server-json')
xhr.send()
xhr.onreadystatechange=function(){
if(/^2d{2|$/.test(xhr.status){
if(xhr.status >= 200 ){
console.log(JSON.parse(xhr.responseText));
}
}
//如果是POST形式的需要添加send在后面
//支持 name=Kerwin&&age=100的方式
//还支持{"name":"asd"}的方式
xhr.setRequestHeader( "content-Type","application/-www-form-urlencoded")//name=kerwin&age=100
xhr.send(`username=gangdaner&password=123`)
xhr.setRequestHeader( "content-Type","application/json")//json字符串方式
xhr.send ( JSON.stringify({
username: "ximen",
password: "789"}))
}
xhr.responseType='json'
xhr.open('PUT','http://127.0.0.1:8080/server-json/1')
xhr.send()
xhr.onreadystatechange=function(){
if(/^2d{2|$/.test(xhr.status){
if(xhr.status >= 200 ){
console.log(JSON.parse(xhr.responseText));
}
}
xhr.setRequestHeader( "content-Type","application/-www-form-urlencoded")//name=kerwin&age=100
xhr.send(`username=111111`)
xhr.setRequestHeader( "content-Type","application/json")//json字符串方式
xhr.send ( JSON.stringify({username: "111",)
}
const xhr = new XMLHttpRequest();
//设置响应体数据类型
xhr.responseType='json'
xhr.open('PATCH','http://127.0.0.1:8080/server-json/2')
xhr.send()
xhr.onreadystatechange=function(){
if(/^2d{2|$/.test(xhr.status){
if(xhr.status >= 200 ){
console.log(JSON.parse(xhr.responseText));
}
}
//支持 name=Kerwin&&age=100的方式
//还支持{"name":"asd"}的方式
xhr.setRequestHeader( "content-Type","application/-www-form-urlencoded")//name=kerwin&age=100
xhr.send(`username=adasdasd`)
xhr.setRequestHeader( "content-Type","application/json")//json字符串方式
xhr.send ( JSON.stringify({username: "asdasda"}))
}
const xhr = new XMLHttpRequest();
//设置响应体数据类型
xhr.responseType='json'
xhr.open('DELETE','http://127.0.0.1:8080/server-json/1')
xhr.send()
xhr.onreadystatechange=function(){
if(/^2d{2|$/.test(xhr.status){
if(xhr.status >= 200 ){
console.log(JSON.parse(xhr.responseText));
}
}
send()
}
function queryStringify(obj){
let str = ''
for (let k in obj)str += `${k}=${obj[k]}&`
return str.slice(0,-1)
}
function ajax (options){
let defaultoptions = {
ur1:"http://1ocalhoscct:3000/users",
method:"GET",
async:true ,
data:{
username : "kerwin",
password:"123"
},
headers:{},
success:function(res){
console.log(res)
}
error:function(err){
console.log(err)
}
})
<script>
封装 ajax
function ajax(options) {
let defaultoptions = {
url: "",
method: "GET",
async: true,
data: {},
headers: {
"content-type":"application/x-www-form-urlencoded"
},
success: function () { },
error: function () { }
}
let { url, method, async, data, headers, success, error } = {
...defaultoptions,
...options
}
</script>
用于发起获取资源的请求。它返回一个 promise,这个 promise 会在请求响应后被 resolve,并传回 Response对象。当遇到网络错误时,fetch() 返回的 promise 会被 reject,并传回 TypeError。成功的 fetch()检查不仅要包括 promise 被 resolve,还要包括 Response.ok 属性为 true。HTTP 404状态并不被认为是网络错误。
var username = "kerwin"
fetch(` http:// localhost:3000/users111?username=$ {username} `)
.then((res)=>{
console. log(res)
if(res.ok){
return res.json()
}else{
//拒绝
return Promise.reject(
}
cookie
<script>
//cookie 本地存储
// 存cookie
savebtn.onclick = function(){
//路径设置
// document.cookie = "username=xiaoming;path=/155-cookie/aaa"
document.cookie = "age=18"
//过期时间设置
var date = new Date()
date.setMinutes(date.getMinutes()+10)
document.cookie = `username=kerwin;expires=${date.toUTCString()}`
}
getbtn.onclick = function(){
console.log(getCookie("age"))
}
function getCookie(key){
var str = document.cookie
var arr = str.split("; ")
// console.log(arr)
var obj = {}
for(var i=0;i<arr.length;i++){
var subArr = arr[i].split("=")
// console.log(subArr)
obj[subArr[0]] = subArr[1]
}
// console.log(obj)
return obj[key]
}
delbtn.onclick = function(){
var date = new Date()
date.setMinutes(date.getMinutes()-1)
document.cookie = `username=111;expires=${date.toUTCString()}`
document.cookie = `age=111;expires=${date.toUTCString()}`
}
</script>
josnp
注:
mybtn.onclick = function(){
var oscript = document.createElement( "script")
oscript.src="01.txt”//未来地址
document.body . appendchild(oscript)
}
函数内部返回一个函数,被外界所引用。
这个内部函数就不会被销毁回收。
内部函数所用到的外部函数的变量也不会被销毁
求索引值下标
法一:(闭包)
var oli = document.querySelectorAl1("li")
for (var i = 0; i < oli.length; i++) {
oli[i].onclick = (function (index) {
return function () {
console.log(11111, index)
}
})(i) //匿名自执行函数
}
法二:(ES6)
var oli = document.querySelectorAl1("li")
for(let i=0;i<oli.length;i++){
oli[i].onclick =function(){
console.log(i)
}
}