Ajax
Ajax (Asynchronous JavaScript And XML) ,即异步JavaScript和 XML,是一组用于在网页上进行异步数据交换的Web开发技术
Ajax可以在不刷新整个页面的情况下向服务器发起请求并获取数据,然后将数据插入到网页中的某个位置
这种技术能够实现增量式更新页面,提高用户交互体验,减少响应时间和带宽的消耗
使用Ajax技术时,可以通过JavaScript和XMLHttpRequest对象向服务器获取数据
在Ajax请求的过程中,可以通过定义回调函数的方式对请求的结果进行处理,回调函数会在请求完成后执行,通过这种方式可以更新页面内容或者响应用户操作
实现的功能
- 异步更新页面内容(如搜索建议、聊天框等)
- 在页面中特定区域显示动态数据
- 提交表单数据而无需刷新整个页面
- 与服务器进行交互,不会导致页面跳转或刷新
优点
- 提高用户体验:通过减少页面的重载和刷新,使得网站变得更加灵活和动态
- 减轻服务器负载:可以有效减少服务器接收到的请求次数和需要响应的数据量,从而减轻服务器的负担
- 提高响应速度:可以异步获取数据并更新页面,从而提高响应速度
- 增加交互性:使页面变得更加动态和可交互
潜在的问题
对搜索引擎优化(SEO)劣势较大,对于需要SEO的项目,应慎重考虑
SEO在爬虫抓取时无法抓取Ajax的URL和内容,如果需要做SEO,可以尝试服务端渲染(SSR技术)
需要考虑数据安全性和网络安全性问题,并采取相应的措施加以防范
不合适的使用,可能会降低网站质量和效率,所以需要根据实际需求来决定是否采用
使用Ajax
MDN Ajax文档
常规方法
请求进度
1 2 3 4 5 6 7 8 9 10
| const progress = document.getElementById('progress')
const xhr = new XMLHttpRequest()
xhr.addEventListener('progress', (event)=> { console.log(event.loaded, event.total) progress.innerText = `${(event.loaded/event.total*100).toFixed(2)}%` })
|
超时处理
1 2 3 4 5 6 7 8 9
| const xhr = new XMLHttpRequest()
xhr.timeout = 60000
xhr.addEventListener('timeout', ()=> { console.log('请求超时') })
|
中断请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const stop = document.getElementById('stop')
const xhr = new XMLHttpRequest()
stop.addEventListener('click', ()=> { xhr.abort() })
xhr.addEventListener('abort', ()=> { console.log('请求中断') })
|
发送Get请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| const send = document.getElementById('send')
send.addEventListener('click', ()=> { sendAjax() })
const sendAjax = ()=> { const xhr = new XMLHttpRequest()
xhr.open('get', 'http://localhost:3000/api/txt', true)
xhr.onload = function() { if (xhr.status === 200) { console.log(xhr.responseText) } }
xhr.send(null) }
|
发送Post请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| const send = document.getElementById('send')
send.addEventListener('click', ()=> { sendAjax() })
const sendAjax = ()=> { const xhr = new XMLHttpRequest()
xhr.open('post', 'http://localhost:3000/api/post', true)
xhr.setRequestHeader('Content-Type', 'application/json')
xhr.onload = function() { if (xhr.status === 200) { console.log(xhr.responseText) } }
xhr.send(JSON.stringify({name:"yajue",age:24})) }
|
上传文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| const file = document.getElementById('file')
file.addEventListener('change', ()=> { const formData = new FormData() formData.append('file', file.files[0]) const xhr = new XMLHttpRequest() xhr.open('post', 'http://localhost:3000/api/upload', true) xhr.onload = function() { if (xhr.status === 200) { console.log(xhr.responseText) } } xhr.send(formData) })
|