AJAX跨域封装及JS以POST方式提交数据跳转页面

跨域原因
浏览器的同源策略 : 域名不同,协议不同,端口不同,是无法访问的
不同源地址之间如果需要相互请求,必须服务端和客户端配合使用
跨域的原理
jsonp 通过script 标签请求一个服务器 php文件
这个文件返回的结果是一段js,作用是调用我们事先定义好的函数
========================封装jsonp原理========================
封装jsonp原理:
客户端:

      function jsonp (url, params, callback) {
              var funcName = 'jsonp_' + Date.now() + Math.random().toString().substr(2, 5)
              if (typeof params === 'object') {
                var tempArr = []
                for (var key in params) {
                  var value = params[key]
                  tempArr.push(key + '=' + value)
                }
                params = tempArr.join('&')
              }

              var script = document.createElement('script')
              script.src = url + '?' + params + '&callback=' + funcName
              document.body.appendChild(script)

              window[funcName] = function (data) {
                callback(data)

                delete window[funcName]
                document.body.removeChild(script)
              }
            }

方法调用:

jsonp('http://localhost/jsonp/server.php', { id: 123 }, function (res) {
              console.log(res)
        })

PHP控制器端:

if (empty($_GET['callback'])) {
          header('Content-Type: application/json');
          echo json_encode($data);
          exit();
  }
        // 如果客户端采用的是 script 标记对我发送的请求
        // 一定要返回一段 JavaScript
        header('Content-Type: application/javascript');
        $result = json_encode($data);
                    $callback_name =$_GET['callback'];
                    echo "typeof {$callback_name} === 'function' && {$callback_name}({$result})";

==========================Jquery跨域请求使用=====================
Jquery跨域请求使用 CORS

$.ajax({          
        url:'http://localhost/jsonp/server.php'                                                                          
        dataType:'jsonp', 
        success:function(res){
            console.log(res);
        }
    })

PHP控制器端需要加请求头声明

    header('Access-Control-Allow-Origin:*')  # *通配符  可以指定域名跨域
    header('Cenntent-Type:application/javascript') #设置返回的数据

==========================js发送post请求跳转页面=====================
因为get方式提交数据都会显示在URL中,一个是安全问题,另外一个是URL长度限制,URL长度约为2083。所以数据量过多时会导致数据丢失。

/*
       *功能: JS跳转页面,并已POST方式提交数据
       *参数: URL 跳转地址 PARAMTERS 参数
       *返回值: 
       */

       function ShowReport_Click() {
           var parames = new Array();
           //添加参数
           parames.push({ name: "param1", value: "param1"});
           parames.push({ name: "param2", value: "param2"});
           Post("www.baidu.com", parames);
           return false;
       }

       /*
       *功能: 模拟form表单的提交
       *参数: URL 跳转地址 PARAMTERS 参数
       *返回值:
       */
       function Post(URL, PARAMTERS) {
           //创建form表单
           var temp_form = document.createElement("form");
           temp_form.action = URL;
           //如需打开新窗口,form的target属性要设置为'_blank'
           temp_form.target = "_self";
           temp_form.method = "post";
           temp_form.style.display = "none";
           //添加参数
           for (var item in PARAMTERS) {
               var opt = document.createElement("textarea");
               opt.name = PARAMTERS[item].name;
               opt.value = PARAMTERS[item].value;
               temp_form.appendChild(opt);
           }
           document.body.appendChild(temp_form);
           //提交数据
           temp_form.submit();
       }
       
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 28,145评论 1 45
  • 转载自:https://segmentfault.com/a/1190000007326671bo 前端跨域整理 ...
    天字一等阅读 3,335评论 0 3
  • JavaScript是一种在Web开发中经常使用的前端动态脚本技术。在JavaScript中,有一个很重要的...
    西瓜w阅读 5,766评论 0 1
  • 第十五章 未来家让我们先去找国王,说:“必须得经过国王同意才能让你们回去。”我们道了谢,开始找国王。 我们问了好多...
    帅云吞1阅读 936评论 0 0
  • 不知道这是不是一种轮回,又或者是种迷信,欠下的,总有一天,会以不同的方式来还回去;大一,大二,大三,所浪费的时...
    李不言阅读 4,761评论 0 1