经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
WEB前端第六十二课——自封装Ajax、跨域、分页
来源:cnblogs  作者:后来喵  时间:2021/2/18 15:43:35  对本文有异议

1.Ajax封装方法

  自封装Ajax请求文件,其实就是将原生的Ajax的请求代码抽象为一个函数,

  然后单独生成一个js文件保存,用到Ajax的时候引入文件,调用函数的过程。

  封装Ajax大致步骤如下:

    ⑴ 提供创建xhr对象的兼容性函数

    ⑵ 提供发送请求的对外接口

    ⑶ 设计并约定对外接口的参数规格

    ⑷ 实现对外接口中参数处理

    ⑸ 实现对外接口中相应处理

    ⑹ 实现对外接口中发送处理

    ⑺ 设置命名空间,避免全局变量污染

2.Ajax封装实现

  代码示例:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>自封装Ajax测试</title>
  6. <script src="privyAjaxUnit.js"></script>
  7. </head>
  8. <body>
  9. <button>发送测试</button>
  10. <script>
  11. var btn=document.querySelector('button');
  12. btn.onclick=function () {
  13. myAjax({
  14. type:'post',
  15. url:'privyAjax.php',
  16. data:{
  17. uName:'Rebecca',
  18. uCode:'111111'
  19. },
  20. success:function (res) {
  21. console.log(res);
  22. }
  23. });
  24. }
  25. </script>
  26. </body>
  27. </html>
  1. //模拟jQ中的Ajax创建myAjax方法,
  2. function myAjax(paramsObj) {
  3. //判断参数对象中的请求方式,请求方式为“get”时
  4. if (paramsObj.type.toLowerCase()=='get'){
  5. var arr=[];
  6. for (var ki in paramsObj.data){
  7. //paramsObj.data为对象类型数据,通过for in方法将其转为数组
  8. var str=ki+'='+paramsObj.data[ki];
  9. arr.push(str);
  10. }
  11. // 由于get方法传参需要是字符串格式,通过join方法将数组转为字符串,并使用“&”拼接。
  12. var paramStr=arr.join('&');
  13.  
  14. // 将字符串格式的参数拼接到“url”,但拼接之前有必要判断一下调用Ajax时,
  15. // url是否已有部分参数或传参符号“?”,通过三目运算使用indexof方法遍历查找“?”。
  16. paramsObj.url+=paramsObj.url.indexOf('?')==-1?'?'+paramStr:'&'+paramStr;
  17.  
  18. // 判断参数对象中的请求方式,请求方式为“post”时
  19. }else if (paramsObj.type.toLowerCase()=='post'){
  20. var formData=new FormData();
  21. for (var ki in paramsObj.data){
  22. formData.append(ki,paramsObj.data[ki]);
  23. }
  24. }else{
  25. console.log('无该种请求方式!')
  26. }
  27. // 创建xhr对象
  28. var xhr=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('');
  29. xhr.onreadystatechange=function () {
  30. if (xhr.readyState==4){
  31. if (xhr.status==200){
  32. //调用回调函数,并将后台返回的数据解析后传参。
  33. paramsObj.success(JSON.parse(xhr.responseText));
  34. }
  35. }
  36. }
  37. // 准备发送请求
  38. xhr.open(paramsObj.type, paramsObj.url, true);
  39. // 发送请求
  40. if (paramsObj.type.toLowerCase()=='get'){
  41. xhr.send(null);
  42. }else if (paramsObj.type.toLowerCase()=='post'){
  43. xhr.send(formData);
  44. }else {
  45. console.log('无该种请求方式,请求发送失败!')
  46. }
  47. }
  48. /*自封装Ajax函数的创建过程,本质就是以参数化的形式实现原生Ajax请求,
  49. 上述代码中从第4行到第26行,都是为了判断请求方式,进而根据不同的请求方式生成“url”或“ForMData”*/
  50.  
  51. //myAjax方法创建完成后,可以将其封装到“(function(){}())”这个自执行函数中,
  52. /*(function (){
  53. function myAjax(paramsObj) {...}
  54. // 可以将创建好的myAjax方法绑定到“window”对象,通过window调用
  55. window.myAjax=myAjax;
  56. }());*/
  1. <?php
  2. $suc=array('msg'=>'ok');
  3. if($_POST){
  4. $suc['info']=$_POST;
  5. }else if($_GET){
  6. $suc['info']=$_GET;
  7. }else{
  8. $suc['info']='无此种请求方式';
  9. };
  10. echo json_encode($suc);
  11. ?>

3.跨域

  所谓跨域,是指前台访问路径不符合同源政策时即为跨域。

  同源政策,是两个路径是否在同一台服务器下的判断标准。

  判断标准,三要素(网络协议、主域名或IP、端口号)相同则视为同一台服务器,否则反之。

  Ajax不能发送跨域请求,出现跨域时会报错。

  解决Ajax跨域问题两种常用方法:

    ⑴ 通过后台请求跨域文件解决,后台不存在跨域问题;

      PHP中访问跨域url路径,使用“file_get_contents('跨域url')”方法

      后台获取跨域文件后,前台再使用Ajax方法获取后台数据

    ⑵ 使用“jsonp”通过前台解决。

      jsonp解决方案不使用Ajax方法,而是使用其它既具有前后台交互、请求异步以及

      链接PHP后台这三个核心功能,又可以访问外部文件的标签替代Ajax。

       <script>标签满足上述条件,但需要后台配合实现跨域请求。

    代码示例:

  1. <html lang="en">
  2. <head>
  3. <meta charset="UTF-8">
  4. <title>跨域请求</title>
  5. </head>
  6. <body>
  7. <button onclick="creatScript()">跨域请求</button>
  8. <script>
  9. // 第一种方式:通过创建script元素发送请求
  10. /*function creatScript() {
  11. var script=document.createElement('script');
  12. script.src='crossServ.php';
  13. document.body.appendChild(script);
  14. script.onload=function(){
  15. this.remove();
  16. }
  17. }*/
  18. function cross(res) {
  19. console.log(res);
  20. }
  21. </script>
  22. <!-- 第二种方式:直接在<script>标签中定义 src 属性值 -->
  23. <!-- 为确保后台返回数据时调用的方法与前台定义方法一致,在发送请求时可将方法名一并发送 -->
  24. <script src="crossServ.php?callback=cross"></script>
  25. </body>
  26. </html>
  1. <?php
  2. // 通过前台 callback 参数接收方法名。
  3. $fn=isset($_GET['callback'])?$_GET['callback']:'cross';
  4. $info=file_get_contents('http://blog.sina.com.cn');
  5. $info=json_encode($info);
  6. echo "{$fn}({$info})";
  7. ?>

4.分页案例

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>multi-pages</title>
  6. <script src="../JScodeFile/jquery-1.8.3.js"></script>
  7. <style>
  8. .contentUl{
  9. width: 600px;
  10. margin: 50px auto;
  11. }
  12. .contentUl li{
  13. }
  14. .btnContainer{
  15. height: 30px;
  16. margin: 20px auto;
  17. }
  18. .btnContainer span{
  19. border: 1px solid grey;
  20. box-shadow: 0 1px 2px #0f6674;
  21. margin: 0 3px;
  22. padding: 0 5px;
  23. cursor: pointer;
  24. }
  25. .btnContainer span.active{
  26. border: none;
  27. box-shadow: none;
  28. color: orangered;
  29. font-weight: bold;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <ul class="contentUl" id="contentUl"></ul>
  35. <div class="btnContainer"></div>
  36. <script>
  37. var contentUl=document.querySelector('#contentUl');
  38. var btnContainer=document.querySelector('.btnContainer');
  39. $.get('multiPages.php',function (data) {
  40. var content=JSON.parse(data); //获取后台数据
  41. // 定义页码索引
  42. var rows=5;
  43. var rowsNum=content.length;
  44. var pagesNum=Math.ceil(content.length/rows);
  45. var activePageNum=1; //默认加载第一页。
  46.  
  47. //创建分页索引
  48. $('<span>上一页</span>').appendTo(btnContainer);
  49. for (var j=1;j<=pagesNum;j++){
  50. $('<span>'+j+'</span>').appendTo(btnContainer);
  51. }
  52. $('<span>下一页</span>').appendTo(btnContainer);
  53. $('.btnContainer span').eq(1).addClass('active');
  54.  
  55. // 定义分页内容
  56. function turnPage(activePageNum){
  57. var rowsIndex=rows*activePageNum;
  58. if (rowsIndex>rowsNum){
  59. rowsIndex=rowsNum;
  60. }
  61. //每次生成页面内容前对列表进行清空操作,否则会造成内容累加!
  62. $('#contentUl').empty(); //empty()为jQ方法,JS变量无法调用
  63. for (var i=rows*(activePageNum-1);i<rowsIndex;i++){
  64. $('<li>'+content[i]["author"]+':<br>'+content[i]["summary"]+'<li>').appendTo(contentUl);
  65. }
  66. }
  67. turnPage(activePageNum)
  68. //定义分页敲击事件
  69. $('.btnContainer span').click(function () {
  70.  
  71. var clickPageNum=$(this).html();
  72. if (clickPageNum=='上一页'){
  73. activePageNum--;
  74. if (activePageNum<1){
  75. activePageNum=1;
  76. return;
  77. }
  78. }else if (clickPageNum=='下一页'){
  79. activePageNum++;
  80. if (activePageNum>pagesNum){
  81. activePageNum=pagesNum;
  82. return;
  83. }
  84. }else {
  85. activePageNum=clickPageNum;
  86. }
  87. //点击翻页时清除其他兄弟元素的“active”属性。
  88. $('.btnContainer span').eq(activePageNum).addClass('active').siblings().removeClass('active');
  89. turnPage(activePageNum);
  90. });
  91. });
  92. </script>
  93. </body>
  94. </html>
  1. <?php
  2. $dbBase=new PDO('mysql:host=localhost;dbname=dbTest;charset=utf8','root','');
  3. $res=$dbBase->query('select * from news where 1');
  4. if($res){
  5. $data=$res->fetchAll(PDO::FETCH_ASSOC);
  6. echo json_encode($data);
  7. }else{
  8. echo '没有数据!';
  9. }
  10. ?>

  

  

  

原文链接:http://www.cnblogs.com/husa/p/14332127.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号