博客列表 >跨域请求与DOM知识

跨域请求与DOM知识

王佳祥
王佳祥原创
2020年08月25日 20:41:53765浏览

跨域请求与DOM知识

一、跨域请求

1.跨域是什么?

  • 跨域是跨越不同的域名访问网站资源

  • CORS跨域资源共享

  • CSRF跨站请求伪造

2.同源策略

  • 协议相同

  • 域名相同

  • 端口相同

3.通过ajax跨域访问

  • front.edu域名下的demo1.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>跨域请求</title>
  7. </head>
  8. <body>
  9. <a href="https://www.php.cn">访问php中文网</a>
  10. <img
  11. src="https://img.php.cn/upload/course/000/000/001/5f3de1b5ec627767.png"
  12. alt=""
  13. />
  14. <button>跨域请求CORS</button>
  15. <script>
  16. //获取按钮
  17. var btn = document.querySelector("button");
  18. //监听事件
  19. btn.addEventListener("click", getData, false);
  20. //1.创建ajax对象
  21. var xhr = new XMLHttpRequest();
  22. function getData() {
  23. //2.监听请求
  24. xhr.addEventListener("readystatechange", getCORS, false);
  25. //3.配置参数
  26. xhr.open("get", "http://phpio/test1.php", true);
  27. //4.发送请求
  28. xhr.send(null);
  29. }
  30. function getCORS() {
  31. if (xhr.readyState === 4 && xhr.status === 200) {
  32. console.log(xhr.responseText);
  33. var h2 = document.createElement("h2");
  34. h2.innerText = xhr.responseText;
  35. var body = document.querySelector("body");
  36. body.appendChild(h2);
  37. }
  38. }
  39. </script>
  40. </body>
  41. </html>
  • phpio域名下的test1.php文件
  1. <?php
  2. header('Access-Control-Allow-Origin:http://front.edu');
  3. //把资源开放给所有请求
  4. //header('Access-Control-Allow-Origin:*');
  5. //允许带着cookie发起请求
  6. //header('Access-Control-Allow-Origin:true');
  7. echo '跨域脚本返回的数据';
  8. //冲刷缓存
  9. flush();


4.通过JSONP跨域访问

  • front.edu下的demo3.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>跨域请求jsonp</title>
  7. </head>
  8. <body>
  9. <button>跨域请求-JSONP</button>
  10. </body>
  11. <script>
  12. function handle(data) {
  13. console.log(data);
  14. var p = document.createElement("p");
  15. var obj = JSON.parse(data);
  16. console.log(obj);
  17. p.innerHTML += "<p>" + obj.title + "</p>";
  18. p.innerHTML += "<p>" + obj.user.name + "</p>";
  19. p.innerHTML += "<p>" + obj.user.email + "</p>";
  20. document.body.appendChild(p);
  21. }
  22. var btn = document.querySelector("button");
  23. btn.addEventListener("click", function () {
  24. //动态生成script标签,发起jsonp请求
  25. var script = document.createElement("script");
  26. //url中的最后一个键值对,必须是一个回调
  27. script.src = "http://phpio/test2.php?id=1&jsonp=handle";
  28. document.head.appendChild(script);
  29. });
  30. </script>
  31. </html>
  • phpio域名下的test2.php
  1. <?php
  2. header('content-type:text/html;charset=utf-8');
  3. $id = $_GET['id'];
  4. //前端的回调函数的名称
  5. $callback = $_GET['jsonp'];
  6. //模拟接口数据,根据查询条件返回不同的值
  7. $users = [
  8. 0=>'{"name":"孙悟空","email":"wukong@php.cn"}',
  9. 1=>'{"name":"天蓬元帅","email":"tianpeng@php.cn"}',
  10. 2=>'{"name":"卷帘大将","email":"juanlian@php.cn"}'
  11. ];
  12. if(array_key_exists(($id-1),$users)){
  13. //查询结果保存到变量$user中
  14. $user = $users[$id-1];
  15. }
  16. //返回前端给回调的参数是一个json格式的数据
  17. $json = '{
  18. "title":"用户信息",
  19. "user":'.$user.'
  20. }';
  21. echo $callback.'('. json_encode($json) .')';


二、CSS样式的添加、移除、替换

1.添加样式

  • className()

  • classList.add()

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>classList对象</title>
  7. <style>
  8. .red {
  9. color: red;
  10. }
  11. .bgc {
  12. background: yellow;
  13. }
  14. .blue {
  15. color: blue;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <p class="red">大家晚上好!</p>
  21. <h3>classList对象</h3>
  22. <script>
  23. //classList操作class中的内容
  24. var h3 = document.querySelector("h3");
  25. //h3.className = "red";
  26. //h3.className = "red bgc";
  27. //添加样式
  28. h3.classList.add("red");
  29. h3.classList.add("bgc");
  30. </script>
  31. </body>
  32. </html>


2.移除样式

  • classList.remove()
  • h3.classList.remove("red");


3.切换样式

  • classList.toggle()如果没有就加上,如果已有就去除

  • h3.classList.toggle("red");



4.替换样式

  • classList.replace("","")

  • h3.classList.replace("red", "blue");



三、自定义数据属性

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>自定义数据属性</title>
  7. </head>
  8. <body>
  9. <div id="user" data-id="1" data-user-name="peter" data-email="peter@php.cn">
  10. 用户信息
  11. </div>
  12. <script>
  13. //dataset对象用于获取自定义属性的内容
  14. //自定义数据类型必须以data-为前缀
  15. var user = document.getElementById("user");
  16. //dataset获取data-的数据属性时,必须省略data-
  17. console.log(user.dataset.id);
  18. console.log(user.dataset.userName);
  19. console.log(user.dataset.email);
  20. </script>
  21. </body>
  22. </html>


四、事件派发

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>事件</title>
  7. <style>
  8. button {
  9. color: red;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <button>点击领红包</button>
  15. <script>
  16. //获取按钮
  17. var btn = document.querySelector("button");
  18. //事件监听
  19. btn.addEventListener("click", function () {
  20. alert("恭喜成功领取1元");
  21. });
  22. //事件派发
  23. //var event = new Event("click");
  24. //btn.dispatchEvent(event);
  25. //定时器
  26. /* setTimeout(function () {
  27. var event = new Event("click");
  28. btn.dispatchEvent(event);
  29. }, 1000); */
  30. setInterval(function () {
  31. var event = new Event("click");
  32. btn.dispatchEvent(event);
  33. }, 1000);
  34. </script>
  35. </body>
  36. </html>


五、事件冒泡

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>事件冒泡</title>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>item1</li>
  11. <li>item2</li>
  12. <li>item3</li>
  13. <li>item4</li>
  14. <li>item5</li>
  15. </ul>
  16. </body>
  17. <script>
  18. /* var lis = document.querySelectorAll("li");
  19. for (var i = 0; i < lis.length; i++) {
  20. lis[i].addEventListener("click", function (ev) {
  21. console.log(ev.target.innerText);
  22. });
  23. } */
  24. //给ul添加点击事件
  25. var ul = document
  26. .querySelector("ul")
  27. .addEventListener("click", function (ev) {
  28. //ev.targrt触发事件的元素
  29. console.log(ev.target);
  30. //ev.currentTarget绑定事件的元素
  31. console.log(ev.currentTarget);
  32. });
  33. //根元素
  34. /* var body = document
  35. .querySelector("body")
  36. .addEventListener("click", function (ev) {
  37. console.log(ev.currentTarget);
  38. }); */
  39. //根据事件冒泡的原理,当前子元素的事件,必然会冒泡到父级上的同名事件
  40. //此时,只需要给所有的li的父级ul添加点击事件就可以
  41. </script>
  42. </html>


六、学习总结

1.跨域请求的两种方式:

  • 1.通过ajax访问,设置header('Access-Control-Allow-Origin:*');开放请求资源

  • 2.通过JSONP访问,设置script的src为请求文件名,并在文件名后添加get键值对参数,最后一个键值对为回调方法

2. CSS样式添加、移除、切换、替换:

  • classList.add()添加样式 或者 className()

  • classList.remove()移除样式

  • classList.toggle() 切换样式,如果已有该样式,则去除该样式,没有则添加该样式

  • classList.replace("原来样式","替换样式") 替换样式

3.自定义数据属性

  • 通过添加data-前缀来自定义属性名称和值

  • dataset对象用于获取自定义属性的内容

  • dataset获取data-的数据属性时,必须省略data-

4.事件派发

  • 创建一个事件派发对象 var event = new Event('click')

  • 派发事件: dispatchEvent(event);

5.事件冒泡

  • 给父元素添加事件,通过ev.target来获取触发事件的元素,ev.currentTarget获取绑定事件的父元素
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议