web通信

it2022-05-08  9

//region AJAX    function Ajax( arg ) {        arg = W.defaultArg( arg, {            requestHeader : {},            type : "get",            url : url,            asyn : true,            data : null,            onLoad : null,            onLoadStart : null,            onLoadEnd : null,            onError : null,            onProgress : null,            timeout : null,            onTimeout : null,            upload : null,            withCredentials : false, //携带证书            isJson : false,            xml : false,            overrideMimeType : null  //如“text/xml”

        } );

        var xhr = W.createXHR();

        xhr.onreadystatechange = function () { //onreadystatechange必须在open前            if ( xhr.readyState == 4 ) {                if ( (xhr.status >= 200 && xhr.status < 300) || xhr.status == 304 ) { //304表示请求的资源未被修改 可以使用缓存的版本                    var responseData = xhr.responseText;                    if ( arg.isJson ) {                        responseData = JSON.parse( responseData );                    }                    arg.onLoad && arg.onLoad( responseData ); //response responseText responseType responseURL responseXML                }                else {                    arg.onError && arg.onError( xhr.onerror );                    console.error( "Request was unsuccessful: " + xhr.onerror );                }            }        };

        xhr.open( arg.type, arg.url, arg.asyn );

        W.loopObj( arg.requestHeader, function ( key, value ) {  //setRequestHeader必须在open后 send前            xhr.setRequestHeader( key, value );  //xhr.setRequestHeader(key) xhr.setAllRequestHeaders()        } );

        if ( arg.overrideMimeType && typeof xhr.overrideMimeType != "undefined" ) {//overrideMimeType必须在open后 send前            xhr.overrideMimeType( arg.overrideMimeType ); //强迫XHR对象将响应当作overrideMimeType 如xml而非纯文本处理        }

        xhr.send( arg.data );

        return xhr;    }

//跨域请求 客户端设置Origin:http://www.zodiac.com    // 服务端设置Access-Control-Allow-Origin:http://www.zodiac.com或者Access-Control-Allow-Origin:*    function createCORSRequest( type, url, onLoad ) {        var xhr = new XMLHttpRequest();        if ( "withCredentials" in xhr ) {            xhr.open( type, url );        }        else if ( typeof XDomainRequest != "undefined" ) {            xhr = new XDomainRequest();            xhr.open( type, url );        }        else {            xhr = null;        }        onLoad && xhr.onload( onLoad );        xhr.send();        return xhr;    }

    //endregion

   //region其他跨域技术 不需要修改服务端

    //图像Ping 使用<img>标签

    var url = "http://www.dell.com/?name=zodiac";    function imgPing( url, callBack ) {        var img = new Image();        img.onload = img.onerror = callBack;        //do something  通常用来跟踪用户点击页面或者广告的曝光次数        //优点:不修改服务器代码  简单 单向        //不足:1只能发送GET请求 2无法访问服务器的响应脚本 只是浏览器与服务器间的单向通行        img.src = url;    }    imgPing( url, function () {        //        alert(1);    } );

   //JSONP    //优点:<script>标签和<img>标枪类似的拥有不受限制地从其他域加载资源 与图像PING相比优点在于可以直接访问响应文本,支持浏览器和服务器间的双向通信    //不足:1.JSONP从其他域加载javascript 不能保证其安全性 可能含有恶意代码 2.无法确定JSONP是否请求失败 不得不使用计时器看是否接收了响应    function handleResponse( response ) {        W.log( response );        response && alert( "IP address: " + response.ip                + "<br/>city: " + response.city                + "<br/>region_name: " + response.region_name );    }

    var src = "http://www.dell.com/";    function JSONP( src, callBack ) {        var script = document.createElement( "script" );        script.src = src + "?" + "callback=" + callBack;        document.body.insertBefore( script, document.body.firstChild );    }    JSONP( src, handleResponse );

    //endregion

    //region Comet 服务器推送

    // P588 javascript高级程序设计 分长轮询和HTTP流2种 待完善

    //为Comet创建的2个新接口 SSE API和Web Sockets

    //SSE API  Server-Sent Events  ie不支持

    var source = new EventSource( "myEvent.php" );    //事件有open message error    source.onmessage = function ( event ) {        var data = event.data;    };    //默认情况下 EventSource对象会保持和服务器的活动连接。如果连接断开,还会重新连接。意味着SSE适合长轮询和HTTP流 也使用close断开    source.close();

    //Web Sockets 全双工 双向的通信 使用自定义协议ws 而不是使用http协议 ie不支持

    var socket = new WebSocket( "ws://www.zodiac.com" ); //同源策略对socket不适用 因此可以通过socket打开任何站点链接

    socket.send( "Hello World" );    //只能发送纯文本 可以使用JSON.stringify 字符串花

    socket.onmessage = function ( event ) {        var data = event.data;    };    socket.onclose = function ( event ) {        W.log( event.wasClean + "  " + event.code + "   " + event.reason );    };

    //状态值 WebSocket.OPENING(0) WebSocket.OPEN(1) WebSocket.CLOSING(2) WebSocket.CLOSE(3)    socket.close();

    //endregion

转载于:https://www.cnblogs.com/zodiacblog/p/3981130.html

相关资源:基于Qt WebChannel实现QT与HTML页面通信

最新回复(0)