if( X_XHR_createMSXML ){\r
( function(){\r
var x = '.XMLHTTP',\r
- m = 'MSXML2' + x,\r
- n = [ m + ".6.0", m + ".3.0", m + ".5.0", m + ".4.0", m, "Microsoft" + x ],\r
+ m = 'Msxml2' + x,\r
+ n = [ m + '.6.0', m + '.3.0', m + '.5.0', m + '.4.0', m, 'Microsoft' + x ],\r
v = [ 6, 3, 5, 4, 2, 1 ],\r
i = -1,\r
a;\r
* http://hakuhin.jp/as/javascript.html\r
* Flash から JavaScript にアクセスする(3+)\r
*/\r
- 'FLASH' : 4 <= X_Pulgin_FLASH_VERSION ? 8 : 0,\r
+ 'FLASH' : 4 <= X_Plugin_FLASH_VERSION ? 8 : 0,\r
\r
'GADGET' : 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ] ? 16 : 0,\r
\r
postdata = obj[ 'postdata' ] || '',\r
timeout = obj[ 'timeout' ] || 20000,\r
noCache = obj[ 'cache' ] !== true,\r
+ dataType = X_XHR._dataType = obj[ 'dataType' ], // 明示され無い場合、ext が入っている\r
xDomain = !X_URL_isSameDomain( url ),\r
isFile = X_URL_isLocal( url ),\r
init,\r
type, tmp, p;\r
-\r
- X_XHR._dataType = obj[ 'dataType' ];\r
\r
if( !raw || xDomain !== X_XHR._isXDR || ( X_XHR_createMSXML && isFile !== X_XHR._isMsXML ) ){\r
raw && X_XHR[ 'unlisten' ]( [ 'load', 'readystatechange', 'progress', 'error', 'timeout' ] );\r
raw.open( method, url, async, username, password );\r
\r
if( raw.responseType !== undefined ){\r
- switch( X_XHR._dataType ){\r
+ switch( dataType ){\r
case '' :\r
+ case 'txt' :\r
case 'text' :\r
// js, css\r
- raw.responseType = 'text';\r
+ raw.responseType = X_XHR._dataType = 'text';\r
break;\r
case 'json' : // firefox9- は moz-json\r
- raw.responseType = X_UA[ 'Gecko' ] < 10 ? 'moz-json' : X_UA[ 'Gecko' ] ? X_XHR._dataType : ''; // Iron 37 でエラー\r
+ raw.responseType = X_UA[ 'Gecko' ] < 10 ? 'moz-json' : X_UA[ 'Gecko' ] ? dataType : ''; // Iron 37 でエラー\r
+ X_XHR._dataType = 'json';\r
break;\r
case 'document' :\r
case 'xml' :\r
case 'html' :\r
case 'htm' :\r
- // svg\r
- raw.responseType = 'document';\r
+ case 'svg' :\r
+ case 'vml' :\r
+ raw.responseType = X_XHR._dataType = 'document';\r
break;\r
case 'blob' :\r
case 'arraybuffer' :\r
// jpeg,jpg,png,gif,mp3,ogg...\r
- raw.responseType = X_XHR._dataType;\r
+ raw.responseType = X_XHR._dataType = dataType;\r
break;\r
};\r
};\r
\r
// http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_r_1.html\r
if( !X_XHR._isMsXML && raw.overrideMimeType ){\r
- type = X_URL_getEXT( url ) || X_XHR._dataType;\r
- switch( type ){\r
+ switch( type = dataType ){\r
+ case 'document' :\r
+ case 'xml' :\r
case 'html' :\r
case 'htm' :\r
- case 'xml' :\r
+ case 'svg' :\r
+ case 'vml' :\r
tmp = 'text/xml';\r
break;\r
case 'json' :\r
tmp = 'application/json';\r
break;\r
case 'mp3' :\r
- type = 'mpeg'; \r
+ tmp = 'mpeg'; \r
case 'weba' :\r
- type = type || 'webm'; \r
+ tmp = tmp || 'webm'; \r
case 'opus' :\r
- type = type || 'ogg';\r
+ tmp = tmp || 'ogg';\r
case 'ogg' : \r
case 'wav' : \r
case 'aac' :\r
- tmp = 'audio/' + type;\r
+ tmp = 'audio/' + ( tmp || type );\r
break;\r
case 'm4a' :\r
case 'mp4' :\r
tmp = 'audio/x-' + type;\r
break;\r
+ case 'jpeg' :\r
+ case 'jpg' :\r
+ case 'png' :\r
+ case 'gif' :\r
+ case 'bmp' :\r
+ case 'ico' :\r
+ tmp = 'text/plain; charset=x-user-defined';\r
+ break;\r
+ \r
};\r
- if( tmp = obj[ 'mimeType' ] || tmp ) raw.overrideMimeType( tmp );\r
+ if( obj[ 'mimeType' ] || tmp ) raw.overrideMimeType( obj[ 'mimeType' ] || tmp );\r
};\r
\r
if( !X_XHR._isXDR && ( X_XHR._isMsXML ? 3 <= X_XHR_msXMLVer : raw.setRequestHeader ) ){ // msxml は setRequestHeader getter がいけない\r
headers[ 'Cache-Control' ] = 'no-cache';\r
headers[ 'If-Modified-Since' ] = 'Thu, 01 Jun 1970 00:00:00 GMT';\r
} */\r
- \r
- // http://nakigao.sitemix.jp/blog/?p=2040\r
- // json 取得時に SafariでHTTP/412のエラー。但し相手が audio の場合この指定があるとロードに失敗する。 iOS8.2, iOS7.1 では遭遇せず\r
- if( X_XHR._dataType === 'json' ){\r
- headers[ 'If-Modified-Since' ] = ( new Date ).toUTCString();\r
+\r
+ // http://8note.phpapps.jp/jquery-ajax%E3%81%A7%E3%81%AE412%E3%82%A8%E3%83%A9%E3%83%BC/\r
+ if( dataType === 'json' && X_UA[ 'Safari' ] ){\r
+ headers[ 'If-Modified-Since' ] = 'Thu, 01 Jun 1970 00:00:00 GMT';\r
};\r
\r
// http://boscono.hatenablog.com/entry/2013/12/23/152851\r
handleEvent : function( e ){\r
var raw = X_XHR[ '_rawObject' ],\r
live = !X_XHR._canceled,\r
- headers, status, data;\r
+ headers, status, text, data;\r
\r
switch( e && e.type || 'readystatechange' ){\r
/*\r
2: リクエストを受信した\r
3: リクエストの処理中\r
4: リクエストは終了してレスポンスの準備が完了\r
- status 200: "OK"\r
+ status 200: 'OK'\r
404: Page not found\r
\r
If-Modified-Sinceヘッダを利用してWebページのキャッシュを行うXMLHttpRequestラッパー\r
){\r
/*\r
* opera8, safari2, khtml3 で utf8 日本語文字列の文字化け\r
+ * \r
+ * http://www.kawa.net/works/js/jkl/parsexml.html\r
+ \r
+ text = raw[ 'responseText' ];\r
+ // Safari and Konqueror cannot understand the encoding of text files.\r
+ if( text && ( X_UA[ 'Webkit' ] < 420 || X_UA[ 'KHTML' ] < 4 ) ){\r
+ text = escape( text );\r
+ if ( !text.match( '%u' ) && esc.match( '%' ) ){\r
+ text = decodeURIComponent( text );\r
+ };\r
+ };\r
*/\r
\r
// parse json, html, xml, text, script, css\r
switch( X_XHR._dataType ){\r
- case '' :\r
case 'text' :\r
- data = raw[ 'responseText' ];\r
+ data = X_Script_try( X_Object_find, [ raw, 'responseText' ] );\r
break;\r
case 'json' :\r
- case 'moz-json' :\r
- data = raw[ 'response' ] || raw[ 'responseText' ];\r
+ data = X_Script_try( X_Object_find, [ raw, 'response' ] ) || X_Script_try( X_Object_find, [ raw, 'responseText' ] );\r
// eval() を使っているけど JSON の無いブラウザは XDomain な XHR はできないのでよしとする。\r
// XDomain な XHR の際は Flash 等で代替し、その中に Json parser も組み込む。\r
// http://d.hatena.ne.jp/sshi/20060904/p1\r
- if( !X_Type_isObject( data ) ) data = X_JSON_parseTrustableString( data );\r
+ if( X_Type_isString( data ) ) data = X_JSON_parseTrustableString( data );\r
break;\r
case 'document' :\r
- case 'xml' :\r
- case 'html' :\r
- case 'htm' :\r
- // svg, vml, xaml, xul, mxml ??\r
data = raw[ 'responseXML' ] || raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず\r
break;\r
case 'blob' :\r
case 'arraybuffer' :\r
+ // TODO resoponceBody if( X_UA[ 'IE' ] < 10 )\r
+ // http://d.hatena.ne.jp/maachang/20130221/1361427565\r
data = raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず\r
break;\r
};\r
+ };\r
+ \r
+ if( data ){\r
X_XHR[ 'asyncDispatch' ]( 32, { type : X_EVENT_SUCCESS, status : status || 200, response : data, 'headers' : headers || null } );\r
} else {\r
X_XHR[ 'asyncDispatch' ]( 32, { type : X_EVENT_ERROR, status : status || 400, 'headers' : headers || null } );\r
// return: XML DOM in response body\r
\r
JKL.ParseXML.HTTP.prototype.documentElement = function() {\r
- // debug.print( "documentElement: "+this.req );\r
+ // debug.print( 'documentElement: '+this.req );\r
if ( ! this.req ) return;\r
if ( this.req.responseXML ) {\r
return this.req.responseXML.documentElement; // XMLHTTPRequest\r
return this.req.documentElement; // IXMLDOMDocument\r
}\r
};\r
-\r
-// ================================================================\r
-// method: responseText()\r
-// return: text string in response body\r
-\r
-JKL.ParseXML.HTTP.prototype.responseText = function() {\r
- // debug.print( "responseText: "+this.req );\r
- if ( ! this.req ) return;\r
-\r
- // Safari and Konqueror cannot understand the encoding of text files.\r
- if ( navigator.appVersion.match( "KHTML" ) ) {\r
- var esc = escape( this.req.responseText );\r
-// debug.print( "escape: "+esc );\r
- if ( ! esc.match("%u") && esc.match("%") ) {\r
- return decodeURIComponent(esc);\r
- }\r
- }\r
-\r
- return this.req.responseText;\r
-};\r
*/\r
\r
onTimeout : function(){\r