Blogger Information
Blog 55
fans 3
comment 0
visits 54658
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
跨域请求与DOM知识
王佳祥
Original
775 people have browsed it

跨域请求与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获取绑定事件的父元素
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:边学边总结 ,克服遗忘
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post