zoukankan      html  css  js  c++  java
  • javascript权威指南第21章 Ajax和Comet

    function createXHR(){
        if(typeof XMLHttpRequest !='undefined'){
            return new XMLHttpRequest();
        }else if(typeof ActiveXObject!='undefined'){
    
            if(typeof arguments.callee.ActiveXString!='string'){
    
                var versions =['MSXML2.XMLHttp.6.0','MSXML2.XMLHttp.3.0','MSXML2.XMLHttp'],i,len;
                
                for(i=0,len=versions.length;i<len;i++){
                    try {
                        //判断是否能成功创建当前版本的ActiveObject
                        new ActiveXObject(versions[i]);
                        arguments.callee.ActiveXString =versions[i]; //如果能设置当前对象的参数
                        break;
                    } catch (error) {
                        //跳过
                    }
                }
            }
            return new ActiveXObject(arguments.callee.ActiveXString); //根据当前函数的参数创建ActiveXObject
        }
        else{
            throw new Error('No XHR object avilable.');
        }
    }
    
    //创建 xhr
    
    var xhr = createXHR();
    
    xhr.onreadyStatechange =function(){
        if(xhr.readySate ==4){
            if(xhr.status>=200 && xhr.status<300|| xhr.status==304){
                var responseText = xhr.responseText;
            }else{
                //请求未正常得到结果
                alert('Request was unsuccessful:'+xhr.status);
            }
        }
    }
    xhr.open('get','example.php',false); // 参数 get/post url async
    xhr.send(null); //send接收请求主体发送的数据,如果get 可以设置成null
    xhr.abort(); //取消请求
    
    //21.1.2 HTTP头部信息
    
    xhr.setRequestHeader('MyHeader','MyValue'); //设置请求头信息
    
    //post 提交
    xhr.open('post','url',true);
    var form = document.getElementById('user-info');
    xhr.send(serialize(form)); //序列化form表单数据并且提交表单
    
    //21.2.1 FormData
    //为优化post 提交xmlhttprequest定义了FormData
    var data =new FormData();
    data.append('name','Nicholas');
    xhr.send(data);
    
    var form =document.getElementById('user-info');
    xhr.send(new FormData(form));
    
    //21.2.2 超时设定
    xhr.timeout =1000; //设置1秒
    xhr.ontimeout =function(){
        alert('Request did not return in a second');
    }
    
    //21.2.3 overrideMimeType() 方法
    xhr.overrideMimeType('text/xml'); //强迫请求对象将响应当着XML而非纯文本处理
    
    //21.3 进度事件
    
    //loadstart 在接收到响应数据的第一个字节触发
    //progress  在接收响应期间持续不断触发
    //error 在请求发生错误时触发。
    //abort 在因为调用abort() 方法而终止链接时触发
    //load  在接收到完整的响应数据时触发
    //loadend 在通信完成或触发 error abort 或 load 事件后触发
    
    xhr.onload =function(){
    
    }
    xhr.onprogress =function(){
    
    }
    
    //21.4 跨源资源共享
    
    //跨域安全是服务端设置的,并非请求端可以设置跨域
    //Access-Control-Allow-Origin:http://www.nczonline.net
    //如果服务端认可这个请求源,则在头部中回发相同的源信息 或者可以回发 Access-Control-Allow-Origin:"*"
    
    //21.4.1 IE对CORS的实现
    
    var xdr = new XDomainRequest();
    
    //21.4.3 Preflighted Requests
    //通过设置请求头信息让服务端判定是否支持该请求
    // Access-Control-Allow-Origin:http://www.nczonline.net
    // Access-Control-Allow-Methods:POST,GET
    // Access-Control-Allow-Headers:NCZ
    // Access-Control-Allow-Age:1728000
    
    //21.4.4 带凭据的请求
    //Access-Control-Allow-Crendentials:true
    
    
    //21.5 其他跨域技术
    //21.5.1 图像ping
     var img =new Image();
     img.onload =img.onerror =function(){
         alert('Done!');
     }
     img.src ='http://www.example.com/text?name=Nicholas';
    
    
     //21.5.2 JSONP
     //通过脚本加载方式实现跨域,因为script与img 类似都可以不受跨域限制
     //<script src='http://localhost:9090/student?callback=showData'></script>
     //服务端返回   showData({name:'mas'}); //构建一个 JSONP 格式的函数执行体,回到客户端就会执行客户端showData函数实现跨域
    
     //21.5.3 Comet
    
     //参看示例  https://www.iteye.com/blog/raising-2271869
    
    
    
     //21.5.4 服务器发送事件
    
     var source = new EventSource('url');
     source.open();
     source.onmessage =function(event){
         var data = event.data;
     };
     source.close();
    
    
     // 21.5.5 Web Sockets
    
     var socket  = new WebSocket('ws://www.example.com/server.php');
     // 实例化WebSocket对象后,浏览器就会马上尝试建立链接,websocket也有一个代表当前状态的
     // readyState 属性 属性值分别为 WebSocket.OPENING(0) 正在建立链接
     //WebSocket.OPEN(1) 已经建立链接
     //WebSocket.CLOSEING(2) 正在关闭链接
     //WebSocket.CLOSE(3) 已经关闭连接
    
     socket.send('hello world!');
     var message ={
         time:new Date(),
         text:"Hello World!",
         clientId:'asdfp8734rew'
     };
     socket.send(JSON.stringify(message));
     //从服务端接收消息
     socket.onmessage =function(event){
         var data = event.data;
         //处理逻辑
     };
     
     socket.onopen =function(event){
    
     };
     socket.onerror =function(event){
    
     };
     socket.onclose =function(event){
         //onclose事件三个特有属性
         //event.wasClean(boolean值,表示是否已经关闭) 
         // event.code(服务器返回的数值状态码) 
         // event.reason (服务器返回的消息)
     }
    

      

  • 相关阅读:
    Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息
    Android 常见adb命令
    禅道项目管理软件 为提交Bug页面添加“优先级”字段
    禅道项目管理软件 为提交Bug页面设置bug必填字段
    Monkey Android app稳定性测试工具之Monkey使用教程
    移动设备 小米2S不显示CD驱动器(H),便携设备,MTP,驱动USB Driver,MI2感叹号的解决方法
    Python Elasticsearch api
    Kafka 集群配置SASL+ACL
    kafka集群搭建
    Zookeeper集群搭建以及python操作zk
  • 原文地址:https://www.cnblogs.com/ms_senda/p/11520183.html
Copyright © 2011-2022 走看看