Async Javascript And XML
说简单点,就是用 JS 发请求收响应

AJAX 是浏览器上的功能

浏览器可以发请求,收响应
浏览器在 window 上加了一个 XMLHttpRequest 函数
用这个构造函数(类)可以构造出一个对象
JS 通过它实现发请求,收响应

安装node dev

  1. npm install -g node-dev

使用

  1. node-dev server.js 8888

使用 server.js 作为服务器

  1. var http = require('http')
  2. var fs = require('fs')
  3. var url = require('url')
  4. var port = process.argv[2]
  5. if(!port){
  6. console.log('请指定端口号好不啦?\nnode server.js 8888 这样不会吗?')
  7. process.exit(1)
  8. }
  9. var server = http.createServer(function(request, response){
  10. var parsedUrl = url.parse(request.url, true)
  11. var pathWithQuery = request.url
  12. var queryString = ''
  13. if(pathWithQuery.indexOf('?') >= 0){ queryString = pathWithQuery.substring(pathWithQuery.indexOf('?')) }
  14. var path = parsedUrl.pathname
  15. var query = parsedUrl.query
  16. var method = request.method
  17. /******** 从这里开始看,上面不要看 ************/
  18. console.log('有个傻子发请求过来啦!路径(带查询参数)为:' + pathWithQuery)
  19. if(path === '/'){
  20. response.statusCode = 200
  21. response.setHeader('Content-Type', 'text/html;charset=utf-8')
  22. response.write(`二哈`)
  23. response.end()
  24. } else if(path === '/x'){
  25. response.statusCode = 200
  26. response.setHeader('Content-Type', 'text/css;charset=utf-8')
  27. response.write(`body{color: red;}`)
  28. response.end()
  29. } else {
  30. response.statusCode = 404
  31. response.setHeader('Content-Type', 'text/html;charset=utf-8')
  32. response.write(`你输入的路径不存在对应的内容`)
  33. response.end()
  34. }
  35. /******** 代码结束,下面不要看 ************/
  36. })
  37. server.listen(port)
  38. console.log('监听 ' + port + ' 成功\n请用在空中转体720度然后用电饭煲打开 http://localhost:' + port)

使用 node-dev server.js 8888启动

用AJAX加载CSS

四个步骤:
image.png

  1. getCSS.onclick = ()=>{
  2. const request = new XMLHttpRequest()
  3. request.open('GET', '/style.css')
  4. request.onload = ()=>{
  5. console.log('成功了')
  6. console.log('request.response')
  7. console.log(request.response)
  8. // 创建 style 标签
  9. const style = document.createElement('style')
  10. // 填写 style 内容
  11. style.innerHTML = request.response
  12. // 查到头里面
  13. document.head.appendChild(style)
  14. }
  15. request.onerror = ()=>{
  16. console.log('失败了')
  17. }
  18. request.send()
  19. }

用AJAX加载JS

  1. getJS.onclick = () => {
  2. const request = new XMLHttpRequest()
  3. request.open('GET', '/2.js')
  4. request.onload = () => {
  5. // 创建 script 标签
  6. const script = document.createElement('script')
  7. // 填写 script 标签
  8. script.innerHTML = request.response
  9. // 插到 body 里
  10. document.body.appendChild(script)
  11. }
  12. request.onerror = () => {}
  13. request.send()
  14. }

用AJAX加载HTML

  1. getHTML.onclick = () => {
  2. const request = new XMLHttpRequest()
  3. request.open('GET', '/3.html')
  4. request.onload = () => {
  5. const div = document.createElement('div')
  6. div.innerHTML = request.response
  7. document.body.appendChild(div)
  8. }
  9. request.onerror = () => {}
  10. request.send()
  11. }

使用 onreadystatechang 代替 onload onerror

getCSS.onclick = () => {
  const request = new XMLHttpRequest()
  request.open('GET', '/style.css')

  request.onreadystatechange = () => {
    if (request.readyState === 4) {
      if (request.status >= 200 && request.status <= 300) {
        // 创建 style 标签
        const style = document.createElement('style')
        // 填写 style 内容
        style.innerHTML = request.response
        // 查到头里面
        document.head.appendChild(style)
      } else {
        alert(('加载 CSS 失败'))
      }
    }
  }
  request.send()
}

用AJAX加载XML

getXML.onclick = ()=>{
  const request = new XMLHttpRequest()
  request.open('GET', '/4.xml')
  request.onreadystatechange = ()=>{
    if(request.readyState === 4){
      const dom = request.responseXML
      const text = dom.getElementsByTagName('warning')[0].textContent
      console.log(text.trim())
    }
  }
  request.send()
}