AJAX跨域封裝及JS以POST方式提交數(shù)據(jù)跳轉(zhuǎn)頁面

跨域原因
瀏覽器的同源策略 : 域名不同,協(xié)議不同,端口不同,是無法訪問的
不同源地址之間如果需要相互請求,必須服務(wù)端和客戶端配合使用
跨域的原理
jsonp 通過script 標簽請求一個服務(wù)器 php文件
這個文件返回的結(jié)果是一段js,作用是調(diào)用我們事先定義好的函數(shù)
========================封裝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)
              }
            }

方法調(diào)用:

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 標記對我發(fā)送的請求
        // 一定要返回一段 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') #設(shè)置返回的數(shù)據(jù)

==========================js發(fā)送post請求跳轉(zhuǎn)頁面=====================
因為get方式提交數(shù)據(jù)都會顯示在URL中,一個是安全問題,另外一個是URL長度限制,URL長度約為2083。所以數(shù)據(jù)量過多時會導(dǎo)致數(shù)據(jù)丟失。

/*
       *功能: JS跳轉(zhuǎn)頁面,并已POST方式提交數(shù)據(jù)
       *參數(shù): URL 跳轉(zhuǎn)地址 PARAMTERS 參數(shù)
       *返回值: 
       */

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

       /*
       *功能: 模擬form表單的提交
       *參數(shù): URL 跳轉(zhuǎn)地址 PARAMTERS 參數(shù)
       *返回值:
       */
       function Post(URL, PARAMTERS) {
           //創(chuàng)建form表單
           var temp_form = document.createElement("form");
           temp_form.action = URL;
           //如需打開新窗口,form的target屬性要設(shè)置為'_blank'
           temp_form.target = "_self";
           temp_form.method = "post";
           temp_form.style.display = "none";
           //添加參數(shù)
           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);
           //提交數(shù)據(jù)
           temp_form.submit();
       }
       
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標準。 注意:講述HT...
    kismetajun閱讀 28,829評論 1 45
  • 轉(zhuǎn)載自:https://segmentfault.com/a/1190000007326671bo 前端跨域整理 ...
    天字一等閱讀 524評論 0 3
  • JavaScript是一種在Web開發(fā)中經(jīng)常使用的前端動態(tài)腳本技術(shù)。在JavaScript中,有一個很重要的...
    西瓜w閱讀 1,922評論 0 1
  • 第十五章 未來家讓我們先去找國王,說:“必須得經(jīng)過國王同意才能讓你們回去。”我們道了謝,開始找國王。 我們問了好多...
    帥云吞1閱讀 155評論 0 0
  • 不知道這是不是一種輪回,又或者是種迷信,欠下的,總有一天,會以不同的方式來還回去;大一,大二,大三,所浪費的時...
    李不言閱讀 1,171評論 0 1

友情鏈接更多精彩內(nèi)容