Web、JS、JQ知识整理二

Web、JS、JQ知识整理二

8.21

BOM浏览器对象模型

Browser Object Model,浏览器对象模型,讲浏览器相关对象

  • window

是BOM的全局变量,window的属性也是全局属性,window的方法也是全局方法

window所有方法与属性均是全局,可直接调用

//document是windows对象上的一个属性
document.getElementById('box')
//等价 window.document.getElementById('box')
常见弹出窗口
alert() 警告框

是window对象上的一个方法,等价 window.alert(String类型的字符串)

<body>
		<script src="./js/jquery-1.12.4.min.js"></script>
		<script type="text/javascript">
			window.alert()
			alert("这是一个警告框,点击")
		</script>
</body>

alert() 警告框

confirm() 确认框

等价 window.confirm(String类型的字符串),返回一个boolean值,确定true、取消false

confirm() 确认框

prompt() 弹出输入框

弹出输入框prompt(提示信息,默认值),返回一个string类型的值

第一个参数,提示信息;第二个参数是默认值;返回类型是字符串,返回内容:输入内容

存在两个参数,可以都不写或者顺序写一个

open() 自定义弹出框

自定义弹出框open(url,…),返回一个window

第一个参数是弹出窗口的url、 第二个参数是弹出的目标,跟a标签的target一致

返回值是弹出页面的window对象,弹出窗口与本身的窗口具有父子关系

在弹出的页面中,使用window.opener访问父页面的内容

a标签的targe: _ self、_ blank、_ parent、_ top

window属性
innerHeight、innerWidth

浏览器的有效高宽(显示内容区的高宽)

console.log(document.write("height:" + window.innerHeight));
console.log(document.write("width:" + window.innerWidth));
location对象

url地址 href= protocol+//+hostname+:+port+pathname

//url地址. protocol//hostname:port/pathname
console.log("href: " + location.href)
// 主机名(域名)
console.log("hostname: " + location.hostname);
// 当前页面的路径和文件名
console.log("pathname: " + location.pathname);
// 端口名
console.log("port: " + location.port);
// 网络协议 http: https:
console.log("protocol: " + location.protocol);
location.href

location.href属性,用于获取和设置当前页的url

document.getElementById('gotoBaidu').addEventListener('click', ()=>{
    // 在前端的js代码中跳转页面
    location.href = 'http://www.baidu.com'
})
location.reload()

location.reload()函数,用于重新加载页面(F5)

history 浏览历史记录

history,专门用来存储历史记录信息的

必须存在后退或者前进的记录,不然会一直在这个页面上,不会前进或后退

forward()、back()

history.forward() ,前进一个页面

history.back() ,后退前一个页面

// 浏览历史记录
document.getElementById('b').addEventListener('click', ()=>{
    history.back() //在历史页面中后退一步
})
document.getElementById('f').addEventListener('click',()=>{
    history.forward() //在历史页面中前进一步
})
go(n)

n>0,前进几个页面

n<0,后退几个页面

// 浏览历史记录
document.getElementById('b').addEventListener('click', ()=>{
    history.go(-3) //在历史页面中后退三步
})
document.getElementById('f').addEventListener('click',()=>{
    history.forward(5) //在历史页面中前进五步
})
localStorage 浏览器本地存储器

localStorage.setItem(键,值), 存入信息

localStorage.getItem(键), 读取信息,无论何时均可取

localStorage.removeItem(键) ,删除指定信息

localStorage.clear(), 清除localStorage中所有信息

localStorage.setItem("name", "hqyj") //保存信息
console.log(localStorage.getItem("name")); //读取信息
localStorage.removeItem("name") //删除信息
localStorage.clear() //清除localStorage的所有信息
定时器

setInterval()、setTimeout()、clearInterval()

setInterval(方法,时间) 定时器函数,单位毫秒,每一段时间钟执行一次定时器中的方法

setInterval(),第一个参数是要执行的方法,第二个参数是定时时间,单位毫秒

setInterval(function(){},500) 等价 setInterval(()=>{},500),返回一个定时器对象 clearInterval(定时器对象) 参数是定时器的返回值

setInterval(“alert(‘welcome’)”,1000) ; ——每隔一秒钟弹出一个对话框

clearInterval(定时器对象),清理定时器对象,参数是定时器的返回值

setTimeout(方法,时间) ,单位毫秒,全局函数,达到指定延迟的时间后只执行一次回调函数

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>打地鼠</title>
        <style type="text/css">
            #main{
                width: 530px;
                height: 430px;
                margin: 100px auto;
                border: 1px solid black;

            }
            #main>div{
                width: 100px;
                height: 100px;
                background-color: #f5f5f5;
                float:left;
                margin-top: 5px;
                margin-left:5px;

            }
            .imgbox{
                background-image: url('./img/animal2.jpg');
                background-repeat: no-repeat;
                background-position: center;
                background-size: contain;
            }
            .btn{
                width: 140px;
                height: 60px;
                margin: auto;
            }
            .btn button{
                font-size: 30px;
                border: none;
                background-color: none;
            }
        </style>
    </head>
    <body>
        <div id="main">
        </div>
        <div class="btn">
            <button id='mybtn'>开始游戏</button>
        </div>
    </body>
    <script src="./js/jquery-1.12.4.min.js"></script>
    <script>
        let i=20
        let total=0;
        while(i-->0){$('#main').append("<div></div>")}

        $('.btn #mybtn').click(()=>{
            //让开始按钮失效 按钮添加属性disabled
            console.log('sadfs')
            $('#mybtn').attr('disabled','true')
            //$('#mybtn').off('click');
            // $(this).off('click')


            //间隔器
            let b=setInterval(()=>{
                //先清除所有带有div背景的样式
                $('#main>div').removeClass('imgbox')
                //随机一个添加带背景的样式
                let index=Math.floor(Math.random()*($('#main>div').length))
                $('#main>div:eq('+index+')').addClass('imgbox')
                // 随机生成多次添加,其可以张图片

                // let index1=Math.floor(Math.random()*($('#main>div').length))
                // $('#main>div:eq('+index1+')').addClass('imgbox')

            },1000)

            //指定时间清除定时器
            setTimeout(function(){
                $('#main>div').removeClass('imgbox')
                clearInterval(b)
                $('.btn button').removeAttr('disabled')
                alert('您已共打中'+total+'次')
            },10000)
        })

        //addClass()、removeClass()、hasClass()
        $('#main>div').click(function(){
            ///判断当前点击是否存在某种样式,有即加一份
            if($(this).hasClass("imgbox")){
                $(this).removeClass('imgbox')
                total++;
            }
        })

    </script>
</html>
setInterval()与setTimeout()区别

setTimeout(),是一个全局函数。在浏览器的window对象和Node.js中都可以直接使用,它的作用是在指定的延迟后执行一次回调函数

setInterval(),也是一个全局函数。同样在浏览器的window对象和Node.js中都可以直接使用,它的作用是每隔指定的时间间隔就执行一次回调函数,直到使用clearInterval函数取消

执行次数不同

setTimeout的本质是延迟执行,只执行一次,一般用于延迟指定的时间后执行一次回调函数;

setInterval的本质是定时执行,会不断重复执行,直到取消

执行频率不同

setTimeout是在指定的延迟后执行回调函数,只执行一次

setInterval则是每隔指定的时间间隔就执行一次回调函数,直到取消

实际应用不同

setTimeout一般用于需要延迟执行的场合,例如动画效果的延迟、按钮的防抖等setInterval一般用于需要定时执行的场合,例如轮播图的切换、时钟的更新等

数组[] 的方法

push(元素),往数组末尾存入一个元素

join(指定字符),数组元素用指定字符拼接为一个字符串,返回一个string类型字符串

<script type="text/javascript">
    //数组的方法,js数组无长度限制、数组长度不固定
    // push() 往数组中存入一个元素
    let arr=[]
    // arr[0]='JAVA'
    // arr[1]='HTML'
    arr.push('JAVA')
    arr.push('HTML')
    arr.push('JavaScrpit')
    for(let i=0;i<arr.length;i++){
        console.log(arr[i])
    }

    //join() 数组元素用指定字符拼接为一个字符串,返回一个string类型字符串
    console.log(arr.join(','))
</script>

arr.forEach((arg1,arg2,arg3)=>{})方法的参数是一个函数,这个函数有三个参数:

第一个参数arg1:当前循环的数组元素;

第二个元素arg2:当前循环的数组元素下标;

第三个元素arg3:整个数组对象

循环处理的代码,写在箭头函数中

<script type="text/javascript">
    let arr=[]
    arr.push('Java')
    arr.push('Html')
    arr.push('JavaScript')
    arr.push('jQuery')
    arr.push('Vue')
    //callbackfn回调函数、函数式接口
    //arr.forEach((arg1,arg2,arg3)=>{})
    //forEach方法的参数是一个函数,其中函数有三个参数
    //第一个参数arg1:当前循环的数组元素;第二个元素arg2:当前循环的数组元素下标;
    //第三个元素arg3:整个数组对象
    //循环处理的代码,写在箭头函数中
    arr.forEach((i)=>{
        console.log(i)
    })
</script>

字符串方法

符号功能符号功能
变量1==变量2判断值是否相等,忽略类型变量1===变量2全等,判断类型和值是否都相等
变量.lengthint类型无length属性、String类型变量的长度变量.charAt(i)返回指定位置的字符,下标从0开始,越界返回空
变量.indexOf(指定的字符串)返回指定的字符串在另一个字符串中第一次出现的位置
不存在该指定字符串,则返回-1
变量.lastIndexOf(指定的字符串)返回指定的字符串在另一个字符串中最后一次出现的位置
不存在该指定字符串,则返回-1
变量.replace(指定字符串,新字符串)替换第一个匹配的字符串,返回一个新的字符串变量.replaceAll(指定字符串,新字符串)替换所有匹配的字符串,返回一个新的字符串
变量.slice(下标1,下标2)截取一端字符串,范围:左闭右开变量.split(‘指定字符’)按指定字符将一个字符串拆分为数组
指定的字符串可以有多个字母、空字符、一个字符
变量.trim()去空格,去除左右空格变量.toLowerCase()转小写
变量.toUpperCase()转大写
大小写转换
parseInt(数字字符串)字符串转整数
只要是数字开头的字符串都可以转整数,后面的非数字的字符可忽略
isNaN()判断是否,不是一个数字;
true,不是数字;false,是数字
parseFloat(小数字符串)字符串转小数,与parseInt类似变量.toFixed(保留位数)小数取为位数,存在四舍五入
正则表达式^首、$尾、+ 一个或多个、*零个或多个
=
let s1='123'
let s2=123 //int类型无length属性
//==判断值是否相等
console.log(s1==s2)//true
//=== 全等,判断类型和值是否都相等
console.log(s1===s2)//false
length属性与变量.charAt(i)
let s1='123'
let s2=123 //int类型无length属性

//length属性
//int类型无length属性
console.log(s2.length)//undefined
//String类型的变量才有lenght属性
console.log(s1.length) //3

let s3='123abc456abc'
//变量.charAt(i),返回指定位置的字符,下标从0开始,越界返回空
console.log(s3.charAt(3))//a
变量.indexOf(指定的字符串)与变量.lastIndexOf(指定的字符串)
let s3='123abc456abc'
//变量.indexOf(指定的字符串),返回指定的字符串在另一个字符串中第一次出现的位置
//若不存在该指定字符串,则返回-1
console.log(s3.indexOf('abc'))//3
//变量.lastIndexOf(指定的字符串),返回指定的字符串在另一个字符串中最后一次出现的位置
//若不存在该指定字符串,则返回-1
console.log(s3.lastIndexOf('abc'))//9
变量.replace(指定字符串,新字符串)与变量.replaceAll(指定字符串,新字符串)
let s3='123abc456abc'
//变量.replace(指定字符串,新字符串),替换第一个匹配的字符串,返回一个新的字符串
console.log(s3.replace('abc','xxx'));//123xxx456abc
//变量.replaceAll(指定字符串,新字符串),替换所有匹配的字符串,返回一个新的字符串
console.log(s3.replaceAll('abc','xxx'));//123xxx456xxx
变量.slice(下标1,下标2)与变量.split(‘指定字符’)
let s3='123abc456abc'
//变量.slice(下标1,下标2),截取一端字符串,范围:左闭右开
console.log(s3.slice(3,6));//abc

let s4='Java,Html,JavaScript'

//变量.split('指定字符'),按指定字符将一个字符串拆分为数组
//指定的字符串可以有多个字母、空字符、一个字符
let arr=s4.split(',')
console.log(arr);//['Java', 'Html', 'JavaScript']
//把字符拆分为字母数组
console.log(arr[0].split(''));// ['J', 'a', 'v', 'a']

变量.trim()
// 变量.trim() 去空格,去除左右空格
let s5='   abc  dfs  '
console.log(s5.trim()) //abc  dfs
变量.toLowerCase()与变量.toUpperCase()
let s4='Java,Html,JavaScript'
//大小写转换 变量.toLowerCase()转小写、变量.toUpperCase()转大写
console.log(s4.toLowerCase())//java,html,javascript
console.log(s4.toUpperCase())//JAVA,HTML,JAVASCRIPT
parseInt(数字字符串)、parseFloat(小数字符串)、变量.toFixed(保留位数)
//parseInt(数字字符串)字符串转整数
//只要是数字开头的字符串都可以转整数,后面的非数字的字符可忽略
//若字符串不是字符串开头,返回NAN
//isNaN()判断是否,不是一个数字
console.log(parseInt('123'))//123
console.log(parseInt('abc123'))//NaN 不是一个数字 isNaN()判断是否是不是一个数字
console.log(parseInt('123abc'))//123 数字开头,后续字母忽略不计

//parseFloat(小数字符串),特效与parseInt类似

console.log(parseFloat('3.14'))//3.14
console.log(parseFloat('3.14afs'))//3.14
console.log(parseFloat('b3.14'))//NAN

//小数取为位数
//变量.toFixed(保留位数),存在四舍五入
let f=8.88*4.77//42.3576
console.log(f.toFixed(2))//42.36
正则表达
//正则表达式
//^首,$尾
let p=/^[0-9]+$/
//+ 一个多个数字,必须以数字开头与以数字结尾 
console.log(p.test('1235'))//true
console.log(p.test('123h'))//false

8.22

事件

组件显示与隐藏效果

对象.hide()、对象.show()、对象.toggle()对象隐藏、显示
对象.fadeOut(time)、对象.fadeIn(time)、对象.fadeToggle()对象淡出、淡入
对象.slideUp()、对象.slideDown()、对象.slideToggle()对象上滑、下滑
对象.animate(style中的样式)自定义动画
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <style type="text/css">
            .box1{
                width: 100px;
                height: 100px;
                background-color: red;
                position: relative;
            }
        </style>
    </head>
    <body>
        <input type="button" value="隐藏/显示" id='btn1'>
        <input type="button" value="淡出/淡入" id='btn2'>
        <input type="button" value="上滑/下滑" id='btn3'>
        <input type="button" value="自定义动画" id='btn4'>
        <div class="box1">

        </div>
        <script src="./js/jquery-1.12.4.min.js"></script>
        <!-- 提供动画效果,即随着时间推移图像变化 -->
        <script type="text/javascript">
            // 通过按钮绑定事件,隐藏与显示div
            let isShow=true;
            $('#btn1').click(()=>{
                //对象.hide() 隐藏标签即display:none
                //对象.show() 显示标签即display:block
                // if(isShow){
                // 	$('.box1').hide()
                // 	isShow=false
                // }
                // else{
                // 	$('.box1').show()
                // 	isShow=true
                // }
                //对象.toggle(),对象在显示与隐藏中来回切换
                $('.box1').toggle()
            })
            //对象淡入、淡出
            $('#btn2').click(()=>{
                //对象.fadeOut(time) 隐藏标签,慢慢淡出;可自定义时间,单位毫秒
                //对象.fadeIn(time) 显示标签,慢慢淡入;可自定义时间,单位毫秒
                // $('.box1').fadeOut(5000)
                // $('.box1').fadeIn() 
                //对象.fadeToggle(),对象在显示与隐藏中来回切换,淡入、淡出
                $('.box1').fadeToggle()
            })

            //下滑、上滑
            $('#btn3').click(()=>{
                //$('.box1').slideUp()//上滑收起
                //$('.box1').slideDown()//下滑展开
                $('.box1').slideToggle()//两种状态切换
            })

            //自定义动画
            $('#btn4').click(()=>{
                //对象.animate({设置块})
                $('.box1').animate({
                    width:'200px',
                    height:'200px',
                    left:'200px',
                    top:'0px',
                })
            })

        </script>
    </body>
</html>

JQuery

选择器
过滤选择器
  • $(“div.test”) 获取所有具有class属性且值为test的div

  • :eq() 指定索引的节点

  • :lt() 小于指定索引的节点

  • :gt() 大于指定索引的节点

  • :selected 获取被选中的节点 (下拉菜单)

  • :checked 获取被选中的节点(单选、复选)

  • input[name=xxx] 获取带有name属性且值为xxx的input标签

节点操作

JS的方式获取的节点称为DOM对象,Jquery的方式获取的节点称为Jquery对象

DOM对象操作的方式和Jquery对象操作的方式不同

改变节点的样式、内容、属性
功能功能
对象.text()、对象.html()获取和修改文本、HTML对象.val()获取和修改value值
对象.css()获取和设置样式对象.attr()、对象.prop()获取和设置属性
对象.addClass(string类型)
对象.removeClass(string类型)
添加与删除className
获取和修改文本
  • 对象.text(),读取或修改文本(innerText)

读取文本:对象.text()

修改文本[覆盖]:对象.text(string类型的文本内容); [将之前的覆盖]

修改文本[追加]:对象.text(对象.text()+string类型的文本内容);

[先将之前的文本内容读取,再与新添加进行拼接,而后修改]

  • 对象.html(),读取或修改HTML(innerHTML)

    读取HTML标签:对象.html()

    修改HTML标签[覆盖]:对象.html(string类型的标签文本内容); [将之前的覆盖]

    修改HTML标签[追加]:对象.html(对象.html()+string类型的标签文本内容);

    [先将之前的HTML标签内容读取,再与新添加的进行拼接,而后修改]

$('.box1').text($('.box1').text()+txt)//追加,先读再存
$('.box1').html('<a href="http://www.baidu.com" target="_blank">百度</a>')
获取和修改value值
  • 对象.val(),读取或修改表单标签的value

    读取表单标签:对象.val()

    修改表单标签:对象.val(string类型的修改值)

$('#txt1').val()
获取和设置样式
  • 对象.css(),读取或修改标签样式(style.xxx)

    读取标签的样式:对象.css(‘样式名’)

    修改标签的样式:对象.css(‘样式名’,‘修改值’)

    样式名与css相同

$('.box1').css('border-color','blue')
获取和设置属性
  • 对象.attr(),读取或修改标签的属性

    读取标签的属性:对象.attr(‘属性名’)

    修改标签的属性:对象.attr(‘属性名’,‘修改值’)

  • 对象.prop(),修改标签的属性

  • 对象.removeAttr() 删除属性

$('#img1').attr('src','./img/girl.jpg')
添加与删除className
  • 对象.addClass(string类型),给标签添加class(className)
  • 对象.removeClass(string类型),删除标签的class
  • 对象.toggleClass(string类型),对c某个class的添加、删除之间切换
$('.box1').addClass('active')//给标签新增一个class
$('.box1').removeClass('active')
$('.box1').toggleClass('active')
DOM对象与Jquery对象之间互转

DOM对象转换为Jquery对象:$(DOM对象)

Jquery对象转换为DOM对象:Jquery对象[0]/Jquery对象.get(0)

var div = document.getElementById("myDiv");
var $div = $("#myDiv");

//DOM => Jquery
div.innerText="xxx";//正确
$(div);//这样就会将DOM对象转换为jquery对象
$(div).innerText="xxx";//错误

//Jquery => DOM
$div.innerText="xxx";//错误
$div.get(0);//这样就会将jquery对象转换为DOM对象
$div.get(0).innerText="xxx";//正确

$(document).ready(()=>{ 代码块 })事件、页面加载完成、页面初始化事件

添加节点[增加标签]
  • 添加哥哥节点
    • 原节点.before(新节点)
    • 新节点.insertBefore(原节点)
  • 添加弟弟节点
    • 原节点.after(新节点)
    • 新节点.insertAfter(原节点)
  • 添加第一个子节点
    • 父节点.prepend(子节点)
    • 子节点.prependTo(父节点)
  • 添加最后一个子节点
    • 父节点.append(子节点)
    • 子节点.appendTo(父节点)
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>增加和删除标签</title>
        <style type="text/css">
            .box1{
                width: 200px;
                hight:200px;
                border: 1px solid red;
            }
        </style>
    </head>
    <body>
        <input type="button" value="append/prepend" id='btn1'>

        <input type="button" value="after/before" id='btn2'>

        <input type="button" value="remove" id='btn3'>

        <input type="button" value="empty" id='btn4'>

        <div class="box1">
            <p>第一个</p>
            <p>第二个</p>
            <p>第三个</p>
        </div>
        <script src="./js/jquery-1.12.4.min.js"></script>
        <script type="text/javascript">
            $('#btn1').click(()=>{
                //在子标签的末尾插入一个标签:对象.append(标签字符串、标签对象)
                //在子标签的前面插入一个标签:对象.prepend(标签字符串、标签对象)
                //时子标签的子标签
                $('.box1').append('<p>append</p>')
                $('.box1').prepend('<p>prepend</p>')
            })

            $('#btn2').click(()=>{
                //选择器:eq(n),选择选择器下标为n的标签
                //在子标签后面插入一个标签:对象.after(标签字符串、标签对象)
                //在子标签前面插入一个标签:对象.before(标签字符串、标签对象)
                //是子标签的兄弟标签
                // $('.box1 p:first')
                //$('.box1 p:last')
                //选择p下标为1的标签
                $('.box1 p:eq(1)').after('<span>after</span>')
                $('.box1 p:eq(1)').before('<span>before</span>')
            })

            $('#btn3').click(()=>{
                //选择器:eq(n),选择选择器下标为n的标签
                //删除子标签(包括其子标签):对象.remove()
                // $('.box1 p:eq(2)') 选择p下标为2的标签
                //$('.box1 p:last')
                $('.box1 p:last').remove()
            })

            $('#btn4').click(()=>{
                //清空子标签中所有的子标签:对象.empty()
                $('.box1').empty()
            })
        </script>
    </body>
</html>
删除节点[删除标签 ]
  • remove(),删除当前标签(包括子标签)
  • empty(),删除当前标签下的所有子标签,保留自身
遍历节点
  • 获取同级节点
    • 节点.sublings()
  • 获取之前的所有节点
    • 节点.prevAll()
  • 获取之后的所有节点
    • 节点.nextAll()
  • 获取父节点
    • 节点.parent()
  • 获取子节点
    • 节点.children(),所有子标签[只包含儿子],参数还可以设置选择器
绑定事件

节点.事件函数(function(){});

  • $(“div#md”).click(function(){});
  • $(“div#md”).bind(“click”,function(){});

常用事件

  • click单击

  • mouseenter鼠标进入

  • mouseout鼠标离开

  • hover鼠标进入和离开

    节点.hover(function(){鼠标进入时触发},function(){鼠标离开时触发});
    
  • focus聚焦

  • blur光标离开

  • change改变

表单绘制

表单绘制

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			#top,#bottom,#tbl1,#btn1,#tbl2{
				margin: auto;
			}
			#top{
				width: 300px;
				height: 300px;
			}
			#bottom{
				width: 600px;
				height: 300px;
			}
			#tbl1,#tbl2{
				border-collapse: collapse;
			}
			#tbl1{
				margin-top:20px ;
			}
			#btn1{
				display: block;
				width: 130px;
				height: 30px;
			}
			.put{
				width: 200px;
				height: 25px;
			}
			
			#tbl1 td{
				width: 300px;
				height: 30px;
			}
			#bottom{
				/* overflow: scroll; */
				overflow-y: auto;
			}
			
			#tbl2 td,#tbl2 th{
				border: 1px solid black;
				width: 120px;
				height: 50px;
				text-align: center;
				line-height:50px ;
			}
		</style>
	</head>
	<body>
		<div id="top">
			<table id='tbl1' cellpadding="15">
				<tr><td>姓名:<input type="text" name='name' class="put"></td></tr>
				<tr><td>
				籍贯: <select name="britharea" class="put">
					<option value="">请选择</option>
					<option value="重庆">重庆</option>
					<option value="贵州">贵州</option>
					<option value="云南">云南</option>
					<option value="江西">江西</option>
				</select>
				</td></tr>
				<tr><td>
				
				性别:<input type="radio" name="sex" value=''><input type="radio" name="sex" value='' checked ></td></tr>
				<tr><td>
				爱好: <input type="checkbox" name="hobby" value="唱歌">唱歌
					   <input type="checkbox" name="hobby" value="跳舞">跳舞
					   <input type="checkbox" name="hobby" value="打球" checked>打球
				</td></tr>
			</table>
			<input type="button" value="新增" id="btn1">
		</div>
		<div id="bottom">
			<table id="tbl2">
				<tr>
					<th>姓名</th>
					<th>籍贯</th>
					<th>性别</th>
					<th>爱好</th>
					<th>选择</th>
				</tr>
			</table>
		</div>
		<script src="./js/jquery-1.12.4.min.js"></script>
		<script type="text/javascript">
			let exchang=false
			let dataTr
			//新增按钮,追加内容至表单
			$('#btn1').click(()=>{
				//获取数据
				let name=$('input[name="name"]').val()
				let britharea=$('select[name="britharea"]').val()
				let sex=$('input[name="sex"]:checked').val()
				let hobbys=$('input[name="hobby"]:checked').map((index,current)=>{
					return $(current).val()
				}).get().join(',')
				//将数据追加至表单
				if(exchang){
					let childs=dataTr.children()
					childs.eq(0).text(name)
					childs.eq(1).text(britharea)
					childs.eq(2).text(sex)
					childs.eq(3).text(hobbys)
					exchang=false
					}
				else{
					// $('#tbl2').append('<tr>'+
					// '<td>'+name+'</td>'+
					// '<td>'+britharea+'</td>'+
					// '<td>'+sex+'</td>'+
					// '<td>'+hobbys+'</td>'+
					// '<td>'+'<input type="button" value="修改">'+
					// '<input type="button" value="删除">'+
					// '</td>'+
					// '</tr>'
					// )
					$('#tbl2').append(`<tr>
					<td>${name}</td>
					<td>${britharea}</td>
					<td>${sex}</td>
					<td>${hobbys}</td>
					<td><input type="button" value="修改">
					<input type="button" value="删除"></td></tr>`)
				}
				//添加完,清除表单数据,恢复至初始状态
				$('input[name="name"]').val("")
				$('select[name="britharea"]').val("")
				$('input[value="女"]').prop('checked','checked')
				$('input[name="hobby"]').each((index,current)=>{
					$(current).removeProp('checked','checked')
				})
				$('input[value="打球"]').prop('checked','checked')
				
			})
			
			$(tbl2).click((e)=>{
				let b=$(e.target).parent().parent()
				//修改按钮,值返回表单
				if(e.target.value=='修改'){
					let childs=b.children()
					let name=childs.eq(0).text()
					let britharea=childs.eq(1).text()
					let sex=childs.eq(2).text()
					let hobbys=childs.eq(3).text().split(',')
					
					
					$('#tbl1 input[name="name"]').val(name)
					$('#tbl1 select[name="britharea"]').val(britharea)
					
					$('#tbl1 input[value='+sex+']').prop('checked',true)
					
					$('#tbl1 input[name="hobby"]').each((index,current)=>{
						let c=$(current)
						// c.removeProp('checked',true)
						c.prop('checked',false)
						for(let i=0;i<hobbys.length;i++){
							if(hobbys[i]==c.val()){
								c.prop('checked',true)
								break
							}
						}
						
					})
					exchang=true
					dataTr=b
				}
				//删除按钮,删除当前行
				else if(e.target.value=='删除'){
					if(confirm('确认删除当前行')){
						b.remove()
					}
				}
			})
		</script>
	</body>
</html>

8.23

JSON

  • json,一种数据格式,广泛用于前后端数据交互
    • json文件扩展名:.json
    • 只能由以下符号组成:{} [] “” : ,
  • 引号只能用双引号
    • 字符串用引号,数字和boolean不加引号;属性也要用引号
  • json文件中无注释
Json格式的字符串与Js对象之间的转换

JSON.stringify(js对象),js对象转化为JSON格式的字符串

JSON.parse(JSON对象),JSON格式的字符串转换为JS对象

AJAX异步请求

AJAX,异步JavaScript和XML;是一个抽象概念

用于向后台发送异步请求,后台返回数据,主要返回JSON数据[可以返回xml、text、html]

异步请求可实现局部刷新

同步执行:synchronized,按照一定顺序、排队执行;两个线程的执行存在一定先后顺序,具有线程安全

异步执行:同时执行,各做各的,具有线程不安全;两个线程可能会同时执行

JQuery的AJAX请求

发送请求:get、post、ajax()

$.ajax({
    url:'',//请求的地址
    data:{
        a:'xx',
        b:'yy'
    },//请求时携带的参数
    type:'post/get/delete/put',//请求方式
    dataType:'json',//参数类型
    success:function(res){
        //success为请求成功后的回调函数
        //res为请求后的结果
    },
    error:function(res){
        //error为请求失败后的回调函数
        //res为请求后的结果
    }
})

遍历foreach、each、map

用法
foreach用于原生对象数组
eachJQ对象数组
map可以用于原生对象数组、也可以用于JQ对象数组,均存在返回值
foreach遍历
  • 用于原生对象数组
  • 第一个参数当前遍历到的元素
  • 第二个参数当前遍历到的元素下标
  • 第三个参数完整的数组
  • 无返回值
each遍历
  • 用于JQ对象数组
  • 第一个参数是当前遍历到的元素下标
  • 第二个参数当前遍历到的元素
  • 第三个参数完整的数组
  • 无返回值
map遍历
  • 可以用于原生对象数组、也可以用于JQ对象数组,均存在返回值
  • map在原生对象数组时
    • 第一个参数当前遍历到的元素
    • 第二个参数当前遍历到的元素下标
    • 第三个参数完整的数组
    • 返回一个原生数组
  • map在JQ对象数组时
    • 第一个参数是当前遍历到的元素下标
    • 第二个参数当前遍历到的元素
    • 第三个参数完整的数组
    • 返回一个JQ数组,通过get()方法得到原生数组

8.24-8.25

Layui

Layui,面向全层次的前后端开发者,易上手开源免费的Web UI组件库;

安装与运行
layui文件放置位置

下载并解压框架包layui,放置项目根目录下

layui文件放置位置

在页面html中引入css和Js文件

引入css文件:在head部分中,link标签,href属性里写layui.css文件的路径

引入js文件:在body部分里,script标签,scr属性里写layui.js文件的路径

在页面html中引入css和Js文件

在layui.use()方法的回调函数里写代码

在script标签下,写入layui.use([所需用的组件],function(){回调函数、写代码})

在layui.use()方法的回调函数里写代码

组件的使用
简单主件,不含js

直接复制到body中

<button type="button" class="layui-btn layui-btn-danger">警告按钮</button>
复杂组件,含js

body块中,容器标签

script块中,layui.use([组块模块],回调函数),导入组块模块

script块中,组块.render({属性设置,其中elem属性值,指是哪个选择器});写render,书写参数

绘制数据表格

主要两个步骤,第一,编写一定格式的json数据文件;第二,使用layui组件绘制数据表格并将json数据导入;

json数据格式的文件

json数据格式的文件,是一个对象,即用大括号括起来{}

必须存在的属性有,“code”、“msg”、“count”、“data”

“code”:属性值有0、1选项;为0,才能正常将json中数据获取

“msg”:属性值为string类型字符串,一般做提示语句,可为""

“count”:是数据的总行数,用于自动分页,一般默认10行为一页

“data”:是导入表格的数据,一般用[{},{}…]

json文件只允许,“” , : {} [] 这五种符号存在,且属性必须也要用"“括起,其中只有数字不许要用”"括起,其它均需要

{
    "code":0,
    "msg":"",
    "count":20,
    "data":[
        {
            "bookId":"1001",
            "bookName":"理想国",
            "bookAuthor":"Rose",
            "bookPrice":1123.45,
            "bookDate":"2010-02-02",
            "bookNum":520,
            "typeId":1
        },
        {
            "bookId":"1002",
            "bookName":"格林童话",
            "bookAuthor":"TH",
            "bookPrice":2076,
            "bookDate":"1990-03-01",
            "bookNum":1000,
            "typeId":2
        },
        {
            "bookId":"1003",
            "bookName":"活着",
            "bookAuthor":"YH",
            "bookPrice":3000,
            "bookDate":"2014-07-01",
            "bookNum":2000,
            "typeId":3
        }
    ]
}
使用layui组件绘制数据表格

以复杂组件(含js)的步骤进行

body块中,容器标签

这是一个table表格标签

<table class="layui-hide" id="test" lay-filter="test"></table>
script块中,layui.use([组块模块],回调函数),导入组块模块

在本网页中会用到table组块,因此需要先导入

<script>
    // 一个组件可直接写;多个组件需要使用[]
    layui.use('table', function() {
        var table = layui.table
        })
</script>
script块中,组块.render({属性设置,其中elem属性值,指是哪个选择器});

elem属性:指向的是对应哪个标签的id选择器

其中table标签的id为test,因此id选择器为#test

url属性:指是需要导入的json数据文件位置

page属性:值为boolean类型;值为true,则开启分页设置,默认为false,关闭分页设置

cols属性:二维表[[{},{},{}…]],即每个{}代表着一列,在{}中存在以下一些参数

  • field:设定字段名,表格数据列的唯一标识;是将JSON文件的每个属性对应至表格中哪列

    当json某个属性的名字为A,则识别A属性的列的field属性为’A’

  • title:设定标题名称,在数据表格中该属性所展示的名字,自命名

  • width:设置单元格的宽

  • sort:boolean类型值,true为可对该列进行排序,默认false

    其中排序只对当前已展示的数据进行排序,无法做到全部数据进行排序

    其他属性值,可在官网进行了解,其他

<script>
    // 一个组件可直接写;多个组件需要使用[]
    layui.use(['table'], function() {
        var table = layui.table
        table.render({
            elem: '#test',
            // 第一个url告知在哪取数据
            url: 'book.json',
            //json文件格式
            /* 
				"code":0, //是否返回异常,0正常、1异常
				"msg":"", //提示信息
				"count":1000, //数据总条数,自动分页
				"data":放数据
				 */

            //page,开启分页设置;默认false,不分页;true,分页
            page: true,
            //全局定义常规单元格的最小宽度,layui 2.2.1 新增
            cellMinWidth: 80,
            //以上均是基础参数


            //cols列 [[]]二维表,必须是此格式
            //以下是cols表头参数
            /* 
				field:设定字段名,表格数据列的唯一标识;是将JSON文件的每个属性对应至表格中哪列
				title:设定标题名称
				 */
            cols: [
                [
                    //对于比较长的列不设宽度
                    {
                        field: 'bookId',
                        width: 100,
                        title: '书号',
                        sort: true
                    },
                    {
                        field: 'bookName',
                        width: 100,
                        title: '书名'
                    },
                    {
                        field: 'bookAuthor',
                        width: 100,
                        title: '作者',
                        sort: true
                    },
                    {
                        field: 'bookPrice',
                        width: 100,
                        title: '价格'
                    },
                    {
                        field: 'bookDate',
                        title: '出版日期'
                    },
                    {
                        field: 'bookNum',
                        title: '数量',
                        width: 100,
                        sort: true
                    },
                    {
                        field: 'typeId',
                        title: '类型',
                        width: 100,
                        sort: true
                    },
                ]
            ],
            /* 异步数据参数:
				method:接口http请求类型,默认:get
				url:接口地址,默认会自动传递两个参数:?page=1&limit=30(该参数可通过 request 自定义)
				page 代表当前页码、limit 代表每页数据量
				parseData:function(){return{自行设置对应关系}}
				request: {
					//该页码参数名与每页数据量参数名更改
				    pageName: 'curr' //页码的参数名称,默认:page
				    ,limitName: 'nums' //每页数据量的参数名,默认:limit
				}

				 */

        });


    })
</script>
完整代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
        <title></title>
        <link rel="stylesheet" href="./layui/css/layui.css">
    </head>
    <body>

        <table class="layui-hide" id="test" lay-filter="test"></table>

        <script src="./layui/layui.js"></script>
        <script>
            // 一个组件可直接写;多个组件需要使用[]
            layui.use(['table'], function() {
                var table = layui.table
                var $ = layui.jquery
                table.render({
                    elem: '#test',
                    // 第一个url告知在哪取数据
                    url: 'book.json',
                    //json文件格式
                    /* 
				"code":0, //是否返回异常,0正常、1异常
				"msg":"", //提示信息
				"count":1000, //数据总条数,自动分页
				"data":放数据
				 */

                    //page,开启分页设置;默认false,不分页;true,分页
                    page: true,
                    //全局定义常规单元格的最小宽度,layui 2.2.1 新增
                    cellMinWidth: 80,
                    //以上均是基础参数


                    //cols列 [[]]二维表,必须是此格式
                    //以下是cols表头参数
                    /* 
				field:设定字段名,表格数据列的唯一标识;是将JSON文件的每个属性对应至表格中哪列
				title:设定标题名称
				 */
                    cols: [
                        [
                            //对于比较长的列不设宽度
                            {
                                field: 'bookId',
                                width: 100,
                                title: '书号',
                                sort: true
                            },
                            {
                                field: 'bookName',
                                width: 100,
                                title: '书名'
                            },
                            {
                                field: 'bookAuthor',
                                width: 100,
                                title: '作者',
                                sort: true
                            },
                            {
                                field: 'bookPrice',
                                width: 100,
                                title: '价格'
                            },
                            {
                                field: 'bookDate',
                                title: '出版日期'
                            },
                            {
                                field: 'bookNum',
                                title: '数量',
                                width: 100,
                                sort: true
                            },
                            {
                                field: 'typeId',
                                title: '类型',
                                width: 100,
                                sort: true
                            },
                        ]
                    ],

                });


            })
        </script>
    </body>
</html>

效果图

首页布局

网页主要布局框架,参考官方网页布局框架

点击菜单显示内容
  • 内容区域用iframe. 每个功能页面可以是完整页面
  • 内容区域用div,每个功能页面是页面的片段, 用ajax获取页面内容,填充到div

本次均采用方法一

显示内容区域,使用iframe标签,并为属性name命名

对于点击菜单的部分,采用a标签连接,并href属性,指向连接的下一个网页,属性target设置为iframe的name名

<div class="layui-layout layui-layout-admin">
    <div class="layui-header">
        <div class="layui-logo layui-hide-xs layui-bg-black">头部标题</div>
    </div>

    <div class="layui-side layui-bg-black">
        <div class="layui-side-scroll">
            <ul class="layui-nav layui-nav-tree" lay-filter="test">
                <li class="layui-nav-item layui-nav-itemed">
                    <a class="" href="javascript:;">图书管理</a>
                    <dl class="layui-nav-child">
                        <dd><a href="javascript:;">图书录入</a></dd>
                        <dd><a href="10-book.html" target="main">图书查询</a></dd>
                    </dl>
                </li>
                <li class="layui-nav-item">
                    <a href="javascript:;">会员管理</a>
                </li>
                <li class="layui-nav-item"><a href="javascript:;">借阅管理</a></li>
                <li class="layui-nav-item"><a href="">系统管理</a></li>
            </ul>
        </div>
    </div>

    <div class="layui-body">
        <!-- 内容主体区域 -->
        <div style="padding: 15px;">
            <iframe src="" name='main' frameborder="1" width="100%" height="760px"></iframe>
        </div>
    </div>
</div>

网页图

增删改查页面
每行的工具按钮toolbar属性

在表头参数,增加一列, 设置toolbar属性,属性值为id选择器

{fixed: 'right', title:'操作', toolbar: '#barDemo', width:150}
<!-- 每行工具按钮 -->
<!-- 1、在cols表头参数属性中:增加一列,设置toolbar属性 :值为对应的选择器对象
2.添加一段按钮标签
-->
<script type="text/html" id="barDemo">
		  <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
		  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
</script>

每行,复选框

{type: 'checkbox', fixed: 'left'},//添加复选框,便于多选几行
表格头部工具栏toolbar属性

基础参数添加toolbar属性,属性值为id选择器;defaultToolbar控制是否显示默认工具栏

toolbar: '#toolbarDemo', //开启头部工具栏,并为其绑定左侧模板
defaultToolbar:[] ,//头部工具栏默认工具按钮,控制是否显示默认工具栏;按需要显示['filter','print','exports']
<!-- 开启头部工具栏
1、在基本参数属性中加入toolbar属性:值为对应的选择器对象
2、添加一段按钮标签
-->
<script type="text/html" id="toolbarDemo">
		  <div class="layui-btn-container">
		    <button class="layui-btn layui-btn-sm" lay-event="add">新增</button>
		    <button class="layui-btn layui-btn-sm" lay-event="edit">修改</button>
		    <button class="layui-btn layui-btn-sm" lay-event="del">删除</button>
    </div>
</script>
行工具按钮的事件

tool行工具按钮事件,test是table标签的lay-filter属性的值

其中回调函数中的返回的形参(obj):

event属性:按钮的lay-event属性的值,用来判断点的是哪个按钮

data属性:是这行数据对象

//监听行工具事件, tool行工具按钮事件,test是table标签的lay-filter属性的值
table.on('tool(test)', function(obj){
    //obj对象的data属性是这行数据对象;
    // event属性是按钮的lay-event属性的值,用来判断点的是哪个按钮
    var data = obj.data;
    //console.log(obj)
    if(obj.event === 'del'){
    } else if(obj.event === 'edit'){
    }
});
表头工具栏事件

toolbar头部工具栏事件,test是table标签的lay-filter属性的值

其中回调函数中的返回的形参(obj):

event属性:按钮的lay-event属性的值,用来判断点的是哪个按钮

table.checkStatus(obj.config.id)为checkStatus属性checkStatus.data就是选中行的数据,它是数组类型

//头工具栏事件, toolbar头部工具栏事件,test是table标签的lay-filter属性的值
table.on('toolbar(test)', function(obj){
    //读取选中行的数据, checkStatus.data就是选中行的数据,它是数组类型
    var checkStatus = table.checkStatus(obj.config.id);
    switch(obj.event){
        case 'add': //新增
            break;
        case 'edit': //修改
            break;
        case 'del': //删除
            break;
    };
});
在修改事件中打开修改窗口

多窗口模式,层叠置顶,layer.open({}),具体参考lay.open用法

layer提供了5种层类型,可传入的值有:

0(信息框,默认)、1(页面层)、2(iframe层)、3(加载层)、4(tips层)

content:可传入的值是灵活多变的

不仅可以传入普通的html内容,还可以指定DOM,更可以随着type的不同而不同

//多窗口模式,层叠置顶
layer.open({
    type: 2 //iframe
    ,title: '修改图书信息'
    ,area: ['390px', '260px'] //宽, 高
    ,shade: 0.5 //透明度,0~1
    ,maxmin: true //是否显示最大最小按钮
    ,offset: [ //居中显示
        ($(window).height()-260)/2
        ,($(window).width()-390)/2
    ]
    ,content: 'bookupdate.html'
});
form表单

具体表单内容,官网参考表单

对于主键不愿被修改,则采用< input type=“hidden” name=“boolId” >,即可获取主键,但在修改时不被展示出来。

其中每种表单标签重要的属性:

name:该表单名,尽量与json文件中属性名一致对应上,便于后期增删改

autocomplete:默认存在历史记录、可设置为"off",表示不保存历史记录

placeholder:输入字符串,表示提示语句

<!--主键隐藏-->
<form class="layui-form" lay-filter="formUpdateBook" action="">
    <!--input type="hidden":主键隐藏 -->
    <input type="hidden" name="boolId">

    <div class="layui-form-item">
        <label class="layui-form-label">书名</label>
        <div class="layui-input-block">
            <input type="text" name="bookName" autocomplete="off" placeholder="请输入书名" class="layui-input">
        </div>

    </div>
    <div class="layui-form-item">
        <label class="layui-form-label">作者</label>
        <div class="layui-input-block">
            <!-- lay-verify="required" lay-reqtext="用户名是必填项,岂能为空?" -->
            <input type="text" name="bookAuthor" placeholder="请输入作者名" autocomplete="off" class="layui-input">
        </div>
    </div>

    <div class="layui-form-item">
        <div class="layui-inline">
            <label class="layui-form-label">价格</label>
            <div class="layui-input-inline">
                <input type="text" name="bookPrice" placeholder="请输入价格" autocomplete="off" class="layui-input">
            </div>
        </div>

        <div class="layui-inline">
            <label class="layui-form-label">日期</label>
            <div class="layui-input-inline">
                <input type="text" name="bookDate" id="bookDate" placeholder="yyyy-MM-dd" autocomplete="off"
                       class="layui-input">
            </div>

            <div class="layui-inline">
                <label class="layui-form-label">数量</label>
                <div class="layui-input-inline">
                    <input type="text" name="bookNum" placeholder="请输入数量" autocomplete="off"
                           class="layui-input">
                </div>
            </div>
        </div>

        <div class="layui-form-item">
            <label class="layui-form-label">类型</label>
            <div class="layui-input-block">
                <select name="typeId" lay-filter="aihao">
                    <option value=""></option>
                    <option value="0">文学</option>
                    <option value="1">历史</option>
                    <option value="2">计算机</option>
                    <option value="3">小说</option>
                    <option value="4">教辅</option>
                </select>
            </div>
        </div>

        <div class="layui-form-item">
            <div class="layui-input-block">
                <button type="submit" class="layui-btn" lay-submit="" lay-filter="switchTest">提交信息</button>
                <button type="reset" class="layui-btn layui-btn-primary">重置</button>
            </div>
        </div>
        </form>

表单

数据回写到表单中form.val()

form.val(‘formUpdateBook’,{表单name:值}一个对象)

表单form的一个属性与值:lay-filter=“formUpdateBook”;

修改方式一:(手动修改值)

form.val('formUpdateBook', {
    "bookName": "Java从入门到精通" 
    ,"bookPrice": 123.45
    ,.....
});
parent.xx访问父页面的全局变量,调用form.val()方法回写表单

parent.xx访问父页面的全局变量,获取父页面的全局数据,调用form.val()方法回写表单

父页面定义一个行数据的全局变量
var data = {}
行工具按钮事件中,把当前行的数据给全局变量赋值

行工具按钮事件,当前行的数据给全局变量赋值

表头工具栏事件中,把选中行的数据给全局变量赋值

表头工具栏事件中,把选中行的数据给全局变量赋值

在弹出修改窗口里面用parent.data获取父页面的数据,然后调用form.val()回写数据到表单

其中,formUpdateBook是form标签的lay-filter属性的值

//parent.xx访问父页面的全局变量,获取父页面的全局数据,调用form.val()方法回写表单
//父页面有一个全局变量data,对象parent.data是个对象 
form.val('formUpdateBook', parent.data);
form提交和关闭窗口

switchTest是提交按钮的lay-filter属性值

layer.alert(content, options, yes匿名函数) 是 Layer 弹层插件的方法,用于显示一个警告框

//表单提交事件,switchTest是提交按钮的lay-filter属性值
form.on('submit(switchTest)', function(data) {
    //layer.alert(content,[, options][, yes])
    layer.alert(JSON.stringify(data.field), {title: '最终的提交信息'},
                function(){
        //修改功能的ajax请求省略
        //自动关闭弹窗界面ifarem窗口
        var index =parent.layer.getFrameIndex(window.name)
        parent.layer.close(index)//执行关闭
    }
               )
    return false; //阻止form标签的提交刷新
});
删除

在行工具栏按钮和表头工具栏按钮事件中写如下代码

layer.confirm('确认要删除当前行吗?', function(index){
    //ajax提交后台去删除,在回调函数刷新表格
    //刷新表格,test就是表格标签的id(或者是基础参数的id)
    table.reload('test', {
        page: {
            curr: 1 //重新从第 1 页开始
        }
    });
    layer.close(index);
});

汇总案例

按如下表创建json文件,完成分页表格显示功能,完成修改功能(到表单数据回写),完成删除功能(确认提示框,表格刷新)

任务要求

json数据文件
{
    "code":0,
    "msg":"",
    "count":14,
    "data":[
        {
            "id":1,
            "typeName":"书籍",
            "pid":0,
            "created":"2017-11-02 14:04:24",
            "updated":"2017-12-25 17:16:44",
            "isChild":1
        },
        {
            "id":10,
            "typeName":"电子",
            "pid":0,
            "created":"2017-12-23 09:32:13",
            "updated":"2017-12-23 09:32:18",
            "isChild":1
        },
        {
            "id":11,
            "typeName":"手机",
            "pid":10,
            "created":"2017-12-23 09:32:36",
            "updated":"2017-12-25 18:00:15",
            "isChild":1
        },
        {
            "id":12,
            "typeName":"电脑",
            "pid":10,
            "created":"2017-12-23 09:32:53",
            "updated":"2017-12-23 09:32:56",
            "isChild":0
        },
        {
            "id":13,
            "typeName":"食品",
            "pid":0,
            "created":"2017-12-23 09:33:06",
            "updated":"2017-12-23 09:33:10",
            "isChild":1
        },
        {
            "id":14,
            "typeName":"白酒",
            "pid":13,
            "created":"2017-12-23 09:33:22",
            "updated":"2017-12-23 09:33:25",
            "isChild":0
        },
        {
            "id":2,
            "typeName":"杂志类",
            "pid":1,
            "created":"2017-11-07 09:44:53",
            "updated":"2017-11-23 12:56:36",
            "isChild":0
        },
        {
            "id":3,
            "typeName":"科普类",
            "pid":1,
            "created":"2017-11-07 09:45:07",
            "updated":"2017-11-23 13:56:43",
            "isChild":0
        },
        {
            "id":4,
            "typeName":"专辑",
            "pid":2,
            "created":"2017-11-07 09:45:35",
            "updated":"2017-11-23 13:57:15",
            "isChild":0
        },
        {
            "id":5,
            "typeName":"家电",
            "pid":0,
            "created":"2017-12-23 09:30:07",
            "updated":"2017-12-23 09:30:16",
            "isChild":1
        },
        {
            "id":6,
            "typeName":"电视",
            "pid":5,
            "created":"2017-12-23 09:30:33",
            "updated":"2017-12-23 09:30:37",
            "isChild":0
        },
        {
            "id":7,
            "typeName":"服装",
            "pid":0,
            "created":"2017-12-23 09:31:00",
            "updated":"2017-12-23 09:31:25",
            "isChild":1
        },
        {
            "id":8,
            "typeName":"男装",
            "pid":7,
            "created":"2017-12-23 09:31:19",
            "updated":"2017-12-23 09:31:22",
            "isChild":0
        },
        {
            "id":9,
            "typeName":"女装",
            "pid":7,
            "created":"2017-12-23 09:31:35",
            "updated":"2017-12-23 09:31:37",
            "isChild":0
        }
    ]
}
表格页面
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>表格页面</title>
        <link rel="stylesheet" href="./layui/css/layui.css">
    </head>
    <body>
        <table class="layui-hide" id="typeData" lay-filter="typeData"></table>

        <!-- 行工具按钮 -->
        <script type="text/html" id="barDemo">
		  <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>
		  <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
        </script>

        <!-- 头工具按钮 -->
        <script type="text/html" id="toolbarDemo">
		  <div class="layui-btn-container">
		    <button class="layui-btn layui-btn-sm" lay-event="addData">增加</button>
		    <button class="layui-btn layui-btn-sm" lay-event="upData">修改</button>
		    <button class="layui-btn layui-btn-sm" lay-event="delData">删除</button>
            </div>
        </script>

        <script src="./layui/layui.js"></script>
        <script type="text/javascript">
            var data={}
            layui.use(['table'],function(){
                //layer = layui.layer; 独立版的layer,无需执行这一句
                var table=layui.table,
                    $=layui.jquery;
                table.render({
                    elem:'#typeData',
                    url:'./typeData.json',
                    page: true,
                    // 头部按钮工具toolbar
                    toolbar:'#toolbarDemo',
                    //自定义头部工具栏右侧图标defaultToolbar['filter', 'exports', 'print']
                    defaultToolbar:['filter'],
                    //title:'类别表',
                    cols:[[
                        {type:'checkbox',fixed:'left',width:100},
                        {field:'id',title:'编号',sort:true,width:100},
                        {field:'typeName',title:'类型名',width:100},
                        {field:'pid',title:'类别',sort:true,width:100},
                        {field:'created',title:'出版时间'},
                        {field:'updated',title:'更新时间'},
                        {field:'isChild',title:'子代',width:100},
                        {fixed: 'right', title:'操作', toolbar: '#barDemo', width:150}
                    ]]

                })

                //行工具事件
                table.on('tool(typeData)', function(obj){
                    data = obj.data;
                    //console.log(obj)
                    if(obj.event === 'del'){
                        layer.confirm('真的删除这行么', function(index){
                            //关闭弹出框
                            layer.close(index)

                            // ajax()异步处理、在数据源中删除这些数据

                            //对表格进行重载
                            againTable()

                        });
                    } else if(obj.event === 'edit'){
                        formUpdata()
                    }
                });

                //头工具栏事件
                table.on('toolbar(typeData)', function(obj){
                    var checkStatus = table.checkStatus(obj.config.id);
                    switch(obj.event){
                        case 'addData':
                            layer.msg("新增")
                            break;
                        case 'upData':
                            if(checkStatus.data.length==1){
                                data=checkStatus.data[0]
                                formUpdata()

                            }else{
                                layer.msg("请选择一条进行修改")
                            }
                            break;
                        case 'delData':
                            if(checkStatus.data.length>0){
                                layer.confirm('真的删除这'+checkStatus.data.length+'行么', function(index){
                                    //关闭弹出框
                                    layer.close(index)

                                    // ajax()异步处理、在数据源中删除这些数据

                                    //对表格进行重载
                                    againTable()


                                });
                            }else{
                                layer.msg('请至少选择一条进行删除')
                            }
                            break;
                    };

                });

                function formUpdata(){
                    layer.open({
                        type:2,
                        title:'修改该行数据',
                        area:['390px','450px'],
                        shade:0.5,
                        offset:[
                            //高、宽
                            ($(window).height()-450)/2,
                            ($(window).width()-360)/2 
                        ],
                        //type为iframe,content内容可再嵌套一个iframe网页
                        content:'./typeTableUp.html'
                    })
                }
                function againTable () {
                    //表格重新加载:table.reload(table标签中属性lay-filter值)
                    table.reload('typeData', {
                        page: {
                            curr: 1 //重新从第 1 页开始
                        }
                        // ,where: {
                        //   key: {
                        //     id: demoReload.val()
                        //   }
                        // }
                    });

                }



            })
        </script>
    </body>
</html>

表格主要页面

表格修改弹窗
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" href="./layui/css/layui.css">
        <style type="text/css">
            body{
                padding: 10px;
            }
        </style>
    </head>
    <body>
        <!-- 表单 -->
        <form class="layui-form" action="" lay-filter="formUpData">
            <!-- 标识符隐藏 -->
            <input type="hidden" name="id">
            <div class="layui-form-item">
                <label class="layui-form-label">类型名</label>
                <div class="layui-input-block">
                    <input type="text" name="typeName" autocomplete="off" placeholder="请输入类型名" class="layui-input">
                </div>
            </div>

            <div class="layui-form-item">
                <label class="layui-form-label">类别</label>
                <div class="layui-input-block">
                    <select name="pid">
                        <option value="">请选择...</option>
                        <option value="0">0</option>
                        <option value="1">1</option>
                        <option value="2">2</option>
                        <option value="3">3</option>
                        <option value="4">4</option>
                        <option value="5">5</option>
                        <option value="6">6</option>
                        <option value="7">7</option>
                        <option value="8">8</option>
                        <option value="9">9</option>
                        <option value="10">10</option>
                        <option value="11">11</option>
                        <option value="12">12</option>
                        <option value="13">13</option>
                        <option value="14">14</option>
                    </select>
                </div>
            </div>

            <div class="layui-form-item">
                <label class="layui-form-label">出版日期</label>
                <div class="layui-input-block">
                    <input type="text" name="created" id="creatDate" placeholder="yyyy-MM-dd HH:mm:ss" autocomplete="off" class="layui-input">
                </div>
            </div>

            <div class="layui-form-item">
                <label class="layui-form-label">更新日期</label>
                <div class="layui-input-block">
                    <input type="text" name="updated" id="upDate" placeholder="yyyy-MM-dd HH:mm:ss" autocomplete="off" class="layui-input">
                </div>
            </div>

            <div class="layui-form-item">
                <label class="layui-form-label">子代</label>
                <div class="layui-input-block">
                    <select name="isChild">
                        <option value="">请选择...</option>
                        <option value="0">0</option>
                        <option value="1">1</option>
                        <option value="2">2</option>
                        <option value="3">3</option>
                        <option value="4">4</option>
                    </select>
                </div>
            </div>

            <div class="layui-form-item">
                <div class="layui-input-block">
                    <button type="submit" class="layui-btn" lay-submit="" lay-filter="putBtn">立即提交</button>
                    <button type="reset" class="layui-btn layui-btn-primary">重置</button>
                </div>
            </div>
        </form>
        <script src="./layui/layui.js"></script>
        <script type="text/javascript">
            layui.use(['laydate','form'],function(){
                var laydate=layui.laydate,form=layui.form;
                //type:'datetime' : yyyy-MM-dd HH:mm:ss
                laydate.render({
                    elem:'#creatDate',
                    type:'datetime'
                })
                laydate.render({
                    elem:'#upDate',
                    type:'datetime'
                })

                //formUpData 是form表单中属性lay-filters的值
                //parent是父网页、子网页可访问父网页的全局变量
                //表单赋值form.val(表单的属性lay-filters值,{一个对象,键值对 表单的name属性值:展示的值})
                //父网页的data变量存入的是当前行的属性
                form.val('formUpData',parent.data)

                //监听提交按钮
                //'submit(putBtn)':submit是表单的一种type,putBtn是该按钮的lay-filter属性值
                //function(){}:回调函数,形参是该表单自动返回一个对象,其中field属性是该表单上对应的值,即js类型数据{name属性值:展示的值....}
                form.on('submit(putBtn)',function(data){
                    //js对象转JSON格式字符串:JSON.stringify(js对象)
                    //JSON格式字符串转js对象:JSON.parse(JSON格式字符串)
                    layer.alert(JSON.stringify(data.field),{title:'确定提交么'},function(index){

                        //此处需要与ajax进行交互将修改的数据存入数据源中

                        layer.close(index)
                        //找到表单弹窗窗口的index
                        var index=parent.layer.getFrameIndex(window.name)
                        //调用父网页自动关闭弹窗
                        parent.layer.close(index)
                    })

                    //防止form在点击submit按钮时,表单就全局刷新
                    return false

                })
            })
        </script>
    </body>
</html>

弹窗页面展示

总体菜单布局
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
        <title>layout 管理系统大布局 -</title>
        <link rel="stylesheet" href="./layui/css/layui.css">
    </head>
    <body>
        <div class="layui-layout layui-layout-admin">
            <div class="layui-header">
                <div class="layui-logo layui-hide-xs layui-bg-black">类型布局</div>
                <!-- 头部区域(可配合layui 已有的水平导航) -->

            </div>

            <div class="layui-side layui-bg-black">
                <div class="layui-side-scroll">
                    <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
                    <ul class="layui-nav layui-nav-tree" lay-filter="test">
                        <li class="layui-nav-item layui-nav-itemed">
                            <a class="" href="javascript:;">类型管理</a>
                            <dl class="layui-nav-child">
                                <dd><a href="./typeTable.html" target="main">类型表格</a></dd>
                            </dl>
                        </li>
                        <li class="layui-nav-item">
                            <a href="javascript:;">类型筛选</a>

                        </li>
                    </ul>
                </div>
            </div>

            <div class="layui-body">
                <!-- 内容主体区域 -->
                <div style="padding: 15px;">
                    <iframe name='main'src="" frameborder="0" width="100%" height="700px"></iframe>
                </div>

            </div>

        </div>

        <script src="./layui/layui.js"></script>
        <script>
            //JS 
            layui.use(['element', 'layer', 'util'], function(){
                var element = layui.element
                ,layer = layui.layer
                ,util = layui.util
                ,$ = layui.$;

                //头部事件
                util.event('lay-header-event', {
                    //左侧菜单事件
                    menuLeft: function(othis){
                        layer.msg('展开左侧菜单的操作', {icon: 0});
                    }
                });

            });
        </script>
    </body>
</html>

最终样式

图片转存中…(img-M4bVCq5K-1693646199240)]

总体菜单布局
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
        <title>layout 管理系统大布局 -</title>
        <link rel="stylesheet" href="./layui/css/layui.css">
    </head>
    <body>
        <div class="layui-layout layui-layout-admin">
            <div class="layui-header">
                <div class="layui-logo layui-hide-xs layui-bg-black">类型布局</div>
                <!-- 头部区域(可配合layui 已有的水平导航) -->

            </div>

            <div class="layui-side layui-bg-black">
                <div class="layui-side-scroll">
                    <!-- 左侧导航区域(可配合layui已有的垂直导航) -->
                    <ul class="layui-nav layui-nav-tree" lay-filter="test">
                        <li class="layui-nav-item layui-nav-itemed">
                            <a class="" href="javascript:;">类型管理</a>
                            <dl class="layui-nav-child">
                                <dd><a href="./typeTable.html" target="main">类型表格</a></dd>
                            </dl>
                        </li>
                        <li class="layui-nav-item">
                            <a href="javascript:;">类型筛选</a>

                        </li>
                    </ul>
                </div>
            </div>

            <div class="layui-body">
                <!-- 内容主体区域 -->
                <div style="padding: 15px;">
                    <iframe name='main'src="" frameborder="0" width="100%" height="700px"></iframe>
                </div>

            </div>

        </div>

        <script src="./layui/layui.js"></script>
        <script>
            //JS 
            layui.use(['element', 'layer', 'util'], function(){
                var element = layui.element
                ,layer = layui.layer
                ,util = layui.util
                ,$ = layui.$;

                //头部事件
                util.event('lay-header-event', {
                    //左侧菜单事件
                    menuLeft: function(othis){
                        layer.msg('展开左侧菜单的操作', {icon: 0});
                    }
                });

            });
        </script>
    </body>
</html>

[外链图片转存中…(img-6nDTGSzo-1693646199242)]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值