作者: admin

  • 推荐看php header 跨域

    js跨域方式无非就是使用jsonp,这种方法很大众,还有一种方式也可以,那就是在服务器端设置允许任何访问
    php中代码为:

    根域相同 的情况下,去 请求 不同的子域      例如:v1.a.com 和 v2.a.com的跨域

     

    在服务器端添加头部信息

    header("Access-Control-Allow-Origin:*");   //可以使用,但是不安全
    header( 'Access-Control-Allow-Origin:http://A.abc.com' );  //给指定的域名跨域请求

     

    跨过去以后,我还得操作Cookie,所以继续添加头部信息

    // 允许携带 用户认证凭据(也就是允许客户端发送的请求携带Cookie)

    header( 'Access-Control-Allow-Credentials:true' );

     

     

    客服端需要设置JS,需要将 XMLHttpRequest 对象的 withCredentials 属性设置为 true,JQuery1.5.1+ 提供了相应的字段,使用方式如下:

    $.ajax({ 
      url:"B. abc.com ", 
      xhrFields:{ 
        withCredentials:true 
      },
      crossDomain:true
    });

     

    这样,你会在 B 端发现:哦也~ 收到 Cookie 了。

    设置 withCredentials 为 true 的请求中会包含 A 端的所有Cookie,这些Cookie仍然遵循同源策略,所以,你只能访问其中和 B 端同根域的Cookie,而无法访问其他域的Cookie。

    总结一下就是:

    要想跨域,你得有后台(需要服务器端配合)。

    BTW:Firefox,发现你和Chrome的表现不一致的情况还真不多。Firefox中不要在同步模式(async:false)下传递Cookie哦~

     

    以下demo包演示了跨域的情况下,客户端传值给服务器,同时从服务器请求数据实现了客户端和服务端的跨域双向数据访问

    demo下载:http://pan.baidu.com/s/1qXpNXfu

    http://share.weiyun.com/615ec54bf7851a0b9770ed5e021b303a

    https://sdeno.com/wp-content/uploads/2016/02/php_demo.rar

    以上demo参考:http://www.blogjava.net/pengo/archive/2013/01/11/394103.html

    http://www.tuicool.com/articles/zEjA7b

     

    关于跨域header请看:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

  • 浅谈WEB跨域的实现(前端向)

    同源策略/SOP(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击(可以参考我的这篇文章)。

    SOP要求两个通讯地址的协议域名端口号必须相同,否则两个地址的通讯将被浏览器视为不安全的,并被block下来。比如“http页面”和“https页面”属于不同协议;“qq.com”、“www.qq.com”、“a.qq.com”都属于不同域名(或主机);“a.com”和“a.com:8000”属于不同端口号。这三种情况常规都是无法直接进行通讯的。

    我们很容易模拟不同源的环境,用iframe来帮忙即可:

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>模拟跨域</title>
    </head>
    <body>
    <iframe src="http://baidu.com"></iframe>
    <script>
        window.frames[0].onload = function () {
            alert("1");
        }
    </script>
    </body>
    </html>
    复制代码

    上述代码在chrome中会输出blocking信息:

    即我们无法监听百度首页文档onload的事件,因为top窗口跟iframe窗体是不同源的。

    现代浏览器的确在安全性上下了不少功夫,除了上述提到的默认禁止非同源页面通讯,还新增了CSP(Content Security Policy)报头特性等安全限制功能。不过既然为了用户安全而关闭了一扇窗户,自然也会为开发者开启一扇便利的窗户,要突破SOP的限制,咱还是有不少办法和花样的。

    目录

    CORS

    XDR

    HTML5解决方案
    1. Cross-document messaging
    2. WebSocket

    JSONP

    iframe形式
    1. document.domain
    2. location.hash
    3. window.name

    其它形式
    1. 服务器代理
    2. flash socket

    CORS

    同域安全策略CORS(Cross-Origin Resource Sharing)是W3C在05年提出的跨域资源请求机制,它要求当前域(常规为存放资源的服务器)在响应报头添加Access-Control-Allow-Origin标签,从而允许指定域的站点访问当前域上的资源。我们使用node/iojs来模拟一下(不懂node/iojs?不急,先看下我的入门文章):

    服务器端:

    复制代码
    require("http").createServer(function(req,res){
      //报头添加Access-Control-Allow-Origin标签,值为特定的URL或“*”
      //“*”表示允许所有域访问当前域
      res.setHeader("Access-Control-Allow-Origin","*");  
      res.end("OK");
    }).listen(1234);
    复制代码

    客户端:

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>CORS</title>
        <script src="jq.js"></script>
    </head>
    <body>
    <div>catching data...</div>
    <script>
        $.ajax({
            url:"http://127.0.0.1:1234/",
            success:function(data){
                $("div").text(data)
            }
        })
    </script>
    </body>
    </html>
    复制代码

    运行客户端页面后,便能看到div内容成功变为服务端发来的“OK”,实现了两个不同域的页面间的通讯。通过上述代码我们也发现,CORS主要是在服务端上的实现(也不外乎是添加一个报头标签),客户端的实现跟常规的请求没啥出入。

    不过CORS默认只支持GET/POST这两种http请求类型,如果要开启PUT/DELETE之类的方式,需要在服务端在添加一个”Access-Control-Allow-Methods”报头标签:

    服务端:

    复制代码
    require("http").createServer(function(req,res){
      res.setHeader("Access-Control-Allow-Origin","http://127.0.0.1");
      res.setHeader(
        "Access-Control-Allow-Methods",
        "PUT, GET, POST, DELETE, HEAD, PATCH"
      );
      res.end(req.method+" "+req.url);
    }).listen(1234);
    复制代码

    XDR

    恼人的IE8-是不支持上述的CORS滴,不过不走寻常路的巨硬在IE8开始引入了XDR(XDomainRequest)新特性(IE11已经不再支持该特性),它实现了CORS的部分规范,只支持GET/POST形式的请求。另外在协议部分只支持 http 和 https 。

    在服务器端,依旧要求在响应报头添加”Access-Control-Allow-Methods”标签(这点跟CORS一致)。

    在客户端,DR对象的使用方法与XHR对象非常相似,也是创建一个XDomainRequest的实例,调用open()方法,再调用send()方法。但与XHR对象的open()方法不同,XDR对象的open()方法只接收两个参数:请求的类型和URL,因为所有XDR请求都是异步执行的,不能用它来创建同步请求。

    请求返回之后,会触发load事件,相应的数据也会保存在responseText属性中,如下所示:

    复制代码
    var xdr = new XDomainRequest();
    xdr.onload = function() {
        alert(xdr.responseText);
    };
    xdr.onerror = function() {
        alert("一个错误发生了!");
    };
    xdr.open("get", "http://127.0.0.1:1234/");
    xdr.send(null);
    复制代码

    由于XDR实在太过时,这里不做太多介绍,了解下即可,更多细节请查阅msdn

    HTML5解决方案

    1. Cross-document messaging

    在 Cross-document messaging 中,我们可以使用 postMessage 方法和 onmessage 事件来实现不同域之间的通信,其中postMessage用于实时向接收信息的页面发送消息,其语法为:

      otherWindow.postMessage(message, targetOrigin);

    otherWindow: 对接收信息页面的window的引用。可以是页面中iframe的contentWindow属性;window.open的返回值;通过name或下标从window.frames取到的值。
    message: 所要发送的数据,string类型。
    targetOrigin: 允许通信的域的url,“*”表示不作限制。

    我们可以在父页面中嵌入不同域的子页面(iframe实现,而且常规会把它隐藏掉),在子页面调用 postMessage 方法向父页面发送数据:

    父页面(http://localhost:10847/sop/a.html):

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>postMessage</title>
    </head>
    <body>
    <iframe style="display:none;" id="ifr" src="http://127.0.0.1:10847/sop/b.html"></iframe>
    <script type="text/javascript">
        window.addEventListener('message', function(event){
            // 通过origin属性判断消息来源地址
            if (event.origin == 'http://127.0.0.1:10847') {
                alert(event.data);    // 弹出从子页面post过来的信息
            }
        }, false);
    </script>
    </body>
    </html>
    复制代码

    子页面(http://127.0.0.1:10847/sop/b.html):

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>子页面</title>
    </head>
    <body>
    <script type="text/javascript">
        var ifr = window.parent;  //获取父窗体
        var targetOrigin = 'http://localhost:10847';  // 若写成 http://127.0.0.1:10847 则将无法执行postMessage
        ifr.postMessage('这是传递给a.html的信息', targetOrigin);
    </script>
    </body>
    </html>
    复制代码

    执行如下:

    关于 Cross-document messaging 的更多细节可参考这篇文档

     

    2. WebSocket

    WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信,同时允许跨域通讯,是server push技术的一种很棒的实现。

    我们先简单看下webSocket在客户端上的api:

    复制代码
    var ws = new WebSocket('ws://127.0.0.1:8080/url'); //新建一个WebSocket对象,注意服务器端的协议必须为“ws://”或“wss://”,其中ws开头是普通的websocket连接,wss是安全的websocket连接,类似于https。
    ws.onopen = function() {
        // 连接被打开时调用
    };
    ws.onerror = function(e) {
        // 在出现错误时调用,例如在连接断掉时
    };
    ws.onclose = function() {
        // 在连接被关闭时调用
    };
    ws.onmessage = function(msg) {
        // 在服务器端向客户端发送消息时调用
        // msg.data包含了消息
    };
    // 这里是如何给服务器端发送一些数据
    ws.send('some data');
    // 关闭套接口
    ws.close();
    复制代码

    服务端这块我们继续用node/iojs来编写,并使用socket.io模块辅助,socket.io很好地封装了webSocket接口,提供了更简单、灵活的接口,也对不支持webSocket的浏览器提供了向下兼容(例如替换为Flash Socket/Comet)。

    我们先写服务端,首先我们得在项目根目录下使用npm命令安装好socket.io模块:

      npm install socket.io

    接着新建服务端脚本(访问地址是http://127.0.0.1:1234/)

    复制代码
    var io = require('socket.io');
    var server = require("http").createServer(function(req,res){
        res.writeHead(200, { 'Content-type': 'text/html'});
    }).listen(1234);
    
    io.listen(server).on('connection', function (client) {
        client.on('message', function (msg) { //监听到信息处理
            console.log('Message Received: ', msg);
            client.send('服务器收到了信息:'+ msg);
        });
        client.on("disconnect", function() { //断开处理
            console.log("Server has disconnected");
        })
    });
    复制代码

    客户端页面(http://localhost:10847/sop/a.html,注意使用了socket.io之后,接口跟原生的不太一样了)

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>socket.io</title>
        <script src="jq.js"></script>
        <script src="https://cdn.socket.io/socket.io-1.3.4.js"></script>
    </head>
    <body>
    Incoming Chat:
    <ul></ul>
    <br/>
    <input type="text" />
    <script>
        $(function () {
            var iosocket = io.connect('http://127.0.0.1:1234/'),
                    $ul = $("ul"),
                    $input = $("input");
            iosocket.on('connect', function() {  //接通处理
                $ul.append($('<li>连上啦</li>'));
    
                iosocket.on('message', function(message) {  //收到信息处理
                    $ul.append($('<li></li>').text(message));
                });
                iosocket.on('disconnect', function() { //断开处理
                    $ul.append('<li>Disconnected</li>');
                });
            });
    
            $input.keypress(function (event) {
                if (event.which == 13) { //回车
                    event.preventDefault();
                    iosocket.send($input.val());
                    $input.val('');
                }
            });
        });
    </script>
    </body>
    </html>
    复制代码

    客户端页面执行效果如下:

    WebSocket可以很好地摆脱无状态的http连接,从而很好地处理连接断开、数据错误的情况,不过缺点是兼容性还不够好,但咱可使用上述的socket.io来向下兼容。

    JSONP

    这个实在用到烂大街了,提起跨域实现,其实最容易想到的就是它。JSONP(JSON with Padding)是JSON的一种“使用模式”,主要是利用script标签不受同源策略限制的特性,向跨域的服务器请求并返回一段JSON数据。

    常规前后端会约定好某个JSONP请求的callback名(比如随便起个名字“abc”),服务端返回的JSON数据会被这个callback名包裹起来,进而方便服务器区分收到的请求,也方便客户端区分其收到的响应数据。我们可以利用jQuery轻松实现JSONP:

    客户端(访问地址http://localhost:10847/sop/a.html):

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>JSONP</title>
        <script src="jq.js"></script>
    </head>
    <body>
    <div></div>
    <script>
        $.ajax({
            url:'http://127.0.0.1:1234/',
            dataType:"jsonp", //告知jQ我们走的JSONP形式
            jsonpCallback:"abc", //callback名
            success:function(data){
                console.log(data)
            }
        });
    </script>
    </body>
    </html>
    复制代码

    服务端(访问地址http://127.0.0.1:1234/ ):

    复制代码
    var http = require('http');
    var urllib = require('url');
    
    var data = {'name': 'vajoy', 'addr': 'shenzhen'}; 
    
    http.createServer(function(req, res){
      res.writeHead(200, { 'Content-type': 'text/plain'});
      var params = urllib.parse(req.url, true);
      //console.log(params);
      if (params.query && params.query.callback) {
        //console.log(params.query.callback);
        var str =  params.query.callback + '(' + JSON.stringify(data) + ')';//jsonp
        res.end(str);
      } else {
        res.end(JSON.stringify(data));//普通的json
      }     
    }).listen(1234)
    复制代码

    客户端执行结果:

    不过JSONP始终是无状态连接,不能获悉连接状态和错误事件,而且只能走GET的形式。

    iframe形式

    在很久以前的石器时代,对于不支持 XMLHttpRequest 的浏览器的最佳回溯方法之一就是使用IFRAME对象,当然常规只是用它来实现流模式的Comet,而不是解决跨域通信的问题。

    使用iframe跨域其实有点剑走偏锋的既视感,也存在一些限制性。下面均来介绍下。

    1. document.domain

    该方法只适合主域相同但子域不同的情况,比如 a.com 和 www.a.com,我们只需要给这两个页面都加上一句 document.domain = ‘a.com’ ,就可以在其中一个页面嵌套另一个页面,然后进行窗体间的交互。

    为了方便模拟环境,我们修改下hosts文件:

    127.0.0.1     a.com
    127.0.0.1     www.a.com

    这样我们访问 a.com 的时候便能映射到本地了。

    页面a.html(访问地址http://a.com:8080/sop/a.html):

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>iframe</title>
        <script src="jq.js"></script>
    </head>
    <body>
    <iframe src="http://www.a.com:8080/sop/b.html"></iframe>
    <script>
        document.domain = 'a.com';
        $("iframe").load(function(){
            $(this).contents().find("div").text("OK")
        })
    </script>
    </body>
    </html>
    复制代码

    页面b.html(访问地址http://www.a.com:8080/sop/b.html):

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>b.html</title>
        <script src="jq.js"></script>
    </head>
    <body>
    <div></div>
    <script>
        document.domain = 'a.com';
    </script>
    </body>
    </html>
    复制代码

    这时候我们访问a.html会发现b.html里的内容被成功修改:

     

    2. location.hash

    location.hash/url hash 是个好东西,在之前我们曾利用avalon前端路由来实现简单的SPA页面(这篇文章),便是助力于location.hash。

    利用url地址改变但不刷新页面的特性(在url: http://a.com#hello 中的 ‘#hello’ 就是location.hash,改变hash并不会导致页面刷新,所以可以利用hash值来进行数据传递)和iframe,我们可以实现跨域传递简单信息。

    不过这个实现略麻烦,常规我们会想,在a.html下嵌套一个不同域的b.html,然后 a 和 b 互相修改彼此的hash值,也不断监听自己的hash值,从而实现我们的需求。可惜的是,大部分浏览器不允许修改不同域的父窗体的hash值(parent.location.hash),也就是说a虽能修改b的hash值,但反过来由b修改a的hash值却不成立。

    为了解除该限制,我们可以在b页面中增加一个和a同域的iframe(c.html)来做代理,这样b可以修改c,而c可以修改a(即修改parent.parent.location.hash,别忘了a和c同域哦)。下面直接模拟这三个页面,做到让b向a传输信息(当然本质上是b向c,c再向a传输):

    a.html(访问地址http://a.com:8080/sop/a.html):

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>iframe</title>
        <script src="jq.js"></script>
    </head>
    <body>
    <div></div>
    <iframe src="http://www.a.com:8080/sop/b.html" style="display: none;"></iframe>
    <script>
        var hash = "";
        function checkHash() {
            var data = location.hash ? location.hash.substring(1) : hash;
            if (hash !== data) {
                $("div").text('hash变化为:' + data);
                hash = data;
            }
        }
        setInterval(checkHash, 2000);
    </script>
    </body>
    </html>
    复制代码

    b.html(访问地址http://www.a.com:8080/sop/b.html):

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>b.html</title>
    </head>
    <body>
    <script>
        try {  //有的浏览器(Firefox)还是可以直接操作parent.location.hash的
            parent.location.hash = 'a=1&b=2';
        } catch (e) {
            // ie、chrome的安全机制无法修改parent.location.hash
            // 所以要利用一个代理iframe
            var ifrproxy = document.createElement('iframe');
            ifrproxy.style.display = 'none';
            ifrproxy.src = 'http://a.com:8080/sop/c.html#a=1&b=2'; //必须跟a.html同域
            document.body.appendChild(ifrproxy);
        }
    </script>
    </body>
    </html>
    复制代码

    c.html(访问地址http://a.com:8080/sop/c.html):

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>c.html</title>
        <script src="jq.js"></script>
    </head>
    <body>
    <script>
        //因为parent.parent和自身属于同一个域,所以可以改变其location.hash的值
        parent.parent.location.hash = self.location.hash.substring(1);
    </script>
    </body>
    </html>
    复制代码

    访问a.html后,效果如下:

    成功传递了数据“a=1&b=2”。该方法优点是兼容较好,缺点却显而易见——可传递的数据类型、长度均受限,数据还是直接显示在url上的,不够安全。另外其实现也较麻烦,还要搞setInterval不断监听,跟轮询没区别了。

     

    3. window.name

    window.name 的美妙之处在于,窗体的name值在页面跳转后依旧存在、保持原值(即使跳转的页面不同域),并且可以支持非常长的 name 值(2MB)。

    如果我们在a页面需要和不同域的b页面通信,我们可以现在a页面嵌入b页面,待b页面有数据要传递时,把数据附加到b页面窗口的window.name上,然后把窗口跳转到一个和a页面同域的c页面,这样a就能轻松获取到内嵌窗体(地址已由跨域的b变为同域的c)的window.name了(如果需要,获取到数据后再把c跳转到b,并重复循环前面的步骤,同时a页面以setInterval的形式来达到轮询的效果)。我们继续模拟这三个页面:

    a.html(访问地址http://a.com:8080/sop/a.html):

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>window.name</title>
        <script src="jq.js"></script>
    </head>
    <body>
    <div></div>
    <iframe src="http://www.a.com:8080/sop/b.html" style="display: none;"></iframe>
    <script>
        varifr = window.frames[0],
            loc = "",
            data = "";
        function checkData(){
            loc = ifr.location;
            if(loc.host){ //获取到了,说明iframe已转到同域的c页面
                if(ifr.name !== data){ //说明有新数据
                    data = ifr.name;
                    $("div").text(JSON.parse(data).name);
                    ifr.location = "http://www.a.com:8080/sop/b.html"; //数据收到后重回b页面接收新数据
                }
            }else return;
        }
    
        setInterval(checkData,2000); //每2秒轮询一次
    
    </script>
    </body>
    </html>
    复制代码

    b.html(访问地址http://www.a.com:8080/sop/b.html):

    复制代码
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title>b.html</title>
    </head>
    <body>
    <script>
        window.name = '{"name":"vajoy","addr":"shenzhen"}';
        location = "http://a.com:8080/sop/c.html"; //跳转到和a同域的c页面
    </script>
    </body>
    </html>
    复制代码

    c.html页面啥都不用写,纯粹一个空的html即可,毕竟只是一个代理页面罢了。

    我们访问a页面,会成功收到来自不同域b的数据:

    其它形式

    1. 服务器代理

    页面直接向同域的服务端发请求,服务端进行跨域处理或爬虫后,再把数据返回给客户端页面。依旧用node/iojs来模拟服务端,下面的代码来自木的树的文章

    客户端:

    复制代码
    <!doctype html>
    <html>
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no">
        <title>proxy_test</title>
    
        <script>
          var f = function(data){
            alert(data.name);
          }
          var xhr = new XMLHttpRequest();
          xhr.onload = function(){
            alert(xhr.responseText);
          };
          xhr.open('POST', 'http://localhost:8888/proxy?http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer', true);
          xhr.send("f=json");
        </script>
      </head>
      
      <body>
      </body>

    服务端:

    复制代码
    var proxyUrl = "";
          if (req.url.indexOf('?') > -1) {
              proxyUrl = req.url.substr(req.url.indexOf('?') + 1);
              console.log(proxyUrl);
          }
          if (req.method === 'GET') {
              request.get(proxyUrl).pipe(res);
          } else if (req.method === 'POST') {
              var post = '';     //定义了一个post变量,用于暂存请求体的信息
    
            req.on('data', function(chunk){    //通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
                post += chunk;
            });
        
            req.on('end', function(){    //在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
                post = qs.parse(post);
                request({
                          method: 'POST',
                          url: proxyUrl,
                          form: post
                      }).pipe(res);
            });
          }

     

    2. flash socket

    其实在前面介绍socket.io的时候就有提到,在不兼容WebSocket的浏览器下,socket.io会以flash socket或Comet的形式来兼容,而flash socket是支持跨域通信的形式,跟WebSocket一样走的TCP/IP套接字协议。具体的实现可参考Adobe官方文档,本文不赘述。

     

    http://www.cnblogs.com/vajoy/p/4295825.html

  • iframe跨域、同域

    在同域的情况下

     // $($("#iframepage")[0].contentDocument).find('body') 从父页获取到iframe 里面的body元素
     // $(document.frames["iframepage"].document.body) 从父获取到iframe 里面的body元素 //兼容IE7
     
     // $(window.parent.document.body) //从子iframe里面获取到 父元素内容(代码要写在iframe加载的页面中)
     // window.parent.papa() //从子iframe里面调用父的方法 papa();

     

     

    跨域情况下

    以下方法兼容IE8

    1,父页面传值给iframe下的子页面。

     

    父页面:

    <script src="iframe/js/jquery-1.8.3.min.js"></script>
    <script src="cross.js"></script>

     

    <script>
     $(function(){
       var ifw = $("#ifr")[0].contentWindow;
       $('button').click(function(){
          Cross.call(ifw,"https://sdeno.com/wp-content/uploads/2016/06/cross_iframe/b.html","test",{
             t: $("#txt").val()
          });
       });
     });
    </script>
    
    输入要传递的值:<input id="txt" type="text"/> 
                   <button>回调</button>
    
    <iframe id="ifr" src="https://sdeno.com/wp-content/uploads/2016/06/cross_iframe/b.html"></iframe>

     

     

    子页面:

    <script src="https://sdeno.com/jquery-1.8.3.min.js"></script>
    <script src="https://sdeno.com/cross.js"></script>

     

     //对外公开一个接口命名为test
    <script>
    $(function(){
        Cross.on("test", function(data){
          $('input').val(data.t);
        });
    });
    </script>
    <input type="text" placeholder="等待父页面传值过来">

    cross.js

    http://pan.baidu.com/s/1gedVafx

    案例下载:cross_iframe.rar

     

    2,父页面获取子页面的数据

    实现技巧就是利用一个代理iframe,它嵌入到子页面中,并且和父页面必须保持是同域,然后通过它充分利用上面第一种通信方式的实现原理就把子页面的数据传递给代理iframe,然后由于代理的iframe和主页面是同域的,所以主页面就可以利用同域的方式获取到这些数据。使用 window.top或者window.parent.parent获取浏览器最顶层window对象的引用。

    http://www.jb51.net/article/49809.htm

     

  • 控制台错误和状态代码

    [在商业发行之前会发生实质性修改的、与预发布产品相关的一些信息。Microsoft 不对此处提供的信息作任何明示或默示的担保。]

    使用此参考解释显示在 Internet Explorer 11 的控制台调试程序中的错误消息。

    简介

    使用 F12 开发人员工具进行调试时,错误消息(例如 EC7111 或 HTML1114)将显示在控制台调试程序工具中。

    我们在此处列出了常见的控制台错误代码及其关联消息。我们还提供了更多详细说明和/或建议,用于在适当位置修复该问题。尽管该表中的说明向你提供了问题调试的起点,但获取详细信息的最佳方法是在线搜索开发人员论坛或 Internet Explorer 开发人员中心

    安全性错误

    安全错误代码的格式均为 SEC7xxx(如 SEC7113)。这些错误反映 Microsoft Edge 强制实施的安全条件,如混合内容和跟踪保护。

    代码 消息 说明 建议的解决办法
    SEC7111 “HTTPS 安全受到 [name of resource] 威胁” 安全超文本传输协议 (HTTPS) 页面包含来自非安全源的内容。 请确保页面中的所有内容(包括脚本、样式表和图像)均来自 HTTPS 源。
    SEC7112 [URL] 的脚本因 mime 类型不匹配而被阻止” 由 URL 指定的 JavaScript 文件的 HTTP 响应标头具有 “X-Content-Type-Options: nosniff” 头,但没有识别的内容类型声明。 更新服务器以在 HTTP 响应标头中为 JavaScript 文件发送正确的内容类型(例如 text/javascriptapplication/javascript 等)。有关内容类型的详细信息和完整列表,请参阅 Internet Explorer 中的 MIME 处理更改
    SEC7113 “由于 MIME 类型不匹配而忽略 CSS” 因为 HTTP 标头中存在错误 MIME 类型,因此未使用导入的样式表。 确保使用正确的包含 text/css 内容类型的 HTTP 响应标头传递样式表文件。有关详细信息,请参阅 Internet Explorer 中的 MIME 处理更改
    SEC7114 “此页中的下载已被跟踪保护阻止。[URL provided here] 用户已使用跟踪保护阻止脚本或内容。 无 – 用户已启动。
    SEC7115 “:visited 和 :link 样式只是颜色不同。某些样式不适用于 :visited。” 使用 visited 和 link 样式更改了多个属性,如字体或大小。 只更改颜色属性。
    SEC7116 “访问被拒绝。无法撤销跨源 URL:[URL]。” 具有与 Blob 不同的源站点的脚本已尝试撤销 Blob URL。由于 Blob 源策略而尝试失败。 请确保使用来自与创建 Blob URL 的文档相同的源站点的脚本撤销所有 Blob URL。
    SEC7120 “未在 Access-Control-Allow-Origin 标头中找到源 [domain]。 “ 在对 XMLHttpRequest 的响应中,已返回“Access-Control-Allow-Origin”标头,该标头具有未包含/匹配站点的源值的值。 资源正在返回适当类型的标头代码,但你的站点不运行此资源。与负责资源的开发人员联系来更新其“Access-Control-Allow-Origin”标头,以便你的站点受到允许。要获取有关响应标头中的详细信息,你可以建议他们参阅 IE10 中适用于 XHR 的 CORS
    SEC7121 “当凭据标志设置为 True 时,不允许 Access-Control-Allow-Origin 中的通配符。 “ 服务器正在标头中返回“Access-Control-Allow-Origin: *”,但当在 XMLHttpRequest 中将 withCredentials 标志设置为 True 时,则不允许该操作。 需要修改服务器端处理程序以返回“Access-Control-Allow-Origin”标头,该标头特别允许此类请求上的原点。如果你不能控制服务器端处理程序,则需要与执行此操作的开发人员联系。
    SEC7122 “凭据标志已设置为 True,但 Access-Control-Allow-Credentials 不存在或未设置为“True”。 “ 已使用 withCredentials 标志请求 XMLHttpRequest。未返回 Access-Control-Allow-Credentials 值,或已返回某个非 true 的值。 你的凭据或服务器响应可能出现问题。有关凭据请求的信息,请参阅 XMLHttpRequest 级别 2 规范
    SEC7123 “请求标头 [header] 未存在于 Access-Control-Allow-Headers 列表中。 “ 自定义标头类型包含在请求中,但响应的 Access-Control-Allow-Headers 列表未包含它。 请确保服务器允许自定义标头,特别是允许在请求中发送的标头。
    SEC7124 “请求标头 [method] 未存在于 Access-Control-Allow-Methods 列表中。 “ 请求方法(例如 POST)已用于 XMLHttpRequest 中,但响应返回了未包含该方法的 Access-Control-Allow-Methods 标头。 请确保服务器允许此类请求方法,并确保该方法的访问权限受限时,你正确使用了 withCredentials
    SEC7125 [URL] 的 XMLHttpRequest 导致响应标头解析失败。 “ 无法解析来自服务器的响应标头,因此该请求失败。 使用网络工具捕捉和检查响应标头,以确保它们满足 CORS 规范
    SEC7126 “重定向不可用于 CORS 预检请求。” 已在“源”标头中检测重定向,用户代理在预检期间不能跟踪重定向。 使用网络工具捕捉和检查响应标头,并确保存在单一的直接源。
    SEC7127 “已对 CORS 请求阻止重定向。 “ 指向 CORS 资源的路径包含了违反安全规则的重定向。 请确保你在 XMLHttpRequest 中拥有指向 CORS 资源的最直接路径。
    SEC7128 “多个 Access-Control-Allow-Origin 标头不可用于 CORS 响应。” 响应标头包含了多个 Access-Control-Allow-Origin 标头。 这是服务器端错误。服务器应该返回单个 Access-Control-Allow-Origin 标头。向负责服务器端资源的开发人员报告此错误。
    SEC7129 “多个 Access-Control-Allow-Credentials 标头不可用于 CORS 响应。 “ 响应标头包含了多个 Access-Control-Allow-Credentials 标头。 这是服务器端错误。服务器应该返回单个 Access-Control-Allow-Credentials 标头。 向负责服务器端资源的开发人员报告此错误。
    SEC7130 “已在 [URL] 中检测到潜在跨站点脚本。内容已由 XSS 筛选器修改。 “ XSS 筛选器在响应中检测到来自资源的潜在恶意内容并删除了违法内容。 查找有关 XSS 筛选器的详细信息。
    SEC7131 “沙箱 iframe 的安全受到允许脚本和相同源访问的潜在威胁。 “ 如果沙箱 iframe 中的内容来自不受信任的或不安全的源,则当同时允许脚本和相同源访问时,它可能从沙箱泄露。 这是一个信息警告消息,应该不会影响功能。建议你避免合并这些权限,除非你确定将在 iframe 中运行哪些内容。

     

    注意  对于用户信任的安全区域中的网站,Microsoft Edge 将不检查样式表的 MIME 类型。

    HTML 代码

    这些代码的格式为 HTML1xxx(如 HTML1115)。他们可指定开发人员可控制或不可控制的错误或状态。

    代码 消息 说明 建议解决办法
    HTML1112 “从 [encoding] 到  [encoding] 代码页重新开始” 指定了不同于服务器的代码页。 使用与服务器相同的代码页以避免出现此消息。
    HTML1113 [mode][mode] 的文档模式重新开始 网页需要的文档模式并非浏览器当前设置的文档模式。 当用户从其他页面浏览时会出现该消息,因此它可以不受开发人员的控制。
    HTML1114 [domain] 的代码页 [encoding] 替代了冲突的 [domain] 中的代码页 [encoding] 在 HTTP(从服务器)和在 HTML(页面中)标头中指定的代码页有所不同。 更改一个代码页,以使它们匹配。
    HTML1115 “忽略了 X-UA-Compatible META 标记(“[META tag]”),因为文档模式已完成” 通常,将 “META” 标记放置在 “Script” 或 “Style” 声明(固定了页面的文档模式)之后。 尽可能在标头中将符合 X-UA 的 META 标记往前移。最好是将它放置在紧跟 “<title>” 和字符集值之后。
    HTML1116 “符合 X-UA 的 META 标记 (“[META tag]”)由于前面符合 X-UA 的 META 标记 (“[META tag]”)而忽略” 在源代码的 “<head>” 部分中,有多个”符合 X-UA 的 “”META” 标记。 除了留下一个”符合 X-UA 的 META” 标记之外,其他标记全部删除,并确保它尽可能位于标头的前面。最好是将它放置在紧跟 “<title>” 和字符集值之后。
    HTML1121 “不允许代码页 [encoding],仅允许代码页 [encoding]。 “ 网页中的内容调用了此上下文中不允许的字符编码。 请确保所有内容使用的都是消息中指定的允许编码。
    HTML1122 “Internet Explorer 正在模拟 IE8 的企业模式中运行。” 该页面当前在企业模式中呈现,它是 Windows Internet Explorer 8 的仿真页面。 此模式由 IT 管理配置,用于特定网站。如果单个用户想要在网页上关闭此模式,请取消选中“工具”菜单中的“企业模式”选项。有关企业模式管理的详细信息,请参阅 IT 文档
    HTML1201 [domain] 是你添加到“兼容性视图”的网站。” 用户已单击当前网站的“兼容性视图”按钮或已通过“兼容性视图设置”添加该网站。 用户已启动。
    HTML1202 [domain] 正在“兼容性视图”中运行,因为已选中“在兼容性视图中显示 Intranet 站点”。” 用户已选中“兼容性视图设置”中的“在兼容性视图中显示 Intranet 站点”复选框。 用户需要按 Alt + T,单击“兼容性视图设置”,然后清除“在兼容性视图中显示 Intranet 站点”复选框。
    HTML1203 [domain] 已通过组策略配置为在“兼容性视图”中运行。” 网络管理员已指定网页将在“兼容性视图”中运行。 你需要与网络管理员联系。
    HTML1204 [domain] 正在“兼容性视图”中运行,因为已选中“在兼容性视图中显示所有网站”。” 用户已选中“兼容性视图设置”中的“在兼容性视图中显示所有网站”复选框。 用户需要按 Alt + T,单击“兼容性视图设置”,然后清除“在兼容性视图中显示所有网站”复选框。
    HTML1300 “发生导航” 导航至新页面,或者当前页面已刷新。 这是一个信息消息,不是错误。

     

    HTML5 分析程序警告

    以下警告可能在 HTML 解析期间执行的验证过程中出现。这些警告不一定意味着页面受损,但所提供的 HTML 根据 HTML5 标准无效。按照较早版本 HTML 或 XHTML 规范创建的内容在 HTML5 中可能无效,特别是在 DOCTYPE 的使用方面。有关详细信息,请参阅创建标准化网站

    这些警告的常见原因包括缺失或多余字符,以及标记不匹配。解决了这些警告之后,与较早浏览器的兼容性以及网页对 HTML5 标准的遵从性都将提高。要帮助标识警告源,Microsoft Edge 包含了行和字符偏移信息,以及指向问题发生位置的链接。

    代码 消息
    HTML1400 “数字字符引用的开始字符不符合要求,应为: [0-9]。”
    HTML1401 “十六进制数字字符引用的开始字符不符合要求,应为: [0-9]、[a-f] 或 [A-F]。”
    HTML1402 “字符引用缺少结束分号“;”。”
    HTML1403 “数字字符引用未解析为有效字符。”
    HTML1404 “无法识别的命名字符引用。”
    HTML1405 “无效字符: U+0000 NULL。不应使用 Null 字符。”
    HTML1406 “无效的开始标记:“<?”。问号不应用作开始标记。”
    HTML1407 “无效的标记名称。第一个字符应为 [a-zA-Z]。”
    HTML1408 “无效的结束标记“</>”。结束标记不应为空。”
    HTML1409 “无效的属性名称字符。属性名称不应包含 (“)、(‘)、(<) 或 (=)。”
    HTML1410 “未加引号的无效属性值。未加引号的属性值不应包含 (“)、(‘)、(<)、(=) 或 (`)。”
    HTML1411 “文件结尾不符合要求。”
    HTML1412 “注释格式不正确。注释应以“<!–”开始。”
    HTML1413 “不符合要求的字符: U+003E GREATER-THAN SIGN (>)”
    HTML1414 “不符合要求的字符: U+0021 EXCLAMATION MARK (!)”
    HTML1415 “不符合要求的字符: U+002D HYPHEN-MINUS (-)”
    HTML1416 “注释结尾的字符不符合要求。应为“–>”。”
    HTML1417 “空 DOCTYPE。最短的有效 doctype 为“<!DOCTYPE html>”。”
    HTML1418 “DOCTYPE 中出现不符合要求的字符。”
    HTML1419 “DOCTYPE 中出现不符合要求的关键字。关键字应为“PUBLIC”或“SYSTEM”。”
    HTML1420 ““PUBLIC”或“SYSTEM”关键字之后不应为引号。应为空格。”
    HTML1421 “结束标记的格式不正确。结束标记不应包含属性。”
    HTML1422 “开始标记的格式不正确。自结束斜线后应跟随 U+003E GREATER-THAN SIGN (>)。”
    HTML1423 “开始标记的格式不正确。属性应由空格分隔。”
    HTML1424 “无效字符 “
    HTML1500 “标记无法自结束。请使用显式结束标记。”
    HTML1501 “文件结尾不符合要求。”
    HTML1502 “DOCTYPE 不符合要求。只允许一个 DOCTYPE,并且它必须出现在所有元素之前。”
    HTML1503 “开始标记不符合要求。”
    HTML1504 “结束标记不符合要求。”
    HTML1505 “字符标记不符合要求。”
    HTML1506 “标记不符合要求。”
    HTML1507 “不符合要求的字符: U+0000 NULL。不应使用 Null 字符。”
    HTML1508 “不匹配的结束标记。”
    HTML1509 “不匹配的结束标记。”
    HTML1510 “所需节点不在作用域内。”
    HTML1511 “在“<head>”之外出现不符合要求的头级元素。”
    HTML1512 “不匹配的结束标记。”
    HTML1513 “找到多余的“<html>”标记。每个文档中只应存在一个“<html>”标记。”
    HTML1514 “找到多余的“<body>”标记。每个文档中只应存在一个“<body>”标记。”
    HTML1515 “在文档中极其靠后的位置找到“<frameset>”。此标记应在创建“<body>”之前出现。”
    HTML1516 “无效嵌套。类似“<h1>”或“<h2>”这样的头标记不应置于另一个头标记内。”
    HTML1517 “无效嵌套。“<form>”标记标记不应置于另一个“<form>”内。”
    HTML1518 “无效嵌套。“<button>”标记不应置于另一个“<button>”内。”
    HTML1519 “无效嵌套。“<a>”标记不应置于另一个“<a>”内。”
    HTML1520 “不符合要求的开始标记:“<isindex>”元素已被弃用,因此不应使用。”
    HTML1521 “不符合要求的“</body>”或文件结尾。在文档结束之前,所有具有开始标记的元素都应正确结束。”
    HTML1522 “无效的结束标记:“</br>”。请改为使用“<br>”或“<br/>”。”
    HTML1523 “重叠的结束标记。标记的结构应为“<b><i></i></b>”,而不是“<b><i></b></i>”。”
    HTML1524 “无效的 DOCTYPE。最短的有效 doctype 为“<!DOCTYPE html>”。”
    HTML1525 “在外部内容(MathML/SVG)中发现不符合要求的 HTML 标记。”
    HTML1526 “无效嵌套。“<nobr>”标记不应置于另一个“<nobr>”内。”
    HTML1527 “应为 DOCTYPE。最短的有效 doctype 为“<!DOCTYPE html>”。”
    HTML1528 “HTML 内容中出现不符合要求的“<image>”。请改用“<img>”。”
    HTML1529 “xmlns:xlink 属性值无效。该值必须是“http://www.w3.org/1999/xlink”。”
    HTML1530 “在结构化表元素中发现文本。表文本只能放在“<caption>”、“<td>”或“<th>”元素中。”
    HTML1531 “xmlns 属性值无效。对于 SVG 元素,该值必须是“http://www.w3.org/2000/svg”。”
    HTML1532 “xmlns 属性值无效。对于 MathML 元素,该值必须是“http://www.w3.org/1998/Math/MathML”。”

     

    HTTP 错误代码

    HTTP 错误代码将从远程服务器返回以响应请求。我们最为熟悉的可能是 HTTP404,只要服务器在 URI 中找不到指定的页面/文档,便会返回该代码。

    代码 消息 描述
    HTTP400 错误请求 由于语法无效,服务器可能无法处理该请求。
    HTTP401 已拒绝 请求的资源要求用户身份验证。
    HTTP402 付款要求 当前未在 HTTP 协议中实现。
    HTTP403 已禁止 服务器已识别此请求,但拒绝执行它。
    HTTP404 未找到 服务器未找到任何匹配请求的 URI(统一资源标识符)。
    HTTP405 方法错误 不允许使用 HTTP 谓词。
    HTTP406 无法接受 找不到客户端可接受的响应。
    HTTP407 要求代理身份验证 要求代理身份验证。
    HTTP408 请求超时 服务器等待请求时超时。
    HTTP409 冲突 由于与资源的当前状态有冲突,无法完成该请求。
    HTTP410 不存在 请求的资源在服务器上不再可用,且不知道转发地址。
    HTTP411 要求长度 如果不定义内容长度,服务器将拒绝接受该请求。
    HTTP412 不满足前提条件 一个或多个请求的标头字段中给定的前提在服务器上测试后确定为假。
    HTTP413 负载过大 服务器拒绝执行该请求,因为该请求的实体大小超过了服务器打算或可以执行的大小。
    HTTP414 URI 过长 服务器拒绝为该请求提供服务,因为该请求 URI(统一资源标识符)的长度超过了服务器打算执行的长度。
    HTTP415 不支持的媒体类型 服务器拒绝为该请求提供服务,因为请求方法中的请求资源不支持该请求的实体的格式。
    HTTP416 无法满足请求的范围 服务器无法提供客户端所请求的文件部分。该部分可能超出了该文件的结尾。
    HTTP417 预期失败 服务器不能满足预期请求标头字段中的要求。
    HTTP418 我是茶壶 服务器是一个茶壶,它不能煮咖啡。
    HTTP419 身份验证超时 以前有效的身份验证已过期。
    HTTP422 无法处理的实体 请求格式正确,但因语义错误而无法被处理。
    HTTP423 已锁定 要访问的资源已锁定。
    HTTP424 依存关系失败 由于之前请求的失败而导致该请求失败。
    HTTP426 需要升级 客户端必须切换到其他协议。
    HTTP428 必要的前提条件 原服务器要求该请求是有条件的。
    HTTP429 请求过多 服务器拒绝为该请求提供服务,因为客户端提交的请求过多。
    HTTP431 请求的标头字段过长 服务器拒绝为该请求提供服务,因为标头字段或所有标头字段的总长度超出了服务器打算或可以执行的长度。
    HTTP449 稍后重试 在执行相应的操作后,请求应已重试。
    HTTP500 服务器错误 服务器遇到了意外情况,无法完成请求。
    HTTP501 不支持 服务器不支持完成此请求所需要的功能。
    HTTP502 网关无效 在作为执行请求的网关或代理时,此服务器从其访问的上游服务器接收到了一个无效响应。
    HTTP503 服务不可用 服务暂时超负荷。
    HTTP504 网关超时 请求在等待网关时超时。
    HTTP505 版本不受支持 该服务器不支持或拒绝支持该请求消息中使用的 HTTP 协议版本。
    HTTP506 变异也协商 该请求的透明内容协商引发循环引用。
    HTTP507 存储空间不足 服务器无法存储完成此请求所需的表示形式。
    HTTP508 检测到循环 服务器在为该请求提供服务时检测到一个无限循环。
    HTTP510 未扩展 服务器在完成请求时需要进一步扩展该请求。
    HTTP511 要求网络身份验证 客户端必须经过身份验证才能获取网络访问权限。

     

    CSS 代码

    这些错误的格式为 CSS31xx 并且与 “Web 开放字体格式 (WOFF)” 和 “嵌入式 OpenType 字体 (EOT)” 源和主机服务器问题有关。

    代码 消息 说明 建议解决办法
    CSS3111 “@font-face 遇到未知错误” 级联样式表 (CSS) 字体的 “Web 开放字体格式 (WOFF)” 和 “嵌入式 OpenType 字体 (EOT)” 遇到未知问题。 检查 “WOFF” 字体的源。尝试其他字体或源以查看是否可以重现问题。
    CSS3112 “@font-face 未通过 WOFF 完整性检查” “Web 开放字体格式 (WOFF)” 字体可能已损坏、不完整或者不是正确的格式。 检查字体的源。尝试已知正确的字体或源以查看是否还出现问题。
    CSS3113 “@font-face 在文档来源和 EOT 根字符串之间不匹配” 无法使用该字体,因为”嵌入式 OpenType 字体 (EOT)” 中的 URL(rootstring) 与使用该字体的文档的域不匹配。 “EOT” rootstring 中的 URL 校验和可能不正确、指示该字体已损坏或者该字体的 URL 已改变。请确保字体已授权,或对将使用这些字体的网站具有相应的权限。
    CSS3114 “@font-face 未通过 OpenType 嵌入式权限检查。权限必须可安装。” 字体没有通过当前网页安装的权限。 请获取正确的权限或嵌入该字体的授权。
    CSS3115 “@font-face 无法加载无效的 OpenType 字体。” 对于这种使用,该字体无效。 请获取当前有效字体的权限或授权。
    CSS3116 “@font-face 跨源请求失败。无 Access-Control-Allow-Origin 标头。” 该字体可能未配置为跨域访问。 字体与文档不是同一个源。请通过使用 “Access-Control-Allow-Origin” HTTP 标头确保处理该字体的主机允许使用该字体。
    CSS3117 “@font-face 跨源请求失败。资源访问受限。” “Access-Control-Allow-Origin” 标头可能未正确配置或者字体主机可能不允许你的页面使用该字体。 请确保该资源具有正确的权限和正确配置的 HTTP 响应标头,该标头在处理字体的主机上具有跨域访问源。
    CSS3118 “无法创建新样式表。文档中存在多个 [maximum] 样式表。 “ Microsoft Edge 在呈现页面过程中创建了 4095 多个样式表对象。 这可能是一个失控的 JavaScript 过程或构建系统错误。减少生成的样式表对象的数量。
    CSS3119 “媒体查询 -ms-view-state 已被弃用。在 Windows 8.1 之后的版本中,-ms-view-state 媒体查询可能被替换或者不可用。相反,请使用 max-width 和 min-width 查询。 “ 你的 CSS 包含 -ms-view-state 媒体查询。 使用 max-width 和 min-width。

     

    可缩放向量图形 (SVG) 代码

    F12 工具当前不支持广泛的 SVG 调试,但显示了某些控制台消息可帮助调试 SVG 代码。

    代码 消息 说明 建议解决办法
    SVG5601 “SVG 路径数据的格式不正确并且可能未完全解析。” SVG Path 字符串格式不正确,或者包含无法识别的命令。 检查命令的格式。
    SVG5602 “SVG 点列表的格式不正确并且可能未完全解析。” 用于元素的点列表(如 polyline)的格式不正确。 请确保这些点是完整的并针对用户坐标系进行了正确的格式设置。

     

    脚本代码

    F12 工具中还报告了 JavaScript 运行时错误。这些错误的格式为 SCRIPT50xx(如 SCRIPT5001)。将在 JavaScript 错误页面上对这些错误进行说明。

    WebGL 代码

    来自 WebGL 上下文的错误消息与 WEBGL11xxx 代码一起显示。

    XML 代码

    F12 工具控制台可以报告 XML 代码。这些错误的格式为 XML5xxx(如 XML5603)。有关 XML 的详细信息,请参阅 XmlLite 参考

    代码 消息
    XML5001 “正在应用集成的 XSLT 处理。”
    XML5601 “MX_E_MX”
    XML5602 “输入意外结束。”
    XML5603 “无法识别编码。”
    XML5604 “无法切换编码。”
    XML5605 “无法识别输入编码签名。”
    XML5606 “WC_E_WC”
    XML5607 “应为空格。”
    XML5608 “应为分号。”
    XML5609 “应为“>”。”
    XML5610 “应为引号字符。”
    XML5611 “应为“=”。”
    XML5612 “属性值中不允许使用 < 字符。”
    XML5613 “应为十六进制数字。”
    XML5614 “应为十进制数字。”
    XML5615 “应为“[”。”
    XML5616 “应为“(”。”
    XML5617 “XML 字符非法。”
    XML5618 “名称字符非法。”
    XML5619 “文档语法不正确。”
    XML5620 “CDATA 部分语法不正确。”
    XML5621 “注释语法不正确。”
    XML5622 “条件部分语法不正确。”
    XML5623 “ATTLIST 声明语法不正确。”
    XML5624 “DOCTYPE 声明语法不正确。”
    XML5625 “ELEMENT 声明语法不正确。”
    XML5626 “ENTITY 声明语法不正确。”
    XML5627 “NOTATION 声明语法不正确。”
    XML5628 “应为“NDATA”。”
    XML5629 “应为“PUBLIC”。”
    XML5630 “应为“SYSTEM”。”
    XML5631 “名称无效。”
    XML5632 “只允许一个根元素。”
    XML5633 “结束标记名称与对应的开始标记名称不匹配。”
    XML5634 “此元素上已存在一个同名的属性。”
    XML5635 “仅允许在文件开头使用 XML 声明。”
    XML5636 “前导“xml”。”
    XML5637 “文本声明语法不正确。”
    XML5638 “XML 声明语法不正确。”
    XML5639 “编码名称语法不正确。”
    XML5640 “公共标识符语法不正确。”
    XML5641 “内部 DTD 子集中的标记声明内不允许使用参数实体引用。”
    XML5642 “各标记声明之间使用的参数实体引用的替换文本自身必须包含一系列完整的标记声明。”
    XML5643 “解析的实体不得包含对自身的直接或间接引用。”
    XML5644 “指定实体的内容格式不正确。”
    XML5645 “指定的实体尚未进行声明。”
    XML5646 “实体引用不能包含未经解析的实体的名称。”
    XML5647 “属性值不得包含对外部实体的直接或间接引用。”
    XML5648 “处理指令语法不正确。”
    XML5649 “系统标识符语法不正确。”
    XML5650 “应为问号 (?)。”
    XML5651 “不得在元素内容中使用 CDATA-section-close 分隔符“]]>”。”
    XML5652 “并未读取所有数据块。”
    XML5653 “DTD 已找到,但被禁止。”
    XML5654 “找到的 xml:space 属性的值无效。有效值是“preserve”或“default”。”
    XML5655 “NC_E_NC”
    XML5656 “限定名称字符非法。”
    XML5657 “限定名称中不得出现多个冒号“:”。”
    XML5658 “名称中不得出现冒号“:”。”
    XML5659 “已声明前缀。”
    XML5660 “指定的前缀尚未进行声明。”
    XML5661 “非默认命名空间声明不得包含空 URI。”
    XML5662 ““xml”前缀是保留项,必须具有 URI“http://www.w3.org/XML/1998/namespace”。”
    XML5663 ““xmlns”前缀保留供 XML 使用。”
    XML5664 “只能将 xml 命名空间 URI (http://www.w3.org/XML/1998/namespace) 分配给前缀“xml”。”
    XML5665 “xmlns 命名空间 URI (http://www.w3.org/2000/xmlns/) 已保留,不得使用。”
    XML5666 “SC_E_SC”
    XML5667 “超出了最大的嵌套元素深度。”
    XML5668 “超出了最大的实体扩展数。”
    XML5669 “WR_E_WR”
    XML5670 “WR_E_NONWHITESPACE:编写器:指定的字符串不是空格。”
    XML5671 “WR_E_NSPREFIXDECLARED:编写器:命名空间前缀已与另一个命名空间一起声明。”
    XML5672 “WR_E_NSPREFIXWITHEMPTYNSURI:编写器:无法将前缀与空命名空间 URI 一起使用。”
    XML5673 “WR_E_DUPLICATEATTRIBUTE:编写器:属性重复。”
    XML5674 “WR_E_XMLNSPREFIXDECLARATION:编写器:无法重新定义 xmlns 前缀。”
    XML5675 “WR_E_XMLPREFIXDECLARATION:编写器:xml 前缀必须具有 http://www.w3.org/XML/1998/namespace URI。”
    XML5676 “WR_E_XMLURIDECLARATION:编写器:xml 命名空间 URI (http://www.w3.org/XML/1998/namespace)只能分配给前缀“xml”。”
    XML5677 “WR_E_XMLNSURIDECLARATION:编写器:xmlns 命名空间 URI (http://www.w3.org/2000/xmlns/) 保留,不得使用。”
    XML5678 “WR_E_NAMESPACEUNDECLARED:编写器:未声明命名空间。”
    XML5679 “WR_E_INVALIDXMLSPACE:编写器:xml:space 属性的值无效(允许的值是“default”和“preserve”)。”
    XML5680 “WR_E_INVALIDACTION:编写器:执行请求的操作将导致 XML 文档无效。”
    XML5681 “WR_E_INVALIDSURROGATEPAIR:编写器:输入包含的代理对无效或不完整。”
    XML5682 “字符实体中包含意外字符。应为十进制数字。”
    XML5683 “字符实体中包含意外字符。应为十六进制数字。”
    XML5684 “指定字符实体的 Unicode 值无效。”
    XML5685 “编码无效。”
    XML5686 “意外的 XML 错误。”

     

    CSP 错误代码

    CSP(内容安全策略)是 Web 应用程序可用于迁移一类广泛的内容注入漏洞的机制,例如跨站点脚本 (XSS)。XSS 攻击所利用的核心问题是,浏览器无法将旨在作为应用程序一部分的脚本和第三方恶意注入的脚本区分开来。通过声明应用程序预期加载资源的来源,应用程序可以检测到并阻止攻击者所注入的恶意脚本。Web 应用程序选择通过提供 Content-Security-Policy HTTP 标头来使用 CSP。此类策略仅适用于当前资源表示形式。

    代码 消息 说明 建议的解决办法
    CSP14301 “由于 [reason for canceling the operation] 而无法解析 [policy type] – 策略将被忽略。” 安全策略类型(即Content-Security-Policy、Content-Security-Policy-Report-Only、X-Content-Security-Policy、<meta http-equiv=\”Content-Security-Policy\”> 或主机定义策略)由于已标识而失败,并且将被忽略。 请确保在单个指令中列出所有所需的特定类型的资源。例如,在此 script-src https://host1.com; script-src https://host2.com 中,第二个指令将被忽略。以下内容可正确地将两个来源指定为有效值:`script-src https://host1.com https://host2.com`
    CSP14302 “对于 [source URL] 中的指令 [directive type],无法解析 [policy type] 中的源 – 源将被忽略。” 大部分 CSP 指令需要一个或多个内容源(指示可从其中加载内容的 URL)。此错误指出一个策略,该策略带有包含在尝试解析时失败的源 URL 的指令。 检查在指定指令中定义的内容源(通常为 URL),你可以在指定策略类型中找到该指令。更正或替换源 URL 或删除该指令。*你的策略应包含一个 default-src 策略指令,该指令是其他资源类型(当它们没有自己的策略时)的回调。
    CSP14303 [Policy type] 策略为空。” 策略类型(即 HTTP 标头中的 Content-Security-Policy)为空。 有关设置内容安全策略的快速参考可以在 http://content-security-policy.com/ 找到
    CSP14304 [policy type] 中指令 [directive type] 的未知源 [source URL] – 源将被忽略。” 已标识指令中的已批准(安全)内容的源是未知源,并且将被忽略。 检查已标识的内容源(通常为 URL),以确保其正确。
    CSP14305 [policy type] 中指令 [directive type] 的不受支持的源 [source URL] – 源将被忽略。” 此指令中列出的源(URL、关键字或数据)不受支持,并且将被忽略。 源站点的地址可能包括可选的前导通配符(星号字符“*”)。例如,http://*.foo.com or mail.foo.com:*。主机用空格分隔。源也可以是关键字(支持 none、self、unsafe-inline 和 unsafe-eval)或数据(data:URI、mediastream:URI)。
    CSP14306 “未向 [policy type] 的指令 [directive type] 提供任何源 – 这等效于使用“none”,并且将阻止下载所有此类型的资源。” 提供指令并且不列出任何供安全内容访问的源与不允许下载任何在指令中所指定的类型的资源相同。 源可以是一个或多个 Internet 主机名或 IP 地址,也可以是一个可选的 URL 方案和/或端口号。
    CSP14307 “已为 [policy type] 的指令 [directive type] 提供源 [source URL]。” 重复源(URL、关键字或数据)已在此指令中列出,并且将被忽略。 删除已标识的重复源。
    CSP14308 “无法解析 [policy type] 中的 [directive name] 指令。” 已标识的指令已失败。有关如何编写受支持的指令的引用列表,请参阅 http://content-security-policy.com/ 指令必须用分号分隔。例如,如果你有一个从内容传送网络 (https://cdn.example.net) 加载其所有资源的应用程序,并且知道你不需要带框架的内容或任何插件,则你的策略可能如下所示: Content-Security-Policy: default-src https://cdn.example.net; child-src 'none'; object-src 'none'。*尽管指令用分号分隔,但指令内的源不用分号分隔,而应仅用空格分隔。
    CSP14309 [policy type] 中的 [directive name] 的未知指令 – 指令将被忽略。” CSP 策略中设置的指令是未知指令,并且将被忽略。 有关受支持的指令的列表,请参阅 http://content-security-policy.com/
    CSP14310 [policy type] 中的不受支持的指令 [directive name] – 指令将被忽略。” 解析期间在策略类型(即 Content-Security-policy-Report-Only 标头字段)中找到了不受支持的指令,该指令将被忽略。 有关受支持的指令,请参阅 http://content-security-policy.com/ 删除不受支持的指令。*某些指令在 <meta> 元素中或在 Content-Security-policy-Report-Only 标头字段中不受支持。
    CSP14311 “已在 [policy type] 中提供指令 [directive name] – 重复指令将被忽略。” 在解析期间找到了重复指令,第二个指令及其源表达式将被忽略。 删除重复的脚本。
    CSP14312 [policy type] 中的资源违反指令 [directive name][target uri]。资源将被阻止。” 在此示例中:“主机定义策略中的资源违反指令 ‘script-src ms-appx: data: ‘unsafe-eval’:内联脚本。资源将被阻止。”内联脚本(目标 URI)由于“主机定义”策略中的指令 ‘script-src ms-appx: data: ‘unsafe-eval’ 而被阻止。 由于用户代理无法确定内联脚本是否由攻击者注入,因此作者需要将所有内联脚本和样式移到外部。删除内联脚本并将其放在外部文件中。
    CSP14313 [policy type] 中的资源违反指令 [directive name][target uri]。 由于策略为仅报告,因此不会阻止资源。” 资源已标识为违反 Content-Security-policy-Report-Only 标头字段中指定的指令。由于它在仅报告策略类型内,因此将不会阻止该资源。 如果为了保护站点而应该阻止此资源,请将该指令移到 Content-Security-policy 标头字段中。
    CSP14314 “由于 [reason for canceling the operation],无法将策略违反报告发送到 [target destination uri]。” 报告策略违反时出现问题,应标识报告指定要发送到的目标和未发送的原因。 report-uri 指令指定一个 URL,浏览器将在违反内容安全策略时向该 URL 发送报告。*它可在 <meta> 标记中使用。
    CSP14315 “由于 [reason for canceling the operation],无法强制执行 [policy type] 中的沙盒指令。” 沙盒指令由于已指定的原因而失败。此指令将对可在页面上执行的操作施加限制,而不对页面可加载的资源施加限制。如果存在沙盒指令,该页面将视为它从 Iframe 内部加载。这可以阻止弹出窗口、插件并阻止脚本执行。 使沙盒值保留为空以保持所有限制就位,或添加值: allow-forms allow-same-origin allow-scripts, and allow-top-navigation。*沙盒指令在 <meta> 元素或在 Content-Security-policy-Report-Only 标头字段中不受支持。
    CSP14316 “由于主机替代而允许脚本 eval。” 当包括 script-srcdefault-src 指令时,禁用内联脚本和 eval (),除非分别指定“unsafe-inline”和“unsafe-eval”。 'unsafe-eval' 允许使用 eval() 和类似方法从字符串创建代码。必须包含单引号。 请注意:此操作不安全,并且可能使你的网站暴露在跨站点脚本漏洞中。
    CSP14317 “由于主机替代而允许框架 [source name]。” 由于主机 CSP 策略中的替代集,已允许已标识的源框架。 *策略可包含 nonce-source 表达式,这意味着源只能在一种情况下使用,并且服务器必须在其每次传输策略时为指令生成一个新值。Nonce 在其所在的指令中替换限制。

    https://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=ZH-CN&k=k(VS.WebClient.Help.HTML1300)

  • 利用flash实现点击按钮复制指定内容到剪切板

    js 点击按钮 复制 剪切板

    兼容IE7以上包括IE7

    利用flash实现点击按钮复制指定内容到剪切板,类似这样的效果有很多,如图:

    copy_ok

    使用FLASH的兼容性比较好因为大多数电脑都安装了FLASH,谷歌默认安装就内置了FLASH,剩下是火狐需要另外安装,不管绝大还是兼容其他浏览器的。

    测试包下载:zxx_clipboard

    http://www.zhangxinxu.com/wordpress/?p=1037

     

     

    尽然是使用FLASH的还有另外一款插件jquery.zclip.js

     $(function () {
      $('a[rel]').zclip({ 
       path:'ZeroClipboard.swf', //记得把ZeroClipboard.swf引入到项目中 
       copy: function () { 
          return $(this.getAttribute('rel')).html(); 
       },
       setHandCursor: true, //默认是手型
       // beforeCopy:function(){ document.title='复制前执行'; }, //复制前执行
       // afterCopy:function(){ document.title='复制后执行'; }
      });
     });

    http://pan.baidu.com/s/1sk1qG0X