zoukankan      html  css  js  c++  java
  • xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

    1.html 文件 ( form.html)

     1 <!DOCTYPE HTML>
     2 <html>
     3 <head>
     4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
     5 <title>Demo</title>
     6 <style>
     7 body, input, select, button, h1 {
     8     font-size: 16px;
     9     line-height:1.7;
    10 }
    11 </style>    
    12 </head>
    13 
    14 <body>
    15 
    16 <h1>员工查询</h1>
    17 
    18 <label>请输入员工编号:</label>
    19 <input type="text" id="keyword" />
    20 <button id="search">查询</button>
    21 <p id="searchResult"></p>
    22 
    23 <h1>员工新建</h1>
    24 <label>请输入员工姓名:</label>
    25 <input type="text" id="staffName" /><br>
    26 <label>请输入员工编号:</label>
    27 <input type="text" id="staffNumber" /><br>
    28 <label>请选择员工性别:</label>
    29 <select id="staffSex">
    30 <option></option>
    31 <option></option>
    32 </select><br>
    33 <label>请输入员工职位:</label>
    34 <input type="text" id="staffJob" /><br>
    35 <button id="save">保存</button>
    36 <p id="createResult"></p>
    37 
    38 <script>
    39 document.getElementById("search").onclick = function() { 
    40     var request = new XMLHttpRequest();
    41     request.open("GET", "server.php?number=" + document.getElementById("keyword").value);
    42     request.send();
    43     request.onreadystatechange = function() {
    44         if (request.readyState===4) {
    45             if (request.status===200) { 
    46                 document.getElementById("searchResult").innerHTML = request.responseText;
    47             } else {
    48                 alert("发生错误:" + request.status);
    49             }
    50         } 
    51     }
    52 }
    53 
    54 document.getElementById("save").onclick = function() { 
    55     var request = new XMLHttpRequest();
    56     request.open("POST", "server.php");
    57     var data = "name=" + document.getElementById("staffName").value 
    58                       + "&number=" + document.getElementById("staffNumber").value 
    59                       + "&sex=" + document.getElementById("staffSex").value 
    60                       + "&job=" + document.getElementById("staffJob").value;
    61     request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    62     request.send(data);
    63     request.onreadystatechange = function() {
    64         if (request.readyState===4) {
    65             if (request.status===200) { 
    66                 document.getElementById("createResult").innerHTML = request.responseText;
    67             } else {
    68                 alert("发生错误:" + request.status);
    69             }
    70         } 
    71     }
    72 }
    73 </script>
    74 </body>
    75 </html>

    2.php 文件(server.php)

     1 <?php
     2 //设置页面内容是html编码格式是utf-8
     3 header("Content-Type: text/plain;charset=utf-8"); 
     4 //header("Content-Type: application/json;charset=utf-8"); 
     5 //header("Content-Type: text/xml;charset=utf-8"); 
     6 //header("Content-Type: text/html;charset=utf-8"); 
     7 //header("Content-Type: application/javascript;charset=utf-8"); 
     8 
     9 //定义一个多维数组,包含员工的信息,每条员工信息为一个数组
    10 $staff = array
    11     (
    12         array("name" => "洪七", "number" => "101", "sex" => "男", "job" => "总经理"),
    13         array("name" => "郭靖", "number" => "102", "sex" => "男", "job" => "开发工程师"),
    14         array("name" => "黄蓉", "number" => "103", "sex" => "女", "job" => "产品经理")
    15     );
    16 
    17 //判断如果是get请求,则进行搜索;如果是POST请求,则进行新建
    18 //$_SERVER是一个超全局变量,在一个脚本的全部作用域中都可用,不用使用global关键字
    19 //$_SERVER["REQUEST_METHOD"]返回访问页面使用的请求方法
    20 if ($_SERVER["REQUEST_METHOD"] == "GET") {
    21     search();
    22 } elseif ($_SERVER["REQUEST_METHOD"] == "POST"){
    23     create();
    24 }
    25 
    26 //通过员工编号搜索员工
    27 function search(){
    28     //检查是否有员工编号的参数
    29     //isset检测变量是否设置;empty判断值为否为空
    30     //超全局变量 $_GET 和 $_POST 用于收集表单数据
    31     if (!isset($_GET["number"]) || empty($_GET["number"])) {
    32         echo "参数错误";
    33         return;
    34     }
    35     //函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
    36     //global 关键词用于访问函数内的全局变量
    37     global $staff;
    38     //获取number参数
    39     $number = $_GET["number"];
    40     $result = "没有找到员工。";
    41     
    42     //遍历$staff多维数组,查找key值为number的员工是否存在,如果存在,则修改返回结果
    43     foreach ($staff as $value) {
    44         if ($value["number"] == $number) {
    45             $result = "找到员工:员工编号:" . $value["number"] . ",员工姓名:" . $value["name"] . 
    46                               ",员工性别:" . $value["sex"] . ",员工职位:" . $value["job"];
    47             break;
    48         }
    49     }
    50     echo $result;
    51 }
    52 
    53 //创建员工
    54 function create(){
    55     //判断信息是否填写完全
    56     if (!isset($_POST["name"]) || empty($_POST["name"])
    57         || !isset($_POST["number"]) || empty($_POST["number"])
    58         || !isset($_POST["sex"]) || empty($_POST["sex"])
    59         || !isset($_POST["job"]) || empty($_POST["job"])) {
    60         echo "参数错误,员工信息填写不全";
    61         return;
    62     }
    63     //TODO: 获取POST表单数据并保存到数据库
    64     
    65     //提示保存成功
    66     echo "员工:" . $_POST["name"] . " 信息保存成功!";
    67 }

    3.

    AJAX不是JavaScript的规范,它只是一个哥们“发明”的缩写:Asynchronous JavaScript and XML,意思就是用JavaScript执行异步网络请求。

    如果仔细观察一个Form的提交,你就会发现,一旦用户点击“Submit”按钮,表单开始提交,浏览器就会刷新页面,然后在新页面里告诉你操作是成功了还是失败了。如果不幸由于网络太慢或者其他原因,就会得到一个404页面。

    这就是Web的运作原理:一次HTTP请求对应一个页面。

    如果要让用户留在当前页面中,同时发出新的HTTP请求,就必须用JavaScript发送这个新请求,接收到数据后,再用JavaScript更新页面,这样一来,用户就感觉自己仍然停留在当前页面,但是数据却可以不断地更新。

    最早大规模使用AJAX的就是Gmail,Gmail的页面在首次加载后,剩下的所有数据都依赖于AJAX来更新。

    用JavaScript写一个完整的AJAX代码并不复杂,但是需要注意:AJAX请求是异步执行的,也就是说,要通过回调函数获得响应。

    在现代浏览器上写AJAX主要依靠XMLHttpRequest对象:

    'use strict';
    

    对于低版本的IE,需要换一个ActiveXObject对象:

    'use strict';
    

    如果你想把标准写法和IE写法混在一起,可以这么写:

    var request;
    if (window.XMLHttpRequest) {
        request = new XMLHttpRequest();
    } else {
        request = new ActiveXObject('Microsoft.XMLHTTP');
    }
    

    通过检测window对象是否有XMLHttpRequest属性来确定浏览器是否支持标准的XMLHttpRequest。注意,不要根据浏览器的navigator.userAgent来检测浏览器是否支持某个JavaScript特性,一是因为这个字符串本身可以伪造,二是通过IE版本判断JavaScript特性将非常复杂。

    当创建了XMLHttpRequest对象后,要先设置onreadystatechange的回调函数。在回调函数中,通常我们只需通过readyState === 4判断请求是否完成,如果已完成,再根据status === 200判断是否是一个成功的响应。

    XMLHttpRequest对象的open()方法有3个参数,第一个参数指定是GET还是POST,第二个参数指定URL地址,第三个参数指定是否使用异步,默认是true,所以不用写。

    注意,千万不要把第三个参数指定为false,否则浏览器将停止响应,直到AJAX请求完成。如果这个请求耗时10秒,那么10秒内你会发现浏览器处于“假死”状态。

    最后调用send()方法才真正发送请求。GET请求不需要参数,POST请求需要把body部分以字符串或者FormData对象传进去。

    安全限制

    上面代码的URL使用的是相对路径。如果你把它改为'http://www.sina.com.cn/',再运行,肯定报错。在Chrome的控制台里,还可以看到错误信息。

    这是因为浏览器的同源策略导致的。默认情况下,JavaScript在发送AJAX请求时,URL的域名必须和当前页面完全一致。

    完全一致的意思是,域名要相同(www.example.comexample.com不同),协议要相同(httphttps不同),端口号要相同(默认是:80端口,它和:8080就不同)。有的浏览器口子松一点,允许端口不同,大多数浏览器都会严格遵守这个限制。

    那是不是用JavaScript无法请求外域(就是其他网站)的URL了呢?方法还是有的,大概有这么几种:

    一是通过Flash插件发送HTTP请求,这种方式可以绕过浏览器的安全限制,但必须安装Flash,并且跟Flash交互。不过Flash用起来麻烦,而且现在用得也越来越少了。

    二是通过在同源域名下架设一个代理服务器来转发,JavaScript负责把请求发送到代理服务器:

    '/proxy?url=http://www.sina.com.cn'
    

    代理服务器再把结果返回,这样就遵守了浏览器的同源策略。这种方式麻烦之处在于需要服务器端额外做开发。

    第三种方式称为JSONP,它有个限制,只能用GET请求,并且要求返回JavaScript。这种方式跨域实际上是利用了浏览器允许跨域引用JavaScript资源:

    <html>
    <head>
        <script src="http://example.com/abc.js"></script>
        ...
    </head>
    <body>
    ...
    </body>
    </html>
    

    JSONP通常以函数调用的形式返回,例如,返回JavaScript内容如下:

    foo('data');
    

    这样一来,我们如果在页面中先准备好foo()函数,然后给页面动态加一个<script>节点,相当于动态读取外域的JavaScript资源,最后就等着接收回调了。

    以163的股票查询URL为例,对于URL:http://api.money.126.net/data/feed/0000001,1399001?callback=refreshPrice,你将得到如下返回:

    refreshPrice({"0000001":{"code": "0000001", ... });
    

    因此我们需要首先在页面中准备好回调函数:

    function refreshPrice(data) {
        var p = document.getElementById('test-jsonp');
        p.innerHTML = '当前价格:' +
            data['0000001'].name +': ' + 
            data['0000001'].price + ';' +
            data['1399001'].name + ': ' +
            data['1399001'].price;
    }
    

    当前价格:

    最后用getPrice()函数触发:

    function getPrice() {
        var
            js = document.createElement('script'),
            head = document.getElementsByTagName('head')[0];
        js.src = 'http://api.money.126.net/data/feed/0000001,1399001?callback=refreshPrice';
        head.appendChild(js);
    }
    

    就完成了跨域加载数据。

    CORS

    如果浏览器支持HTML5,那么就可以一劳永逸地使用新的跨域策略:CORS了。

    CORS全称Cross-Origin Resource Sharing,是HTML5规范定义的如何跨域访问资源。

    了解CORS前,我们先搞明白概念:

    Origin表示本域,也就是浏览器当前页面的域。当JavaScript向外域(如sina.com)发起请求后,浏览器收到响应后,首先检查Access-Control-Allow-Origin是否包含本域,如果是,则此次跨域请求成功,如果不是,则请求失败,JavaScript将无法获取到响应的任何数据。

    用一个图来表示就是:

    js-cors

    假设本域是my.com,外域是sina.com,只要响应头Access-Control-Allow-Originhttp://my.com,或者是*,本次请求就可以成功。

    可见,跨域能否成功,取决于对方服务器是否愿意给你设置一个正确的Access-Control-Allow-Origin,决定权始终在对方手中。

    上面这种跨域请求,称之为“简单请求”。简单请求包括GET、HEAD和POST(POST的Content-Type类型 仅限application/x-www-form-urlencodedmultipart/form-datatext/plain),并且不能出现任何自定义头(例如,X-Custom: 12345),通常能满足90%的需求。

    无论你是否需要用JavaScript通过CORS跨域请求资源,你都要了解CORS的原理。最新的浏览器全面支持HTML5。在引用外域资源时,除了JavaScript和CSS外,都要验证CORS。例如,当你引用了某个第三方CDN上的字体文件时:

    /* CSS */
    @font-face {
      font-family: 'FontAwesome';
      src: url('http://cdn.com/fonts/fontawesome.ttf') format('truetype');
    }
    

    如果该CDN服务商未正确设置Access-Control-Allow-Origin,那么浏览器无法加载字体资源。

    对于PUT、DELETE以及其他类型如application/json的POST请求,在发送AJAX请求之前,浏览器会先发送一个OPTIONS请求(称为preflighted请求)到这个URL上,询问目标服务器是否接受:

    OPTIONS /path/to/resource HTTP/1.1
    Host: bar.com
    Origin: http://my.com
    Access-Control-Request-Method: POST
    

    服务器必须响应并明确指出允许的Method:

    HTTP/1.1 200 OK
    Access-Control-Allow-Origin: http://my.com
    Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS
    Access-Control-Max-Age: 86400
    

    浏览器确认服务器响应的Access-Control-Allow-Methods头确实包含将要发送的AJAX请求的Method,才会继续发送AJAX,否则,抛出一个错误。

    由于以POSTPUT方式传送JSON格式的数据在REST中很常见,所以要跨域正确处理POSTPUT请求,服务器端必须正确响应OPTIONS请求。

    需要深入了解CORS的童鞋请移步W3C文档

    4.

    5.

    6.

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

  • 相关阅读:
    Oracle中有大量的sniped会话
    Error 1130: Host '127.0.0.1' is not allowed to connect to this MySQL server
    汉字转换为拼音以及缩写(javascript)
    高效率随机删除数据(不重复)
    vs2010 舒服背景 优雅字体 配置
    mvc中的ViewData用到webfrom中去
    jquery ajax return值 没有返回 的解决方法
    zShowBox (图片放大展示jquery版 兼容性好)
    动感效果的TAB选项卡 jquery 插件
    loading 加载提示······
  • 原文地址:https://www.cnblogs.com/xgqfrms/p/5317405.html
Copyright © 2011-2022 走看看