登录  /  注册
博主信息
博文 55
粉丝 3
评论 0
访问量 66876
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
跨域请求与DOM知识
王佳祥
原创
901人浏览过

跨域请求与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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学