本文介绍: 练一个普通的JS案例

练习题目来自:《JavaScript交互式网页设计》复习考试_java庞的博客-CSDN博客

练了上面这个博主的复习题,用原生操作DOM比较麻烦一点,但js原生和H5自我感觉不是写得很好

目录

一、用户登录案例需求

二、图书管理列表页面需求

        ——————jQuery————————

一、通过jQuery实现用户表单登录验证

1.1 HTML 页面

1.2 JavaScript(jQuery)

二、通过jQuery实现图书管理列表

2.1、HTML页面

2.2 JavaScript(jQuery)

——————原生——————————

一、通过JavaScript原生实现用户登录验证

1.1 HTML

1.2 CSS

1.3 JavaScript

二、通过JavaScript原生实现图书管理列表

2.1 HTML

2.2 CSS

2.3 JavaScript


一、用户登录案例需求

1、验证用户名密码的非空判断为空提示光标离开时提醒

 2、实现表单中的重置功能点击重置用户名密码,并清空提示

3、点击登录按钮检测用户名或密码是否输入正确

使用prompt模拟用户注册动态获取用户名和密码)

 

 4、点击登录按钮,如果用户名和密码正确,则跳转图书管理列表页面

二、图书管理列表页面需求

1、在表单中输入书名和价格,点击添加,把新的书籍添加到列表中

2、点击删除按钮,弹出提示确定删除删除当前选中行数据,反之取消提示取消删除

 

 (注:这里出了bug,所以我加了判断条件去保证不能清空整个列表,要求书籍列表必须保持一条一条以上)

3、点击列表中编辑按钮,可以修改当前行的书名和价格

 (注意id自增


一、通过jQuery实现用户表单登录验证

1.1 HTML 页面

<!DOCTYPE html>
<html lang="en">

<head&gt;
    <meta charset="UTF-8"&gt;
    <meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;
    <meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    <title&gt;Document</title>
    <script src="./js/jquery.min.js"></script>

    <style>

    </style>
</head>

<body>
    <form action="book.html">
        <table border="1">
            <tr>
                <td>用户名</td>
                <td><input type="text" id="nameValue">
                    <br><span style="color: red;" id="nameHint">用户名不能为空</span>
                </td>


            </tr>
            <tr>
                <td>密码</td>
                <td><input type="password" id="passwordValue">
                    <br><span style="color: red;" id="passwordHint">密码不能为空</span>
                </td>
            </tr>
            <tr>
                <td colspan="2" style="text-align: center;">
                    <input type="submit" value="登录" id="go">
                    <button id="btn">重置</button>
                </td>
            </tr>
        </table>
    </form>


    <!-- 引入JS文件 -->
    <script src="./js/index.js"></script>
</body>

</html>

1.2 JavaScript(jQuery

//1、模拟用户注册
const user = prompt('用户注册:请输入用户名:')
const password = prompt('用户注册:请输入密码:')

$(function () {
    /*
        实现功能:
        1、用户名和密码表单的非空判断
        2、登录功能(阻止默认行为)
        3、重置功能
    */
    //一、实现用户名的非空判断
    //1.1 把用户名的非空提示进行隐藏
    $('#nameHint').hide()
    //1.2 绑定光标离开blur
    $('#nameValue').blur(function () {
        //1.3 如果用户名的value为空,就显示提示注意去除首尾空格
        if ($.trim(this.value) === '') {
            //如果为空,就显示提示
            $('#nameHint').show()
            this.value = $.trim(this.value)
        } else {
            //反之输入了值,隐藏起提示
            $('#nameHint').hide()
            //防止输入的值有左右空格,重新赋值value值
            this.value = $.trim(this.value)
        }
    })
    //二、实现密码的非空验证
    $('#passwordHint').hide()
    $('#passwordValue').blur(function () {
        //1.3 如果用户名的value值为空,就显示提示,注意去除首尾空格
        if ($.trim(this.value) === '') {
            //如果为空,就显示提示
            $('#passwordHint').show()
            this.value = $.trim(this.value)
        } else {
            //反之输入了值,隐藏起提示
            $('#passwordHint').hide()
            //防止输入的值有左右空格,重新赋值value值
            this.value = $.trim(this.value)
        }
    })
    //三、实现重置功能
    //3.1 给重置按钮绑定click
    $('#btn').click(function (e) {
        //3.2 点击按钮出现默认行为,需要事件对象阻止
        e.preventDefault()
        //3.3 点击以后清空用户名和密码的表单
        $('#nameValue').val('')
        $('#passwordValue').val('')
        //3.4 清空的同时,val就为空了,就需要重新隐藏两个表单的提示
        if ($('#passwordValue').val('') &amp;&amp; $('#nameValue').val('')) {
            $('#nameHint').hide()
            $('#passwordHint').hide()
        }
    })


    //四、实现登录功能
    //form表单,使用submit事件事件对象阻止行为
    $('#go').submit(function (e) {
        //4.1 判断输入的用户名和密码是否为空,如果两者有一个为空,就提示
        if ($('#passwordValue').val() === '' || $('#nameValue').val() === '') {
            //4.2 提示并阻止行为
            alert('用户名和密码不可有空')
            //阻止默认行为
            e.preventDefault()
            //4.3 判断用户名和密码是否输入正确(不等于就提示错误)
        } else if ($('#nameValue') != user &amp;&amp; $('#passwordValue') != password) {
            alert('您输入的用户名或密码有误')
            e.preventDefault()
            //4.4 以上条件不成立,就是登录成功了
        } else {
            alert('登陆成功欢迎进入图书列表')
        }
    })
})

二、通过jQuery实现图书管理列表

2.1、HTML页面

<!DOCTYPE html>
<html lang="en">

<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>Document</title>
    <script src="./js/jquery.min.js"></script>
    <style>
        h1 {
            text-align: center;
        }

        table {
            margin: 0 auto;
            width: 800px;
        }

        table tr td {
            text-align: center;
        }

        .add {
            margin: 0 auto;
            text-align: center;
        }
    </style>
</head>

<body>
    <div class="add">
        <h2>新增图书</h2>
        <span>书名:</span><input type="text" class="bookName">
        <span>价格:</span><input type="text" class="bookPrice">
        <button class="addBtn">添加</button>
    </div>

    <h1>图书管理系统</h1>
    <table border="1">
        <thead>
            <td>图书编号</td>
            <td>书名</td>
            <td>价格</td>
            <td>操作</td>
        </thead>
        <tbody>
        </tbody>
    </table>


    <!-- 引入js -->
    <script src="./js/book.js"></script>
</body>

</html>

2.2 JavaScript(jQuery

//一、初始化一组图书数据
const arr = [
    { id: 1, book: '三国演义', price: 39.9 },
    { id: 2, book: '水浒传', price: 49.9 },
    { id: 3, book: '红楼梦', price: 59.9 },
    { id: 4, book: '西游记', price: 69.9 }
]

//二、封装一个渲染函数
function render() {
    //2.1 清空tbody中的数据
    $('tbody').html('')
    //2.2 循环数组arr然后渲染tbody中
    $.each(arr, function (index, item) {
        //index指向索引item指向数组中的对象
        //2.3 每循环一次,就创建一个tr标签
        let tr = $('<tr></tr>')
        //2.4 把对象中的数据添加给tr
        tr.html(`
        <td>${item.id}</td>
        <td>${item.book}</td>
        <td>${item.price}</td>
        <td>
            <button class="deleteBtn${item.id}">删除</button>
            <button class="updateBtn${item.id}">编辑</button>
        </td>
        `)
        //为了方便对列表中的按钮操作,给两个btn按钮分别取类名然后类名后用数组的id作为变量拼接
        //2.5 每创建一次tr,就把tr添加tbody
        $('tbody').append(tr)
        //2.6 因为录入一次数据,清空掉表单中的值
        $('.bookName').val('')
        $('.bookPrice').val('')
    })

}
render() //先调用一次,把初始数据渲染出来


/*三个功能:添加编辑删除*/

//三、实现添加功能
//3.1 给添加按钮addBtn绑定追加事件
$('.addBtn').click(function () {
    //3.2 每点击一次,就查询是否添加图书
    let flag = confirm('是否添加图书?')
    if (flag) {
        //3.3 判断添加表单中的书名和价格是否为空字符串,如果是空的,就提示(注意去除首尾空格)
        if ($.trim($('.bookName').val()) === '' || $.trim($('.bookPrice').val()) === '') {
            //就把flag改为false (就是不满足添加条件)
            flag = false
            alert('添加的书名或者价格不可留空')
            //然后注意清空掉有空格的表单值
            $('.bookName').val('')
            $('.bookPrice').val('')
        } else {//反之添加成功
            //把数据push数组arr(就是添加一个对象arrarr.push({
                id: arr[arr.length - 1].id + 1, //因为添加的表单没有编号我们编号自增
                book: $('.bookName').val(),
                price: $('.bookPrice').val()
            })
            //不在这里添加数据以后清空表单值,是因为在render中已经添加了清空表单值的语句
            //所以在调用render()以后就自动清空了val值
            //3.6 添加成功以后,渲染数据
            render()
        }
    } else { //这层是对flagfalse的判断
        alert('取消添加')
    }
})


//四、实现列表的动态删除
//4.1 实现动态删除,就是对table中tbody这个表单中的tr做删除,所以可以tbody绑定一个事件委托
//tbody绑定点击事件,但是触发对象是子元素tr
$('tbody').on('click', 'tr', function (e) {
    /*
    e.target.className 可以获取触发元素类名叫啥
    console.log(e.target.className)
    所以可以根据 className去找到触发的删除按钮
    */
    //4.2 forEach数组,去判断删除的是不是对应行号
    arr.forEach((item, index) => {
        //4.3 用if去判断触发的是不是对应行号,也就是 className去判断数组中的类名
        //而在渲染数组时候我们给删除按钮取的类名是:deleteBtn${item.id},也就是deleteBtn+id
        if (e.target.className == `deleteBtn${item.id}`) {
            // console.log(item.id) //测试触发数组对应的id
            //4.4 当选择删除按钮的时候,就给出一个是否删除图书的提示
            let flag = confirm('是否删除该图书?')
            if (flag) { //默认删除
                //4.5 从指定位置开始删除,但是要注意让书籍书籍大于或者等于一
                //因为前面渲染数据,长度是在保证数组的上一条数据的id值前提下添加新的图书(默认id自增),如果清完了,新图书就添加不上来了
                if (arr.length <= 1) {
                    flag = false
                    alert('请保证书籍列表中的书籍数量大于等于一条')
                } else {
                    //反之就删除
                    arr.splice(index, 1)
                }
            } else {//取消删除
                alert('取消删除')
            }

        }
    })
    //4.6 重新去渲染书籍
    render()
})




//五、实现动态编辑
//5.1 编辑按钮同样触发在tbody中,和删除一样都可以使用事件委托,
$('tbody').on('click', 'tr', function (e) {
    //5.2 同样 each数组
    arr.forEach((item, index) => {
        //5.3 同样通过 className去判断有没有触发编辑按钮
        if (e.target.className == `updateBtn${item.id}`) {
            //5.4 点击编辑按钮,我们弹出是否提示
            let flag = confirm('是否修改当前图书的书籍信息?')
            if (flag) {//默认修改
                //5.5 用两个变量动态接收修改的信息
                let newName = prompt('请输入新的书名:')
                let newPrice = prompt('请输入新的价格:')
                //5.6 把新的变量覆盖当前索引的对象属性值上
                item.book = newName
                item.price = newPrice
            } else {
                alert('取消删除')
            }
        }
    })
    //5.7 调用渲染函数
    render()
})

一、通过JavaScript原生实现用户登录验证

1.1 HTML

这里因为脑子抽了忘记用 form表单和submit事件了,所以用了table和a标签的href绑定到图书列表)

<!DOCTYPE html>
<html lang="en">

<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>Document</title>
    <link rel="stylesheet" href="css/index.css">
</head>

<body>
    <!-- 构建出登录界面 -->
    <table border="1px">
        <tr>
            <td>用户名</td>
            <td>
                <input type="text" class="name">
                <br>
                <span style="visibility:hidden; color:red" class="userSpan">用户名不能为空</span>
            </td>
        </tr>
        <tr>
            <td>密码</td>
            <td>
                <input type="password" class="password"><br>
                <span style="visibility:hidden; color:red" class="passwordSpan">密码不能为空</span>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <div class="buttonBox">
                    <a href="book.html"><button class="go">登录</button></a>
                    <button class="reset">清空</button>
                </div>
            </td>
        </tr>
    </table>

    <!-- 引入js -->
    <script src="./js/index.js"></script>

</body>

</html>

1.2 CSS

table {
    border: 1px solid black;
}



table tr td .buttonBox {
    margin-left: 28%;
}

table tr td .buttonBox button {
    margin: 0 5px;
}

1.3 JavaScript

/*用来实现首页的登录页面
一、实现用户名的非空验证
二、实现密码的非空验证
三、实现重置功能
四、触发点击登录,判断用户名和密码是否匹配
五、触发点击登录,用户名和密码正确跳转到操作页面
六、用户名和密码为空时,触发登录则弹出:用户名和密码不能为空
七、当密码错误时候提示:密码不正确

*/

//一、获取到DOM
const userName = document.querySelector('.name') //用户名表单
const userPassword = document.querySelector('.password') //密码表单
const go = document.querySelector('.go') //登录
const reset = document.querySelector('.reset') //重置
const nameSpan = document.querySelector('.userSpan') //用户名的提示
const passwordSpan = document.querySelector('.passwordSpan') //密码的提示

//二、创建用户名和密码的变量
const name = prompt(`用户注册:请输入用户名:`)
const password = prompt(`用户注册:请输入您的密码:`)

//三、实现用户名的非空验证(光标离开时候显示userName.addEventListener('blur', () => {
    //2.1判断用户名是否为空,取消左右空格用到trim()
    if (userName.value.trim() === '') {
        //2.2 如果为null,则进行提示
        nameSpan.style.visibility = 'visible'
    } else {
        //2.3 当输入了值以后,隐藏起提示
        nameSpan.style.visibility = 'hidden'
    }
})

//四、实现密码的非空验证(光标离开时候显示userPassword.addEventListener('blur', () => {
    //3.1判断密码是否为空
    if (userPassword.value.trim() === '') {
        //3.2 如果为null,则进行提示
        passwordSpan.style.visibility = 'visible'
    } else {
        //3.3 当输入了值以后,隐藏起提示
        passwordSpan.style.visibility = 'hidden'
    }
})


//五、触发点击登录,判断用户名和密码是否匹配且是否为空
go.addEventListener('click', e => {


    //4.1 当点击登录时,如果为空,就提示:用户名或密码不可为空
    if (userName.value.trim() === '' || userPassword.value.trim() === '') {
        alert('用户名或者密码不可为空')
        //4.2 如果为空,或者不正确,就阻止a标签默认行为的跳转
        e.preventDefault()

        //4.2 反之,就要去判断输入的值是否匹配用户名和密码
    } else if (userName.value.trim() == name &amp;&amp; userPassword.value.trim() == password) {
        //密码匹配正确,则跳转到图书管理页面(不阻止a标签的默认行为即可alert('登录成功,欢迎进入图书管理系统')
    } else {
        //4.4 如果不正确,就提示,并阻止默认行为
        alert('用户名或者密码不正确')
        e.preventDefault()
    }
})

//六、实现重置功能
// 触发重置按钮的点击事件,清空掉两个表单的value值即可
reset.addEventListener('click', () => {
    //6.1 把空的字符赋值给value值
    userName.value = ''
    userPassword.value = ''
    //6.2 如果已经提示出了“不可为空”的提示,就需要去重新隐藏掉标签
    if (nameSpan.style.visibility = 'visible') {
        nameSpan.style.visibility = 'hidden'
    }
    if (passwordSpan.style.visibility = 'visible') {
        passwordSpan.style.visibility = 'hidden'
    }

})

二、通过JavaScript原生实现图书管理列表

2.1 HTML

<!DOCTYPE html>
<html lang="en">

<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>Document</title>
    <link rel="stylesheet" href="css/book.css">
</head>

<body>
    <div class="add">
        <h2>新增图书</h2>
        <span>书名:</span><input type="text" class="bookName">
        <span>价格:</span><input type="text" class="bookPrice">
        <button class="addBtn">添加</button>
    </div>

    <h1>图书管理系统</h1>
    <table border="1">
        <thead>
            <td>图书编号</td>
            <td>书名</td>
            <td>价格</td>
            <td>操作</td>
        </thead>
        <tbody>

        </tbody>
    </table>

    <!-- 引入js -->
    <script src="./js/book.js"></script>
</body>

</html>

2.2 CSS

h1 {
    text-align: center;
}

table {
    margin: 0 auto;
    width: 800px;
}

table tr td {
    text-align: center;
}

.add {
    margin: 0 auto;
    text-align: center;
}

2.3 JavaScript

//一、先写死一些图书列表的数据
let bookArr = [
    { id: 1, name: 'Java高级程序设计', price: '39.9' },
    { id: 2, name: 'Java数据结构算法', price: '49.9' },
    { id: 3, name: 'JavaScript入门精通', price: '59.9' }
]
//二、获取相关元素
//2.1 添加模块有关元素
const bookName = document.querySelector('.add .bookName') //添加的书名
const bookPrice = document.querySelector('.add .bookPrice') //添加的价格
const addBtn = document.querySelector('.add .addBtn') //添加按钮
//2.2 图书模块相关元素
const tbody = document.querySelector('table tbody')


//三、封装一个渲染的函数
function render() {
    //3.1 每次调用都清空一次tbody的内容
    tbody.innerHTML = ''
    //3.2 循环bookArr数组
    bookArr.forEach(item => {
        //3.3 每次循环都要创建一个tr标签
        let tr = document.createElement('tr')
        //3.4 往tr中填充内容(使用反引字符串)
        tr.innerHTML = `
        <tr>
        <td>${item.id}</td>
        <td>《${item.name}》</td>
        <td>${item.price}</td>
        <td>
        <button id=${item.id}>删除</button>
        <button class="change${item.id}">编辑</button>
        </td>
        </tr> 
        `
        //3.5 tr渲染完成以后,把tr追加给tbody
        tbody.appendChild(tr)
        //3.6 每录入一次书籍,清空表单的value值
        bookName.value = bookPrice.value = ''
    })
}

// 四、先初始化渲染出默认数据
render()

// 五、实现书籍的动态添加
addBtn.addEventListener('click', () => {
    //5.1把表单里面的值push到bookArr数组
    bookArr.push({
        //获取最后一个长度的id+1
        id: bookArr[bookArr.length - 1].id + 1,
        name: bookName.value,
        price: bookPrice.value
    })
    //5.2 使用 confirm弹出确认
    let flag = confirm('是否添加?')
    if (bookName.value.trim() === '' || bookPrice.value.trim() === '') {
        alert('书名或价钱不能为空')
        flag = false
    } else {
        flag = true
    }
    if (flag) {
        render()
    }
})

//六、实现书籍的动态删除
//6.1 通过事件委托,给父元素绑定事件
tbody.addEventListener('click', function (e) {
    //6.2 循环数组
    bookArr.forEach((item, index) => {
        //6.3 通过事件对象,如果事件对象的target.id(也就是删除按钮的id属性的值(在渲染处有添加)) 等于数组中的id值,就触发了删除条件
        if (e.target.id == item.id) {
            //6.4 做个提示
            let flag = confirm('是否删除')
            if (flag) { //如果flag为true,就开始删除
                //6.5 从指定位置开始删除,删除一个对象
                if (bookArr.length <= 1) {
                    flag = false
                    alert('请保证书籍数量大于等于一')
                } else {
                    bookArr.splice(index, 1)
                }
            } else {
                alert('取消删除')
            }
        }
    })
    render() //重新渲染数据
    // console.log(bookArr.length) 测试数组长度是否正确
})


//七、实现编辑功能
tbody.addEventListener('click', function (e) {
    // console.log(e.target);
    // console.log(e.target.className)
    //7.1 同样要判定是否触发到了对应的编辑按钮
    //e.target.className 用来判定是不是触发到该类名
    bookArr.forEach(item => {
        //7.2 判断触发的元素类名是不是等于编辑按钮的类名,在渲染结构的编辑按钮添加了一个change${item.id}的类
        if (e.target.className == `change${item.id}`) {
            // console.log('触发到了编辑事件');
            // 7.2 如果触发到了编辑事件,我们输入两个变量
            let flag = confirm('是否修改书籍内容?')
            if (flag) {
                const strName = prompt('请输入新的书名')
                const strPrice = prompt('请输入新的价格')
                //7.3 把value值修改
                item.name = strName
                item.price = strPrice
            }
        }
        render()

    })
})

原文地址:https://blog.csdn.net/qq_63141957/article/details/127956203

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_48982.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注