X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F06_net%2F01_XNetXHR.js;h=13ee2f9c2338aadd73cd1613f190099fed1a7bcf;hb=9e04e2a1221a92960a74e550bc3fd809caf3cd1c;hp=411de411028358b817d5959092e302b37110c59e;hpb=1ed2190f012cf923f7e48d3c0d122aa56c56c5f3;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/06_net/01_XNetXHR.js b/0.6.x/js/06_net/01_XNetXHR.js index 411de41..13ee2f9 100644 --- a/0.6.x/js/06_net/01_XNetXHR.js +++ b/0.6.x/js/06_net/01_XNetXHR.js @@ -43,6 +43,17 @@ IE8 以下で xhr の失敗率が高い問題 http://tkengo-totoro.blogspot.jp/2011/11/iexmlhttprequest.html TODO クライアント側にもリトライ機構を入れてみる + +TODO xml の取得には XMLDOM を使用する +var activex = JKL.ParseXML.HTTP.ACTIVEX_XMLHTTP; // IXMLHttpRequest +if ( this.method == "GET" && ! this.textmode ) { + // use IXMLDOMElement to accept any mime types + // because overrideMimeType() is not available on IE6 + activex = JKL.ParseXML.HTTP.ACTIVEX_XMLDOM; // IXMLDOMElement +}; +// debug.print( "new ActiveXObject( '"+activex+"' )" ); +this.req = new ActiveXObject( activex ); + */ var // Opera7.6+, Safari1.2+, khtml3.?+, Gecko0.9.7+ // ie9- ではローカルリソースには MSXML を使う @@ -103,7 +114,7 @@ X[ 'XHR' ] = { * http://hakuhin.jp/as/javascript.html * Flash から JavaScript にアクセスする(3+) */ - 'FLASH' : X_Pulgin_FLASH_ENABLED && 4 <= X_Pulgin_FLASH_VERSION ? 8 : 0, + 'FLASH' : 4 <= X_Pulgin_FLASH_VERSION ? 8 : 0, 'GADGET' : 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ] ? 16 : 0, @@ -160,12 +171,11 @@ if( X_XHR_w3c || X_XHR_msXML ){ postdata = obj[ 'postdata' ] || '', timeout = obj[ 'timeout' ] || 20000, noCache = obj[ 'cache' ] !== true, + dataType = X_XHR._dataType = obj[ 'dataType' ], xDomain = !X_URL_isSameDomain( url ), isFile = X_URL_isLocal( url ), init, type, tmp, p; - - X_XHR._dataType = obj[ 'dataType' ]; if( !raw || xDomain !== X_XHR._isXDR || ( X_XHR_createMSXML && isFile !== X_XHR._isMsXML ) ){ raw && X_XHR[ 'unlisten' ]( [ 'load', 'readystatechange', 'progress', 'error', 'timeout' ] ); @@ -192,14 +202,14 @@ if( X_XHR_w3c || X_XHR_msXML ){ raw.open( method, url, async, username, password ); if( raw.responseType !== undefined ){ - switch( X_XHR._dataType ){ + switch( dataType ){ case '' : case 'text' : // js, css raw.responseType = 'text'; break; case 'json' : // firefox9- は moz-json - raw.responseType = X_UA[ 'Gecko' ] < 10 ? 'moz-json' : X_UA[ 'Gecko' ] ? X_XHR._dataType : ''; // Iron 37 でエラー + raw.responseType = X_UA[ 'Gecko' ] < 10 ? 'moz-json' : X_UA[ 'Gecko' ] ? dataType : ''; // Iron 37 でエラー break; case 'document' : case 'xml' : @@ -211,14 +221,14 @@ if( X_XHR_w3c || X_XHR_msXML ){ case 'blob' : case 'arraybuffer' : // jpeg,jpg,png,gif,mp3,ogg... - raw.responseType = X_XHR._dataType; + raw.responseType = dataType; break; }; }; // http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html if( !X_XHR._isMsXML && raw.overrideMimeType ){ - type = X_URL_getEXT( url ) || X_XHR._dataType; + type = X_URL_getEXT( url ) || dataType; switch( type ){ case 'html' : case 'htm' : @@ -243,6 +253,15 @@ if( X_XHR_w3c || X_XHR_msXML ){ case 'mp4' : tmp = 'audio/x-' + type; break; + case 'jpeg' : + case 'jpg' : + case 'png' : + case 'gif' : + case 'bmp' : + case 'ico' : + tmp = 'text/plain; charset=x-user-defined'; + break; + }; if( tmp = obj[ 'mimeType' ] || tmp ) raw.overrideMimeType( tmp ); }; @@ -258,7 +277,7 @@ if( X_XHR_w3c || X_XHR_msXML ){ // http://nakigao.sitemix.jp/blog/?p=2040 // json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず - if( X_XHR._dataType === 'json' ){ + if( dataType === 'json' ){ headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString(); }; @@ -369,7 +388,7 @@ if( X_XHR_w3c || X_XHR_msXML ){ handleEvent : function( e ){ var raw = X_XHR[ '_rawObject' ], live = !X_XHR._canceled, - headers, status, data; + headers, status, text, data; switch( e && e.type || 'readystatechange' ){ /* @@ -424,7 +443,7 @@ if( X_XHR_w3c || X_XHR_msXML ){ headers = { 'Content-Type' : raw.contentType }; } else if( ( X_XHR._isMsXML ? 3 <= X_XHR_msXMLVer : raw.setRequestHeader ) && ( headers = raw.getAllResponseHeaders() ) ){ - headers = X_NET_XHR_parseResponseHeaders( headers ); + headers = X_XHR_parseResponseHeaders( headers ); }; // https://code.google.com/p/fakeworker-js/source/browse/src/javascript/fakeworker.js @@ -439,6 +458,17 @@ if( X_XHR_w3c || X_XHR_msXML ){ ){ /* * opera8, safari2, khtml3 で utf8 日本語文字列の文字化け + * + * http://www.kawa.net/works/js/jkl/parsexml.html + + text = raw[ 'responseText' ]; + // Safari and Konqueror cannot understand the encoding of text files. + if( text && ( X_UA[ 'Webkit' ] < 420 || X_UA[ 'KHTML' ] < 4 ) ){ + text = escape( text ); + if ( !text.match( '%u' ) && esc.match( '%' ) ){ + text = decodeURIComponent( text ); + }; + }; */ // parse json, html, xml, text, script, css @@ -464,6 +494,8 @@ if( X_XHR_w3c || X_XHR_msXML ){ break; case 'blob' : case 'arraybuffer' : + // TODO resoponceBody if( X_UA[ 'IE' ] < 10 ) + // http://d.hatena.ne.jp/maachang/20130221/1361427565 data = raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず break; }; @@ -494,7 +526,25 @@ if( X_XHR_w3c || X_XHR_msXML ){ break; }; }, - + +/* + * http://www.kawa.net/works/js/jkl/parsexml.html + * +// ================================================================ +// method: documentElement() +// return: XML DOM in response body + +JKL.ParseXML.HTTP.prototype.documentElement = function() { + // debug.print( "documentElement: "+this.req ); + if ( ! this.req ) return; + if ( this.req.responseXML ) { + return this.req.responseXML.documentElement; // XMLHTTPRequest + } else { + return this.req.documentElement; // IXMLDOMDocument + } +}; + */ + onTimeout : function(){ var raw = X_XHR[ '_rawObject' ], live = !X_XHR._canceled || !X_XHR._busy; @@ -529,7 +579,7 @@ if( X_XHR_w3c || X_XHR_msXML ){ * 複数の情報が存在する場合、改行で区切られています。 */ -function X_NET_XHR_parseResponseHeaders( headerStr ){ +function X_XHR_parseResponseHeaders( headerStr ){ var headers = {}, headerPairs, i = 0, l, headerPair, index, key, val; if( !headerStr ) return headers;