JS案例:ajax获取图片列表

简介: JS案例:ajax获取图片列表

AJAX是个啥?有什么作用?如何实现AJAX?如何使用AJAX?这几个问题我在前端JS的面试题中,遇见了不少,对于前后端分离,单页面渲染流行的今日,ajax似乎变得很重要。


那么什么是Ajax?

Ajax(Asynchronous JavaScript and XML),又被称为异步 JavaScript 和 XML,它不是一门语言,而是web应用的一门技术。要知道,如果在2009年你了解前端的dom操作,ajax技术和一点点JS语法,你就已经可以找到一份不错的web前端的工作了。也正是Ajax技术将前后端分离和单页面渲染流行度提升了很大的空间


Ajax有什么作用?

ajax的作用用官话来讲就是:在不需要刷新页面的情况下,就可以产生局部刷新的效果,也就是在页面不刷新的情况下实现局部渲染,使前后端数据传输得到提升。ajax实现了在浏览器与服务器之间进行http传输(只需要获得少量数据,而不用渲染整个页面),使web程序更快,更小。


如何实现AJAX?

在W3School上有详细文档

有几点需要注意:


IE低版本浏览器与其他浏览器兼容性问题

GET与POST请求方式的写法问题(GET需要将参数拼接在URL中并且不需要传data,而POST需要传data不需要拼接URL)

同步与异步方式中的请求超时timeout(异步可以填写timeout,而同步会报错)

这里我也简单实现一下:

首先,我们写个将对象属性拼接到url中的函数,方便get方式请求时调用

    /*
     * 将对象属性拼接到url中
     * @param url:接口地址
     * @param obj:需要操作的对象
     * @return string:拼接结果
     */
    function urlJoin (url, obj) {
        let list = []
        for(let key in obj) {
            if(obj.hasOwnProperty(key)) {
                list.push(`${key}=${obj[key]}`)
            }
        }
        return `${url}?${list.join('&')}`
    }

然后就是ajax的基本写法(这里对ajax响应做了一个Promise操作,当然也可以改为回调或者事件监听)

    /*
     * ajax请求方法
     * @param config method:请求类型 url:接口地址 data:输入参数 timeout:超时时间
     * @return Promise:Promise异步处理
     */
    function myAjax (config) {
        let xhr;
        if(window.ActiveXObject) { //ie浏览器
            xhr = new ActiveXObject("Microsoft.XMLHTTP");
        } else if(window.XMLHttpRequest) { //其他浏览器
            xhr = new XMLHttpRequest();
        }
        config.method === 'get' ? (function () {//判断get与post等请求方式
            config.url = urlJoin(config.url, config.data);
            config.data = null
        }()) : "";
        //open(请求方式|string,请求路径|string,是否异步|bool)异步一般选择true,false代表同步,选false则会使请求不堵塞,不会等待请求结果,此时的timeout也无意义
        xhr.open(config.method, config.url, config.async || true);
        xhr.send(config.data ? config.data : {})
        config.async ? xhr.timeout = config.timeout || 10 * 1000 : ''//ajax请求超时,默认10秒
        return new Promise((resolve, reject) => {
            xhr.addEventListener('timeout', function () {//超时抛错
                reject(this)
                throw Error('request timeout')
            })
            xhr.addEventListener('load', function () {
                if(xhr.readyState === 4 && xhr.status === 200) {//请求成功
                    resolve(JSON.parse(this.response))
                } else {
                    reject(this)
                }
            })
        })
    }


实现完成后得点个题啊,文章的目的是获取图片列表,接着上篇文章的nodejs搭建静态目录服务继续往下整

在上篇文章的其他接口中,新增一个获取图片列表的接口getList

1.png

这里我优化了一下,处理跨域,摒弃了node旧模块而使用了URL类,于是得到以下代码

let server = http.createServer((req, res) => {
    res.setHeader('Access-Control-Allow-Origin', '*')//设置响应头解决跨域
    let url = new URL(req.url, `http://${req.headers.host}`)//解析请求的地址
    let data = urlSplit(url.href)//获取参数
    if(req.url.indexOf('/static/') !== - 1) {
        console.log('获取静态文件')
        readFile('.' + req.url).then((data) => {
            res.write(data, "binary");
            res.end();
        })
    } else {
        switch(url.pathname) {
            case '/getList':
                console.log('获取列表')
                res.write(JSON.stringify(['1.jpg', '2.jpg', '3.jpg', '4.jpg', '5.jpg']));
                res.end();
                break;
            default:
                res.writeHead(404, {'Content-Type': 'text/plain'})
                res.write("not find");
                res.end();
                break;
        }
    }
})

通过访问http://127.0.0.1:1024/getList就可以获取到列表


于是我们就可以开始实现view的渲染,新建一个loadPic类,功能是获取静态资源路径并渲染图片(其中utils类是工具类,包括ajax在内,后续在完整项目中可以看到)

import Utils
    from './utils.js';
let utils = new Utils()
export default class LoadPic {
    //静态资源路径
    set baseUrl (val) {
        this._baseUrl = val
    }
    get baseUrl () {
        return this._baseUrl
    }
    //根据数据渲染图片
    create (ele, data) {
        for(let i = 0; i < data.length; i ++) {
            let liBox = utils.createEle('li', {listStyle: 'none'}, {}, ele)
            utils.createEle('img', null, {
                src: `${this.baseUrl}${data[i]}`
            }, liBox)
        }
    }
}


然后我们在JS中使用ajax来获取数据并加载图片

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>
        lazyLoad</title>
    <style>
        li, li > img {
            float: left;
            height: 200px;
        }
    </style>
</head>
<body>
<ul id="loadBox"></ul>
<script type="module">
    import Utils
        from "./js/utils.js"
    import LoadPic
        from './js/loadPic.js'
    let baseUrl = 'http://127.0.0.1:1024'
    let picPath = '/static/'
    let utils = new Utils()
    let loadBox = document.querySelector('#loadBox')
    let loadPic = new LoadPic()
    loadPic.baseUrl = baseUrl + picPath
    utils.myAjax({
        url: baseUrl + '/getList',
        method: 'get',
        data: {len: 100},
        timeout: 3 * 1000
    }).then((data) => {
        loadPic.create(loadBox, data)
        console.log(data)
    }).catch((err) => {
        console.log(err)
    })
</script>
</body>
</html>

列表效果与之前一样,图片也加载出来了

1.png1.png

最后附上源码:gitee地址,希望对各位有所帮助


相关文章
|
7月前
|
前端开发 JavaScript 容器
制作b超单生成器, 假怀孕b超单图片制作, p图医院证明【css+html+js装逼恶搞神器】
本资源提供一个适合用于熟人之间恶搞的工具,效果逼真,仅供学习参考与娱乐。包含前端技术学习要点:语义化布局、响应式设计、Flexbox、图片自适应
|
数据采集 Web App开发 JavaScript
利用Selenium和XPath抓取JavaScript动态加载内容的实践案例
利用Selenium和XPath抓取JavaScript动态加载内容的实践案例
|
11月前
|
JavaScript 前端开发 索引
40个JS常用使用技巧案例
大家好,我是V哥。在日常开发中,JS是解决页面交互的利器。V哥总结了40个实用的JS小技巧,涵盖数组操作、对象处理、函数使用等,并附带案例代码和解释。从数组去重到异步函数,这些技巧能显著提升开发效率。先赞再看后评论,腰缠万贯财进门。关注威哥爱编程,全栈开发就你行!
340 16
|
10月前
|
JavaScript 前端开发 Java
深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
Array.find() 是 JavaScript 数组方法中一个非常实用和强大的工具。它不仅提供了简洁的查找操作,还具有性能上的独特优势:返回的引用能够直接影响原数组的数据内容,使得数据更新更加高效。通过各种场景的展示,我们可以看到 Array.find() 在更新、条件查找和嵌套结构查找等场景中的广泛应用。 在实际开发中,掌握 Array.find() 的特性和使用技巧,可以让代码更加简洁高效,特别是在需要直接修改原数据内容的情形。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
10月前
|
监控 JavaScript 前端开发
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
MutationObserver 是一个非常强大的 API,提供了一种高效、灵活的方式来监听和响应 DOM 变化。它解决了传统 DOM 事件监听器的诸多局限性,通过异步、批量的方式处理 DOM 变化,大大提高了性能和效率。在实际开发中,合理使用 MutationObserver 可以帮助我们更好地控制 DOM 操作,提高代码的健壮性和可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
|
移动开发 JavaScript 前端开发
【Html.js——图片折叠效果】折叠手风琴(蓝桥杯真题-1763)【合集】
本项目实现了一个图片折叠手风琴效果,使用jQuery完成。主要包括以下部分: - **介绍**:任务是通过点击图片实现折叠和展开的效果。 - **准备**:内置初始代码,包含 `css/style.css`、`images/` 文件夹、`js/` 文件夹及 `index.html` 等文件。启动 Web Server 服务可运行项目。 - **目标**:完善 `index.js` 文件,使页面达到预期的折叠效果。 - **规定**:严格按步骤操作,保持默认文件结构不变,并在完成后保持 Web 服务正常访问状态。 - **通关代码**:使用 jQuery 实现点击事件,为选中元素添加 `act
301 19
|
JavaScript 容器
带方向感知功能的js图片遮罩层插件
带方向感知功能的js图片遮罩层插件
|
数据采集 前端开发 JavaScript
虎扑APP数据采集:JavaScript与AJAX的结合使用
虎扑APP数据采集:JavaScript与AJAX的结合使用
|
JavaScript
js学习--商品列表商品详情
js学习--商品列表商品详情
151 2
|
JavaScript 前端开发 索引
JavaScript HTML DOM 节点列表
JavaScript HTML DOM 节点列表
149 5