\r
'PARAMS' : X_URL_PARAMS,\r
\r
+ 'create' : X_URL_create,\r
+ \r
'toAbsolutePath' : X_URL_toAbsolutePath,\r
\r
'isSameDomain' : X_URL_isSameDomain,\r
return result.join( '' );\r
};\r
\r
+function X_URL_create( url, params ){\r
+ if( !X_Type_isObject( params ) || !( params = X_URL_objToParam( params ) ) ) return url;\r
+ \r
+ return url + ( url.indexOf( '?' ) !== -1 ? '&' : '?' ) + params;\r
+};\r
+\r
function X_URL_ParamToObj( str ){\r
- var parts = str.split( '&' ),\r
- i = 0,\r
- l = parts.length,\r
- obj = {},\r
- pair, p;\r
+ var i = 0,\r
+ obj = {},\r
+ parts, l, pair, p;\r
\r
if( !str ) return obj;\r
\r
- for( ; i < l; ++i ){\r
+ for( parts = str.split( '&' ), l = parts.length; i < l; ++i ){\r
pair = parts[ i ];\r
p = pair.indexOf( '=' );\r
if( p === -1 ){\r
*/\r
func : undefined,\r
/**\r
+ * コールバック名。コールバック作成時に関数が無い、関数が入れ替わっていても動作する。\r
+ * @type {string|undefined} \r
+ */\r
+ name : undefined,\r
+ /**\r
* コールバックの this コンテキスト。 \r
* @type {listener|object|undefined}\r
*/\r
if( !listeners || !( list = listeners[ opt_type ] ) ) return false;\r
if( opt_arg1 === undefined ) return X_EventDispatcher_needsIndex ? 0 : true;\r
\r
+ // TODO callbackHash か?判定が不十分!\r
if( opt_arg1.kind ){\r
cbHash = opt_arg1;\r
} else {\r
//node.data = '';\r
l = X_TEMP._removalTextNodes.length;\r
if( parent ){\r
- //!l && X_Timer_once( 0, X_TEMP._timerRemove );\r
- //X_TEMP._removalTextNodes[ l ] = node;\r
- //var str=[],p;\r
- //for( p in node ){\r
- // str[str.length] = p;\r
- //};\r
- //alert( str.join( ',' ) + parent.innerHTML );\r
- //node.nodeValue = '';\r
- //parent.replaceChild( document.createElement( 'span' ), node );\r
- //var e;\r
- //var f = document.createDocumentFragment();\r
- //f.appendChild( e = document.createElement( 'span' ) );\r
- //f.replaceChild( node, e );\r
- //e.appendChild( f );\r
- //parent.appendChild( e = document.createElement( 'span' ) );\r
- //e.appendChild( node );\r
- //parent.removeChild( e );\r
- //node.parentNode = null;\r
- //document.body.appendChild( node );\r
- //parent.replaceChild( document.createComment( '' ), node );\r
+ /*\r
+ !l && X_Timer_once( 0, X_TEMP._timerRemove );\r
+ X_TEMP._removalTextNodes[ l ] = node;\r
+ var str=[],p;\r
+ for( p in node ){\r
+ str[str.length] = p;\r
+ };\r
+ alert( str.join( ',' ) + parent.innerHTML );\r
+ node.nodeValue = '';\r
+ parent.replaceChild( document.createElement( 'span' ), node );\r
+ var e;\r
+ var f = document.createDocumentFragment();\r
+ f.appendChild( e = document.createElement( 'span' ) );\r
+ f.replaceChild( node, e );\r
+ e.appendChild( f );\r
+ parent.appendChild( e = document.createElement( 'span' ) );\r
+ e.appendChild( node );\r
+ parent.removeChild( e );\r
+ node.parentNode = null;\r
+ document.body.appendChild( node );\r
+ parent.replaceChild( document.createComment( '' ), node ); */\r
document.body.appendChild( node );\r
return;\r
if( parent.parentNode !== document.body ){\r
* http://kojs.sukobuto.com/docs/visible-binding\r
* IE6 には、「空の span エレメントに続く空白は無視される」という謎な癖があります。 \r
*/\r
-X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT,\r
+\r
+X_TEMP._onPreInit =\r
X_UA_DOM.W3C ?\r
(function(){\r
var r = X_Node_body,\r
// textarea の内容を控えて、消す。xnode tree 構築後に復帰。でないと、html パースでこける\r
//X_UA[ 'MacIE' ] && alert( body.innerHTML );\r
// cleanup tree \r
- (function/*cleanUpTree*/( elm, skip, head ){\r
+ function cleanUpTree( elm, skip, head ){\r
var nodes = X_Object_cloneArray( elm.childNodes ),\r
i = 0,\r
l = nodes.length,\r
continue;\r
} else {\r
// pre タグ以下はスペースの置換は行わない\r
- node.childNodes && node.childNodes.length && /*cleanUpTree*/arguments.callee( node, skip || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ], head );\r
+ node.childNodes && node.childNodes.length && cleanUpTree( node, skip || X_Dom_DTD_SKIP_CLEANUP_TAGS[ tag ], head );\r
};\r
textNode = null;\r
break;\r
//++count;\r
};\r
};\r
- })( X_UA[ 'MacIE' ] ? ( copy = body.cloneNode( true ) ) : body );\r
+ };\r
+\r
+ cleanUpTree( X_UA[ 'MacIE' ] ? ( copy = body.cloneNode( true ) ) : body );\r
\r
if( X_UA[ 'MacIE' ] ){\r
document.write( html = copy.innerHTML );\r
}; \r
};\r
\r
- body.appendChild( elmProgress = document.createElement( 'div' ) );\r
+ body.appendChild( X_TEMP.elmProgress = elmProgress = document.createElement( 'div' ) );\r
elmProgress.style.cssText = 'position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;';\r
elmProgress.setAttribute( 'style', 'position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;' );\r
\r
- X_HTMLParser_asyncParse( html, true )\r
- [ 'listen' ]( X_EVENT_PROGRESS,\r
- function( e ){\r
- elmProgress.style.width = ( e[ 'percent' ] * 100 | 0 ) + '%';\r
- }\r
- )\r
- [ 'listenOnce' ]( X_EVENT_SUCCESS,\r
- function( e ){\r
- var xnodes = X_Node_body[ '_xnodes' ] = [], t;\r
- xnodes.push.apply( xnodes, e.xnodes );\r
- elmProgress.style.width = '100%';\r
+ X_TEMP._body = body;\r
\r
- X_TEMP.asyncCreateTree( X_Node_body, body.childNodes, elmProgress );\r
- }\r
- );\r
+ X_HTMLParser_asyncParse( html, true )\r
+ [ 'listen' ]( X_EVENT_PROGRESS, X_TEMP._handleEvent )\r
+ [ 'listenOnce' ]( X_EVENT_SUCCESS, X_TEMP._handleEvent );\r
\r
}) :\r
-X_UA_DOM.IE4 ?\r
+// X_UA_DOM.IE4 ?\r
(function(){\r
var r = X_Node_body,\r
body = r[ '_rawObject' ],\r
html;\r
\r
if( !X_TEMP.X_Dom_useBuilder ) return;\r
-\r
+ \r
/*\r
* http://support.microsoft.com/kb/812417/ja\r
* PRB: outerHTML の HTML 要素のプロパティは、既定の属性は表示されません。\r
*/\r
html = body.innerHTML;\r
body.insertAdjacentHTML( 'BeforeEnd', '<div id="' + elmProgress + '" style="position:absolute;top:0;left:0;z-index:9999;width:0;height:0.5em;background:#00f;overflow:hidden;"></div>' );\r
- elmProgress = document.all[ elmProgress ];\r
+ X_TEMP.elmProgress = document.all[ elmProgress ];\r
+ \r
+ X_TEMP._body = body;\r
\r
X_HTMLParser_asyncParse( html, true )\r
- [ 'listen' ]( X_EVENT_PROGRESS,\r
- function( e ){\r
- elmProgress.style.width = ( e.percent * 100 | 0 ) + '%';\r
- }\r
- )\r
- [ 'listenOnce' ]( X_EVENT_SUCCESS,\r
- function( e ){\r
- var xnodes = X_Node_body[ '_xnodes' ] = [], t;\r
- xnodes.push.apply( xnodes, e.xnodes );\r
- elmProgress.style.width = '100%';\r
- \r
- X_TEMP.asyncCreateTree( X_Node_body, body.childNodes || body.children, elmProgress );\r
- }\r
- );\r
-}) :\r
-(function(){\r
+ [ 'listen' ]( X_EVENT_PROGRESS, X_TEMP._handleEvent )\r
+ [ 'listenOnce' ]( X_EVENT_SUCCESS, X_TEMP._handleEvent );\r
+});\r
+\r
+X_ViewPort[ 'listenOnce' ]( X_EVENT_PRE_INIT, X_TEMP._onPreInit );\r
+\r
+X_TEMP._handleEvent = function( e ){\r
+ var elmProgress = X_TEMP.elmProgress, xnodes;\r
\r
-}) );\r
+ switch( e.type ){\r
+ case X_EVENT_PROGRESS :\r
+ elmProgress.style.width = ( e.percent * 100 | 0 ) + '%';\r
+ break;\r
+ \r
+ case X_EVENT_SUCCESS :\r
+ xnodes = X_Node_body[ '_xnodes' ] = [];\r
+ \r
+ xnodes.push.apply( xnodes, e.xnodes );\r
+ elmProgress.style.width = '100%';\r
+ \r
+ X_TEMP.asyncCreateTree( X_Node_body, X_TEMP._body.childNodes || X_TEMP._body.children, elmProgress );\r
+ \r
+ delete X_TEMP._onPreInit;\r
+ delete X_TEMP._body;\r
+ delete X_TEMP.elmProgress;\r
+ break;\r
+ };\r
+};\r
\r
X_TEMP.asyncCreateTree = function( parent, elems, elmProgress, async ){\r
var xnodes = async ? 0 : X_Object_cloneArray( parent[ '_xnodes' ] ),\r
console.log( 'xtree 作成完了' );\r
X_ViewPort[ 'asyncDispatch' ]( X_EVENT_XTREE_READY );\r
elmProgress.parentNode ? elmProgress.parentNode.removeChild( elmProgress ) : ( elmProgress.outerHTML = '' );\r
+ \r
delete X_TEMP.asyncCreateTree;\r
delete X_TEMP.bindElementToXnode;\r
delete X_TEMP.X_Dom_useBuilder;\r
var raw = that[ '_rawObject' ],\r
idoc = raw.contentDocument || that._iwin.document,\r
html = that._contentHTML;\r
- \r
+ \r
+ that._ready = true; // これを削除すると ie6,7,8 で Stack overflow at line : 0 意味不明\r
delete that._contentHTML;\r
\r
idoc.open();\r
* <h4>XHR 用プロパティ</h4>\r
* <dl>\r
* <dt>method<dd>'GET', 'POST' 未指定かつ postdata を設定している場合、'POST' になる。\r
+ * <dt>params<dd>url パラメータを object で渡すことが出来る。\r
* <dt>postdata<dd>string, object の場合は X.String.serialize される。\r
* <dt>async<dd>boolean\r
* <dt>username<dd>BASIC 認証\r
* <dt>canUse<dd>未実装。gadget proxy, YQL, YPipes 等のマッシュアップの許可。現在は test : 'gadget' としている\r
* </dl>\r
* \r
+ * <h4>JSONP 用プロパティ</h4>\r
+ * <dl>\r
+ * <dt>params<dd>url パラメータを object で渡すことが出来る。\r
+ * <dt>callbackName<dd>callback(json) コールバック名が固定されている際に指定。または &callback=hoge 以外の名前でコールバックを指定する場合に params と callbackName に書いておく。url パラメータに callback が無く、callbackName もない場合、フレームワーク内で自動で設定される\r
+ * <dt>charset<dd>ページと異なるjsonpを読み込む場合に指定 'EUC-JP', 'Shift-JIS' 等 script タグの charset に入る。https://code.google.com/p/ajaxzip3/issues/detail?id=5\r
+ * <dt>useFireWall<dd>異なるドメインに jsonp を読み込んだ後、xdomain iframe 通信を使ってデータを受け取る。不正なコードの実行を防ぐことが出来る、未実装\r
+ * </dl>\r
+ * \r
* @alias X.Net\r
* @class 各種ネットワーク機能をラップしインターフェイスを共通化する。\r
* @constructs Net\r
* .listen( X.Event.PROGRESS )\r
* .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT, X.Event.CANCELED ] );\r
* \r
+ * // XHR - GET \r
+ * var net = X.Net( urlString );\r
+ * \r
* // XHR - POST \r
* var net = X.Net( { xhr : urlString, postdata : myData } );\r
* \r
* // JSONP\r
- * var net = X.Net( { jsonp : urlString, staticCallbackName : callbackName, useXDomainWall : false } );\r
+ * var net = X.Net( { jsonp : urlString, params : params, callbackName : callbackName, charset : charset, useFireWall : false } );\r
* \r
* // Form\r
* var net = X.Net( { form : urlString, method : 'POST', target : '_self', params : {} } ); // _self, _parent, _top の場合、ページから離脱する\r
'netVersion' : 0,\r
\r
'Constructor' : function( urlOrObject, opt_options ){\r
- var v, opt, url, type, auth;\r
+ var opt, url, type, auth;\r
\r
if( X_Type_isObject( opt = urlOrObject ) ){\r
- if( X_Type_isString( v = opt[ 'xhr' ] ) ){\r
- url = v;\r
+ if( X_Type_isString( url = opt[ 'xhr' ] ) ){\r
type = X_NET_TYPE_XHR;\r
} else\r
- if( X_Type_isString( v = opt[ 'jsonp' ] ) ){\r
- url = v;\r
+ if( X_Type_isString( url = opt[ 'jsonp' ] ) ){\r
type = X_NET_TYPE_JSONP;\r
} else\r
- if( X_Type_isString( v = opt[ 'img' ] || opt[ 'image' ] ) ){\r
- url = v;\r
+ if( X_Type_isString( url = opt[ 'img' ] || opt[ 'image' ] ) ){\r
type = X_NET_TYPE_IMAGE;\r
} else\r
- if( X_Type_isString( v = opt[ 'form' ] ) ){\r
- url = v;\r
+ if( X_Type_isString( url = opt[ 'form' ] ) ){\r
type = X_NET_TYPE_FORM;\r
+ //{+dev\r
} else\r
- if( X_Type_isString( v = opt[ 'type' ] ) ){\r
-\r
- switch( v ){\r
- case 'xhr' :\r
- type = X_NET_TYPE_XHR;\r
- break;\r
- case 'jsonp' :\r
- type = X_NET_TYPE_JSONP;\r
- break;\r
- case 'img' :\r
- case 'image' :\r
- type = X_NET_TYPE_IMAGE;\r
- break;\r
- case 'from' :\r
- type = X_NET_TYPE_FORM;\r
- break;\r
- default :\r
- alert( 'X.Net args error' );\r
- return; \r
- };\r
+ if( !( type = X_NET_NAME_TO_ID[ opt[ 'type' ] ] ) ){\r
+ alert( 'X.Net args error' );\r
+ return;\r
+ //}+dev\r
+ } else {\r
url = opt[ 'url' ];\r
};\r
- \r
+ //{+dev\r
if( !X_Type_isString( url ) ){\r
alert( 'X.Net args error' );\r
return;\r
};\r
- \r
+ //}+dev\r
} else\r
if( X_Type_isString( urlOrObject ) ){\r
url = urlOrObject;\r
type = X_NET_TYPE_XHR;\r
opt = { 'url' : url, 'method' : 'GET' };\r
};\r
- \r
+ //{+dev \r
} else {\r
alert( 'X.Net args error' );\r
return;\r
+ //}+dev\r
};\r
\r
+ // auth の退避\r
if( auth = opt[ 'auth' ] ){\r
delete opt[ 'auth' ];\r
};\r
if( auth ){\r
opt[ 'auth' ] = auth; // auth は deep copy されるとまずい\r
};\r
- opt.netType = type;\r
- opt[ 'url' ] = url; \r
+ \r
+ // params を url に追加\r
+ if( opt[ 'params' ] ){\r
+ url = X_URL_create( url, opt[ 'params' ] );\r
+ delete opt[ 'params' ];\r
+ }; \r
\r
if( type === X_NET_TYPE_XHR ){\r
opt[ 'method' ] = opt[ 'method' ] || ( opt[ 'postdata' ] ? 'POST' : 'GET' );\r
- \r
+\r
// XDomain 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替?\r
// PUT DELETE UPDATE 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替?\r
// xプロトコル な binary のロード -> gadget 内で proxyURL による XHR\r
opt[ 'dataType' ] = opt[ 'dataType' ] || X_URL_getEXT( url );\r
};\r
\r
+ opt.netType = type;\r
+ opt[ 'url' ] = url; \r
+ \r
X_Pair_create( this, opt );\r
\r
this[ 'listen' ]( [ X_EVENT_BEFORE_KILL_INSTANCE, X_EVENT_KILL_INSTANCE ], X_NET_proxyDispatch );\r
X_NET_TYPE_FORM = 3,\r
X_NET_TYPE_IMAGE = 4,\r
\r
+ X_NET_NAME_TO_ID = {\r
+ 'xhr' : X_NET_TYPE_XHR,\r
+ 'jsonp' : X_NET_TYPE_JSONP,\r
+ 'form' : X_NET_TYPE_FORM,\r
+ 'img' : X_NET_TYPE_IMAGE,\r
+ 'image' : X_NET_TYPE_IMAGE\r
+ },\r
+\r
X_NET_QUEUE_LIST = [],\r
\r
X_NET_XHRWrapper,\r
load : function( option ){
//createURL
var url = option[ 'url' ],
- json2Path = 'js/libs/json2.js',
+ params = option[ 'params' ],
+ callback = option[ 'callbackName' ],
+ charset = option[ 'charset' ],
+ json2Path = window.RegExp ? 'js/libs/json2.js' : 'js/libs/json2_regfree.js',
json2FileSize = 18103,
html;
+ url = X_URL_create( url, params );
+
+ if( !callback && !( callback = X_URL_ParamToObj( url.split( '?' )[ 1 ] )[ 'callback' ] ) ){
+ url += '&callback=cb';
+ callback = 'cb';
+ };
+
+ charset = charset ? ' charset="' + charset + '"' : '';
+
// TODO '<scr'+'ipt> 化 恐らくアンチウイルスソフトが反応しないための対策
// document.postMessage()→window.postMessage() (Opera 9.50 build 9841 -)
// http://d.hatena.ne.jp/cnrd/20080518/1211099169
'<script>',
'onunload=function(){im.onload=im.onerror=""};',
'nw=+new Date;',
- 'function cb(o){if(nw){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw', window[ 'JSON' ] ? json2FileSize : 0 ,');nw=0}}',
+ 'function ', callback, '(o){if(nw){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw', window[ 'JSON' ] ? json2FileSize : 0 ,');nw=0}}',
'</script>',
- '<script id="jp"></script>',
+ '<script', charset, ' id="jp"></script>',
'<img id="im" src="', url, '" onload="jp.src=im.src" onerror="jp.src=im.src">'
];
X_Net_JSONP_maxOnloadCount = 2;
// http://blog.livedoor.jp/dankogai/archives/51503830.html
// Ajax - IE8にもJSON入ってます。使えるとは限らないけど
// Compatibility mode (別名Quirks mode) では、JSONオブジェクトは無効になります。iframeもだめです
- '<script id="jp"></script>',
+ '<script', charset, ' id="jp"></script>',
'<script>',
'onunload=function(){clearTimeout(id)};',
'nw=0;', // なぜか必要,,,
- 'function cb(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',parent.JSON.stringify(o).replace(/\\\\u([a-fA-F0-9]{4})/g,function(a,b){return String.fromCharCode(parseInt(b,16))}),-nw)}',
- //'function cb(o){if(nw){nw-=+new Date;postMessage("', X_NET_JSONP_SEND_MSG_KEY,' "+nw+"|"+parent.JSON.stringify(o).replace(/\\\\u([a-fA-F0-9]{4})/g,function(a,b){return String.fromCharCode(parseInt(b,16))}),"*");nw=0}}',
+ 'function ', callback, '(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',parent.JSON.stringify(o).replace(/\\\\u([a-fA-F0-9]{4})/g,function(a,b){return String.fromCharCode(parseInt(b,16))}),-nw)}',
+ //'function ', callback, '(o){if(nw){nw-=+new Date;postMessage("', X_NET_JSONP_SEND_MSG_KEY,' "+nw+"|"+parent.JSON.stringify(o).replace(/\\\\u([a-fA-F0-9]{4})/g,function(a,b){return String.fromCharCode(parseInt(b,16))}),"*");nw=0}}',
'function tm(){jp.src="', url ,'";nw=+new Date}',
'id=setTimeout(tm,16);',
'</script>'
/* 以下のコードは XP ie8 では動くけど、win8 IE11(8モード)で動かない 開発の便宜を取って,setTimeout を挟む
'<script>',
- 'function cb(o){window.parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',window.parent.JSON.stringify(o))}',
+ 'function ', callback, '(o){window.parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',window.parent.JSON.stringify(o))}',
'</script>',
'<script src="', url, '"></script>' */
];
} else
if( X_UA[ 'IE9' ] ){
html = [
- '<script id="jp"></script>',
+ '<script', charset, ' id="jp"></script>',
'<script>',
'onunload=function(){clearTimeout(id)};',
- 'function cb(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw)}',
+ 'function ', callback, '(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw)}',
'function tm(){jp.src="', url ,'";nw=+new Date}',
'id=setTimeout(tm,16);',
'</script>'
html = [
'<script>',
'nw=+new Date;',
- 'function cb(o){if(nw){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw);nw=0}}',
- //'function cb(o){if(nw){nw-=+new Date;parent.postMessage("', X_NET_JSONP_SEND_MSG_KEY,' "+nw+"|"+JSON.stringify(o),"', location.origin, '");nw=0}}',
+ 'function ', callback, '(o){if(nw){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw);nw=0}}',
+ //'function ', callback, '(o){if(nw){nw-=+new Date;parent.postMessage("', X_NET_JSONP_SEND_MSG_KEY,' "+nw+"|"+JSON.stringify(o),"', location.origin, '");nw=0}}',
'</script>',
- '<script src="', url, '"></script>'
+ '<script', charset, ' src="', url, '"></script>'
];
X_Net_JSONP_maxOnloadCount = 1;
} else
if( X_UA[ 'IE4' ] || X_UA[ 'MacIE' ] ){
html = [
'<script id="jn"></script>',
- '<script id="jp"></script>',
+ '<script', charset, ' id="jp"></script>',
'<script>',
'onunload=function(){clearTimeout(id)};',
- 'function cb(o){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw-16,', json2FileSize, ')}',
+ 'function ', callback, '(o){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw-16,', json2FileSize, ')}',
'function t1(){document.all.jn.src="', json2Path ,'";id=setTimeout("t2()",16);nw=+new Date}',
'id=setTimeout("t1()",16);',
'function t2(){if(window.JSON){document.all.jp.src="', url ,'"}else{id=setTimeout("t2()",16)}}',
if( X_UA[ 'IE' ] < 8 ){ // ie5-7
html = [
'<script id="jn"></script>',
- '<script id="jp"></script>',
+ '<script', charset, ' id="jp"></script>',
'<script>',
'onunload=function(){clearTimeout(id)};',
- 'function cb(o){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw-16,', json2FileSize, ')}',
+ 'function ', callback, '(o){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw-16,', json2FileSize, ')}',
'function t1(){jn.src="', json2Path ,'";id=setTimeout(t2,16);nw=+new Date}',
'id=setTimeout(t1,16);',
'function t2(){if(window.JSON){jp.src="', url ,'"}else{id=setTimeout(t2,16)}}',
} else {
html = [
'<script>',
- 'function cb(o){if(nw){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw,', json2FileSize, ');nw=0}}',
+ 'function ', callback, '(o){if(nw){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw,', json2FileSize, ');nw=0}}',
'nw=+new Date;',
'</script>',
'<script src="', json2Path, '"></script>',
- '<script src="', url, '"></script>'
+ '<script', charset, ' src="', url, '"></script>'
];
X_Net_JSONP_maxOnloadCount = 2;
};
X_Net_Image_image = X_Net_Image_hasImage && new Image(),\r
// IE では厳密には HTMLImageElement ではなく、appendChild してもサイズが取れず、removeChild に失敗する\r
X_Net_Image_isElement = !( X_UA[ 'IE' ] < 9 ) && X_Type_isHTMLElement( X_Net_Image_image );\r
- \r
-\r
-if( !X_Net_Image_hasImage ){\r
- alert( 'no Image!' );\r
-} else\r
-if( X_Net_Image_isElement ){\r
- //alert( 'X_Net_Image_isElement ' + X_Net_Image_isElement );\r
-};\r
\r
/*\r
* TODO\r
* new Image() のときに Image オブジェクトを作るもの(IE8-)と、HTMLImageElement を作るものがある。\r
* Image は、X.EventDispatcher で、<img> は X.Node で。 \r
- * \r
- * Opera7 では毎回 image を作る必要あり、src が異なればOK?\r
*/\r
\r
X_TEMP.X_NET_Image_init = function(){\r
+ X_NET_ImageWrapper = X_Class_override(\r
+ X_Net_Image_isElement ? Node( X_Net_Image_image ) : X_EventDispatcher( X_Net_Image_image ),\r
+ X_TEMP.X_NET_Image_params\r
+ );\r
+ \r
+ X_NET_ImageWrapper[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_NET_Image_handleEvent );\r
+ \r
+ delete X_TEMP.X_NET_Image_init;\r
+ delete X_TEMP.X_NET_Image_params; \r
+ \r
+ return X_NET_ImageWrapper;\r
+};\r
\r
-delete X_TEMP.X_NET_Image_init;\r
-\r
-X_NET_ImageWrapper = X_Class_override(\r
- !X_Net_Image_isElement ? X_EventDispatcher( X_Net_Image_image ) : Node( X_Net_Image_image ),\r
- {\r
-\r
+X_TEMP.X_NET_Image_params = {\r
_busy : false,\r
tick : 0,\r
timerID : 0,\r
},\r
\r
cancel : function(){\r
+ var raw = this[ '_rawObject' ];\r
// abort がある?\r
- this[ '_rawObject' ] && this[ '_rawObject' ].abort && this[ '_rawObject' ].abort();\r
+ raw && raw.abort && raw.abort();\r
// this[ '_rawObject' ].src = '';\r
this._busy = false;\r
this.finish = true;\r
this.finished = false;\r
this.abspath = '';\r
}\r
- }\r
-);\r
-\r
-X_NET_ImageWrapper[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_NET_Image_handleEvent );\r
-\r
-return X_NET_ImageWrapper;\r
-\r
-};\r
+ };\r
\r
function X_NET_Image_detect(){\r
+ var raw = this[ '_rawObject' ];\r
+ \r
if( this.finish ) return;\r
- if( this[ '_rawObject' ] && this[ '_rawObject' ].complete ){\r
+ if( raw && raw.complete ){\r
this._busy = false;\r
this.finish = true;\r
- if( this[ '_rawObject' ].width ) return;\r
+ if( raw.width ) return;\r
X_Timer_remove( this.timerID );\r
this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
} else\r
h = pair[ 'authorizeWindowHeight' ] || 500;
X_NET_OAUTH2_authorizationWindow = window.open(
- url + ( ( url.indexOf( '?' ) !== -1 ) ? '&' : '?' ) + X_URL_objToParam(
+ X_URL_create( url,
{
'response_type' : 'code',
'client_id' : pair[ 'clientID' ],
'redirect_uri' : pair[ 'redirectURI' ],
'scope' : ( pair[ 'scopes' ] || []).join(' ')
}
- ), 'oauthauthorize',
+ ),
+ 'oauthauthorize',
'width=' + w
+ ',height=' + h
+ ',left=' + ( screen.width - w ) / 2
headers;
if( token && mechanism === 'param' ){
- request[ 'url' ] = url + ((url.indexOf('?') !== -1) ? '&' : '?') + 'bearer_token=' + encodeURIComponent( token );
+ request[ 'url' ] = X_URL_create( url, { 'bearer_token' : encodeURIComponent( token ) } );
};
if( token && ( !mechanism || mechanism === 'header' ) ){