X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F06_net%2F01_XNetXHR.js;h=d882cc1e2582a46786a41631c119093206d66b2b;hb=a3d03e96ad8c0392ef683eb6c64421e094b96958;hp=dad1597c77ee1c46c78c268864ef9af7d554a3f9;hpb=8e74cf066ea48ec8cf34efb2b5e84725c10c813a;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 dad1597..d882cc1 100644 --- a/0.6.x/js/06_net/01_XNetXHR.js +++ b/0.6.x/js/06_net/01_XNetXHR.js @@ -31,6 +31,7 @@ http://d.hatena.ne.jp/sshi/20060904/p1 itozyun 2014-10-30 20:55:41 basic 認証のかかったhtml を表示して、そのjsが xhr をすると Android1.6 では 401 error が返る。Android 2.3 では解決している。 Android1.6- の XHR で 401 エラーが返った場合は、iframe に xml を表示させてその内容を取ればサーバ側の対応無しでいけるかも? +Android2 にも xdomain な GET が一回しかできない問題 gears 使えない? IE9 で 画像バイナリの取得 VBA をかましている http://web.archive.org/web/20130808105151/http://gurimmer.lolipop.jp/daihakken/2012/05/22/javascriptajaxxmlhttprequest%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Fajax%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89 @@ -110,7 +111,9 @@ X[ 'XHR' ] = { 'UPLOAD_PROGRESS' : X_Net_XHR_upload, // or gadget proxy or flash - 'CORS' : X_Net_XHR_xdr || X_Net_XHR_cors + 'CORS' : X_Net_XHR_xdr || X_Net_XHR_cors, + + 'BINARY' : X_Pulgin_VBS_ENABLED }; if( X_Net_XHR_msXMLVer ) X[ 'XHR' ][ 'MSXML_VERSION' ] = X_Net_XHR_msXMLVer; @@ -155,7 +158,7 @@ X_TEMP.X_Net_XHR_params = { xDomain = !X_URL_isSameDomain( url ), isFile = X_URL_isLocal( url ), init, - tmp; + tmp, p; this._dataType = obj[ 'dataType' ]; @@ -190,9 +193,8 @@ X_TEMP.X_Net_XHR_params = { // js, css raw.responseType = 'text'; break; - case 'json' : - case 'moz-json' : // firefox9- - raw.responseType = X_UA[ 'Gecko' ] ? this._dataType : ''; // Iron 37 でエラー + case 'json' : // firefox9- は moz-json + raw.responseType = X_UA[ 'Gecko' ] < 10 ? 'moz-json' : X_UA[ 'Gecko' ] ? this._dataType : ''; // Iron 37 でエラー break; case 'document' : case 'xml' : @@ -211,11 +213,15 @@ X_TEMP.X_Net_XHR_params = { // http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html if( !this._isMsXML && raw.overrideMimeType ){ - switch( X_URL_getEXT( url ) ){ + switch( X_URL_getEXT( url ) || this._dataType ){ case 'html' : + case 'htm' : case 'xml' : tmp = 'text/xml'; break; + case 'json' : + tmp = 'application/json'; // 2015.6.29 + break; case 'mp3' : tmp = 'audio/mpeg'; @@ -250,9 +256,10 @@ X_TEMP.X_Net_XHR_params = { headers[ 'Pragma' ] = 'no-cache'; headers[ 'Cache-Control' ] = 'no-cache'; headers[ 'If-Modified-Since' ] = 'Thu, 01 Jun 1970 00:00:00 GMT'; - } else */ + } */ + // http://nakigao.sitemix.jp/blog/?p=2040 - // json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合、この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず + // json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず if( this._dataType === 'json' ){ headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString(); }; @@ -431,12 +438,11 @@ X_TEMP.X_Net_XHR_params = { ( 200 <= status && status < 400 ) || //status === 304 || ( status === 1223 && ( status = 204 ) ) || - ( X_UA[ 'Webkit' ] && status === undefined && ( status = 200 ) ) // safari: /webkit/.test(userAgent) + ( X_UA[ 'Webkit' ] && status === undefined ) // safari: /webkit/.test(userAgent) ){ /* * opera8, safari2, khtml3 で utf8 日本語文字列の文字化け */ - // raw.getAllResponseHeaders(); // parse json, html, xml, text, script, css switch( X_NET_XHRWrapper._dataType ){ @@ -450,7 +456,7 @@ X_TEMP.X_Net_XHR_params = { // eval() を使っているけど JSON の無いブラウザは XDomain な XHR はできないのでよしとする。 // XDomain な XHR の際は Flash 等で代替し、その中に Json parser も組み込む。 // http://d.hatena.ne.jp/sshi/20060904/p1 - if( !X_Type_isObject( data ) ) data = X_String_parseTrustedJsonString( data ); + if( !X_Type_isObject( data ) ) data = X_JSON_parseTrustableString( data ); break; case 'document' : case 'xml' : @@ -464,17 +470,16 @@ X_TEMP.X_Net_XHR_params = { data = raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず break; }; - - X_NET_XHRWrapper[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, data : data, headers : headers || null } ); + X_NET_XHRWrapper[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, response : data, 'headers' : headers || null } ); } else { - X_NET_XHRWrapper[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : raw.status || 0, 'percent' : 100, headers : headers || null } ); + X_NET_XHRWrapper[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : status || 400, 'headers' : headers || null } ); }; break; case 'progress' : if( e.lengthComputable ){ - X_NET_XHRWrapper._percent = e.loaded / e.total; - live && X_NET_XHRWrapper[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : X_NET_XHRWrapper._percent } ); + X_NET_XHRWrapper._percent = e.loaded / e.total * 100; + live && X_NET_XHRWrapper._percent < 100 && X_NET_XHRWrapper[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : X_NET_XHRWrapper._percent } ); }; break; @@ -488,7 +493,7 @@ X_TEMP.X_Net_XHR_params = { case 'timeout' : // Gecko 12.0 https://developer.mozilla.org/ja/docs/XMLHttpRequest/Synchronous_and_Asynchronous_Requests X_NET_XHRWrapper._busy = false; X_NET_XHRWrapper._error = !!X_UA[ 'Gecko' ]; - X_NET_XHRWrapper[ 'asyncDispatch' ]( X_EVENT_TIMEOUT ); + X_NET_XHRWrapper[ 'asyncDispatch' ]( { type :X_EVENT_ERROR, 'timeout' : true, status : 408 } ); break; }; }, @@ -499,16 +504,18 @@ X_TEMP.X_Net_XHR_params = { if( live || raw.readyState < 3 ){ this._busy = false; - live && this[ 'asyncDispatch' ]( X_EVENT_TIMEOUT ); + live && this[ 'asyncDispatch' ]( { type : X_EVENT_ERROR, 'timeout' : true, status : 408 } ); }; this._timerID = 0; }, onUploadProgress : X_Net_XHR_upload && function( e ){ - var raw = X_NET_XHRWrapper[ '_rawObject' ].upload, - live = !X_NET_XHRWrapper._canceled, - states, data; - live && X_NET_XHRWrapper[ 'asyncDispatch' ]( { type : X_EVENT_PROGRESS, 'percent' : X_NET_XHRWrapper._percent, 'uploadPercent' : ( e.loaded / e.total ) } ); + !X_NET_XHRWrapper._canceled && + X_NET_XHRWrapper[ 'asyncDispatch' ]( { + type : X_EVENT_PROGRESS, + 'percent' : X_NET_XHRWrapper._percent, + 'uploadPercent' : e.loaded / e.total * 100 + } ); } }; // 同期リクエストでなければならない場合, unload, beforeunload時 @@ -527,7 +534,7 @@ X_TEMP.X_Net_XHR_params = { */ function X_NET_XHR_parseResponseHeaders( headerStr ){ - var headers = {}, headerPairs, i = 0, l, headerPair, index, key, value; + var headers = {}, headerPairs, i = 0, l, headerPair, index, key, val; if( !headerStr ) return headers;