-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\r
-<html>\r
+<!DOCTYPE html>\r
+<html lang="ja" class="js-disabled">\r
<head>\r
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\r
-<meta http-equiv="Content-Language" content="ja">\r
-<meta http-equiv="Content-Script-Type" content="text/javascript">\r
-<meta http-equiv="Content-Style-Type" content="text/css">\r
+<meta charset="utf-8">\r
+<title>X</title>\r
+<meta name="HandheldFriendly" content="true">\r
+<meta name="mobileoptimized" content="0">\r
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">\r
<meta http-equiv="imagetoolbar" content="no">\r
-<title>Js UI</title>\r
+<meta name="format-detection" content="telephone=no">\r
+<meta name="apple-mobile-web-app-capable">\r
+<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0,maximum-scale=1">\r
<link rel="stylesheet" type="text/css" media="all" href="css/ju.css">\r
<link rel="stylesheet" type="text/css" media="all" href="css/tree.css">\r
\r
<script type="text/javascript" src="js/dom/13_XDomBoxModel.js"></script>\r
<script type="text/javascript" src="js/dom/14_XDomAttr.js"></script>\r
<script type="text/javascript" src="js/dom/15_XDomStyle.js"></script>\r
-<!-- <script type="text/javascript" src="js/dom/16_XDomAnime.js"></script> -->\r
<script type="text/javascript" src="js/dom/17_XDomNodeList.js"></script>\r
<script type="text/javascript" src="js/dom/18_XDomQuery.js"></script>\r
<script type="text/javascript" src="js/dom/19_XDomParser.js"></script>\r
};\r
return true;\r
};\r
-\r
\r
// bonus: hotfix for IE6 SP1 (bug KB823727)\r
document.execCommand && document.execCommand( 'BackgroundImageCache', false, true );\r
( X.UA.IE && navigator.userAgent.toLowerCase().indexOf( 'windows phone' ) !== -1 );\r
X.UA.TouchPad = navigator.userAgent.toLowerCase().indexOf( 'hp-tablet' ) !== -1;\r
\r
+//http://www.useragentstring.com/pages/Iris/\r
+X.UA.Iris = navigator.userAgent.toLowerCase().indexOf( 'iris' ) !== -1;\r
+\r
X.UA.EInk =\r
// Kobo Mozilla/5.0 (Linux; U; Android 2.0; en-us;) AppleWebKit/533.1 (KHTML, like Gecko) Verson/4.0 Mobile Safari/533.1 (Kobo Touch)\r
navigator.userAgent.indexOf( 'Kobo' ) !== -1 ||\r
navigator.userAgent.indexOf( 'EBRD' ) !== -1;\r
\r
if( X.UA.IE && X.UA.IE < 10 ) X.UA.ActiveX = !!window[ 'ActiveXObject' ];\r
+\r
+X.inObject = X.UA.IE && X.UA.IE < 5 ?\r
+ (function( name, obj ){\r
+ var p;\r
+ if( obj[ name ] ) return true;\r
+ name += ''; // 数値も許可\r
+ for( p in obj ){\r
+ if( p === name ) return true;\r
+ };\r
+ return false;\r
+ }) :\r
+ new Function( 'a,b', 'return a in b' );
\ No newline at end of file
new X.EventDispatcher(),\r
{\r
readyState : -1,\r
- active : true,\r
+ active : !!document.activeElement,\r
_root : null,\r
\r
_lock : false,\r
/* -----------------------------------------------\r
* Resize\r
* original : uupaa.js\r
+ * \r
+ * TODO\r
+ * https://w3g.jp/blog/studies/ios7_1_minimal-ui_warning\r
+ * iOS7.0からあったiPad Safariの高さ100%コンテンツでlandscape(横向き)時に起きる不具合\r
+ * \r
+ * getBoundingClientRect で fontsize の調査\r
*/\r
_resize :\r
X.UA.IE && X.UA.IE < 9 ?\r
},\r
\r
handleEvent : function( e ){\r
+ var href;\r
switch( e.type ){\r
case 'beforeunload' :\r
\r
// ie では a href="javascript" な要素でも beforeunload が起こる\r
- var href = e.relatedTarget && e.relatedTarget.href();\r
- if( href && href.indexOf( 'javascript:' ) === 0 ) return X.Callback.PREVENT_DEFAULT | X.Callback.STOP_PROPAGATION;\r
+ href = e.target && e.target.attr( 'href' );\r
+ if( href && href.indexOf && href.indexOf( 'javascript:' ) === 0 ) return X.Callback.PREVENT_DEFAULT | X.Callback.STOP_PROPAGATION;\r
\r
return X.Dom.dispatch( { type : X.Dom.Event.BEFORE_UNLOAD } );\r
case 'unload' :\r
// Opera は互換モードでは document.body.scrollHeight、標準モードでは document.documentElement.scrollHeight でページの高さが取れる。と思ってたんだけど、例外があった。\r
// http://orera.g.hatena.ne.jp/edvakf/20100515/1273908051\r
//http://onozaty.hatenablog.com/entry/20060803/p1\r
- // Safari2.0.4では標準・互換どちらも document.body \r
+ // Safari2.0.4では標準・互換どちらも document.body\r
+ \r
+ Node.root._updateTimerID && Node.root._startUpdate();\r
+ \r
return [\r
X.Dom._root.scrollWidth || X.Dom._root.offsetWidth,\r
X.Dom._root.scrollHeight || X.Dom._root.offsetHeight\r
\r
getScrollPosition :\r
window.pageXOffset !== undefined ?\r
- new Function( 'return[window.pageXOffset,window.pageYOffset]' ) :\r
+ ( function(){\r
+ Node.root._updateTimerID && Node.root._startUpdate();\r
+ return[ window.pageXOffset, window.pageYOffset ];\r
+ } ) :\r
window.scrollLeft !== undefined ?\r
- new Function( 'return[window.scrollLeft,window.scrollTop]') :\r
- new Function( 'return[X.Dom._root.scrollLeft,X.Dom._root.scrollTop]' ),\r
+ ( function(){\r
+ Node.root._updateTimerID && Node.root._startUpdate();\r
+ return[ window.scrollLeft, window.scrollTop ];\r
+ } ) :\r
+ ( function(){\r
+ Node.root._updateTimerID && Node.root._startUpdate();\r
+ return[ X.Dom._root.scrollLeft, X.Dom._root.scrollTop ];\r
+ } ),\r
\r
getScrollbarSize : function(){\r
return [ X.Dom.BoxModel.vScrollbarSize, X.Dom.BoxModel.hScrollbarSize ]; \r
\r
if( Node._newByTag ){\r
Node._newByTag = false;\r
- this._tag = v;\r
+ this._tag = v.toUpperCase();\r
this._xnodeType = 1;\r
this._state = X.Dom.State.DISPLAY_INLINE; // todo\r
arguments[ 1 ] && this.attr( arguments[ 1 ] );\r
this._rawNode = v;\r
this._xnodeType = 1;\r
this._state = X.Dom.State.DISPLAY_BLOCK; // todo\r
- this._tag = v.tagName;\r
+ this._tag = v.tagName.toUpperCase();\r
this._id = v.id;\r
this._className = v.className;\r
this.cssText( v.style.cssText );\r
if( !elm ) return;\r
this._xnodeType === 1 && this._migrateEvent();// イベントの退避\r
\r
+ if( X.Dom.Attr.HAS_VALUE[ this._tag ] && ( !this._newAttrs || !X.inObject( 'value', this._newAttrs ) ) ){\r
+ this._attrs.value = elm.value;\r
+ };\r
elm.removeAttribute( 'id' ); // ?\r
document.all[ this._id || ( 'ie4uid' + this._uid ) ] = null; // ?\r
if( !isChild ) elm.outerHTML = '';\r
if( window.addEventListener ){\r
X.Dom.Event = function( e, xnode ){\r
//this._event = e;\r
- this.type = e.type;\r
+ this.type = X.Dom.Event.RenameTo[ e.type ] || e.type;\r
\r
//http://www.quirksmode.org/js/events_properties.html\r
this.target = Node._getXNode( e.target.nodeType === 3 ? e.target.parentNode : e.target );// defeat Safari bug // xnode\r
this.which = e.which || ( e.button + 1 ); // 左:1, 中:2, 右:3\r
\r
// https://developer.mozilla.org/ja/docs/DOM/DOM_event_reference/mousewheel\r
+ \r
+ // TODO\r
+ // https://w3g.jp/blog/tools/wheelevent_crossbrowser\r
+ // ホイール系イベント2014年版クロスブラウザ\r
if( e.wheelDeltaY !== undefined ){\r
this.wheelDeltaX = e.wheelDeltaX / 12;\r
this.wheelDeltaY = e.wheelDeltaY / 12;\r
X.Dom.Event.ANIME_STOP = ++X.Event._LAST_EVENT;\r
X.Dom.Event._LAST_EVENT = X.Event._LAST_EVENT; // ここに書いてあるイベントの最後の値 X.Dom.Event.ANIME_STOP と同じ値\r
\r
+X.Dom.Event.Rename = {};\r
+X.Dom.Event.RenameTo = {};\r
+// https://github.com/georgeadamson/jQuery.prefixfree-events/blob/master/jQuery.prefixfree-events.js\r
+\r
+if( window.onwebkitanimationend !== undefined && window.onanimationend === undefined ){\r
+ X.Dom.Event.Rename[ 'animationend' ] = 'webkitAnimationEnd';\r
+ X.Dom.Event.RenameTo[ 'webkitAnimationEnd' ] = 'animationend';\r
+ X.Dom.Event.Rename[ 'animationstart' ] = 'webkitAnimationStart';\r
+ X.Dom.Event.RenameTo[ 'webkitAnimationStart' ] = 'animationstart';\r
+ X.Dom.Event.Rename[ 'animationiteration' ] = 'webkitAnimationIteration';\r
+ X.Dom.Event.RenameTo[ 'webkitAnimationIteration' ] = 'animationiteration';\r
+};\r
+\r
+if( window.onwebkittransitionend !== undefined && window.ontransitionend === undefined ){\r
+ X.Dom.Event.Rename[ 'transitionend' ] = 'webkitTransitionEnd';\r
+ X.Dom.Event.RenameTo[ 'webkitTransitionEnd' ] = 'transitionend';\r
+};\r
\r
X.Dom.Node.prototype.listen = function( type, arg1, arg2, arg3 /* [ listener || ( context + function ) || function ][ arguments ] */ ){\r
var elm;\r
X.Dom.Node.prototype._addEvent =\r
X.Dom.EVENT_W3C ?\r
(function( type ){\r
- this._rawNode && this._rawNode.addEventListener( type, this, false );\r
+ this._rawNode && this._rawNode.addEventListener( X.Dom.Event.Rename[ type ] || type, this, false );\r
}) :\r
X.Dom.EVENT_IE ?\r
(function( type ){\r
(function( type ){\r
var elm = this._rawNode;\r
if( !elm ) return;\r
- elm.removeEventListener( type, this, false );\r
+ elm.removeEventListener( X.Dom.Event.Rename[ type ] || type, this, false );\r
}) :\r
X.Dom.EVENT_IE ?\r
(function( type ){\r
valuetype : 'valueType',\r
checked : 'defaultChecked'\r
},\r
+ \r
+ HAS_VALUE : {\r
+ INPUT : true,\r
+ TEXTAREA : true,\r
+ SELECT : true\r
+ },\r
+ \r
renameForTag : {},\r
// http://nanto.asablo.jp/blog/2005/10/29/123294\r
// checked -> defaultChecked\r
};\r
return this;\r
} else\r
+ if( nameOrObj === 'value' && X.Dom.Attr.HAS_VALUE[ this._tag.toUpperCase() ] ){\r
+ if( this._newAttrs && this._newAttrs.value ) return this._newAttrs.value;\r
+ if( elm = X.Dom.DOM_IE4 ? this._rawNode || this._ie4getRawNode() : this._rawNode ){\r
+ attrs.value = elm.value;\r
+ };\r
+ return attrs.value;\r
+ } else\r
if( typeof nameOrObj === 'string' && attrs ){\r
// getter\r
return attrs[ nameOrObj ];\r
};
/*
- * ここでは HTMLElement のチャックは行わない!
+ * ここでは HTMLElement のチ1ェックは行わない!
+ * TODO
+ * body に css attr がセットされた場合には X.Dom.baseFontSize をクリア
*/
X.Dom.Node.prototype._getCharSize =
window.getComputedStyle ?
(function(){
- if( this === Node.root && X.Dom.baseFontSize ) return X.Dom.baseFontSize;
Node.root._updateTimerID && Node.root._startUpdate();
+ if( this === Node.root && X.Dom.baseFontSize ) return X.Dom.baseFontSize;
if( this._fontSize ) return this._fontSize;
return this._fontSize = parseFloat( getComputedStyle( this._rawNode, null ).fontSize );
}) :
document.defaultView && document.defaultView.getComputedStyle ?
(function(){
- if( this === Node.root && X.Dom.baseFontSize ) return X.Dom.baseFontSize;
Node.root._updateTimerID && Node.root._startUpdate();
+ if( this === Node.root && X.Dom.baseFontSize ) return X.Dom.baseFontSize;
if( this._fontSize ) return this._fontSize;
return this._fontSize = parseFloat( document.defaultView.getComputedStyle( this._rawNode, null ).fontSize );
}) :
X.UA.IE && 5.5 <= X.UA.IE ?
(function(){
var font, vu, v, u, _v;
- if( this === Node.root && X.Dom.baseFontSize ) return X.Dom.baseFontSize;
Node.root._updateTimerID && Node.root._startUpdate();
+ if( this === Node.root && X.Dom.baseFontSize ) return X.Dom.baseFontSize;
if( this._fontSize ) return this._fontSize;
font = this._rawNode.currentStyle.fontSize;
X.Dom.DOM_W3C ?
(function(){
var elm, v;
- if( this === Node.root && X.Dom.baseFontSize ) return X.Dom.baseFontSize;
Node.root._updateTimerID && Node.root._startUpdate();
+ if( this === Node.root && X.Dom.baseFontSize ) return X.Dom.baseFontSize;
if( this._fontSize ) return this._fontSize;
this._rawNode.appendChild( elm = document.createElement( 'span' ) );
this._rawNode.removeChild( elm );
return this._fontSize = v;
}) :
- X.UA.IE ?
+ X.Dom.DOM_IE4 ?
(function(){
var font, vu, v, u, _v;
- if( this === Node.root && X.Dom.baseFontSize ) return X.Dom.baseFontSize;
Node.root._updateTimerID && Node.root._startUpdate();
+ if( this === Node.root && X.Dom.baseFontSize ) return X.Dom.baseFontSize;
if( this._fontSize ) return this._fontSize;
if( this._css && ( font = this._css.fontSize ) ){
// セレクター\r
X.Dom.find = X._shortcut = Node.prototype.find = X.Dom.NodeList.prototype.find = function( queryString ){\r
var HTML = Node._html,\r
- scope = this.cnstructor === X.Dom.NodeList && this.length ? this : [ this.cnstructor === Node ? this : Node.root ],\r
+ scope = this.constructor === X.Dom.NodeList && this.length ? this : [ this.constructor === Node ? this : Node.root ],\r
parents = scope, // 探索元の親要素 XNodeList の場合あり\r
noLower = 'title id name class for ' + X.Dom.DTD.ATTR_VAL_IS_URI.join( ' ' ),\r
ARY_PUSH = Array.prototype.push,\r
body = r._rawNode,\r
i, n = 0,\r
elmProgress;\r
+ // TODO\r
+ // textarea の内容を控えて、消す。xnode tree 構築後に復帰。でないと、html パースでこける\r
\r
// cleanup tree \r
- (function( elm, skip, head ){\r
- var me = arguments.callee,\r
- moveToHead = 'style,bgsound,area,base,meta'.split( ',' ),\r
+ (function cleanUpTree( elm, skip, head ){\r
+ var moveToHead = 'style,bgsound,area,base,meta'.split( ',' ),\r
remove = 'script,noscript,noframes,comment,!,noembed,nolayer'.split( ',' ),\r
noncleanup = 'pre,textarea,code,kbd,samp,xmp,plaintext,listing'.split( ',' ),\r
nodes = X.copyArray( elm.childNodes ),\r
continue;\r
} else {\r
// pre タグ以下はスペースの置換は行わない\r
- node.childNodes && node.childNodes.length && me( node, skip || noncleanup.indexOf( tag ) !== -1, head );\r
+ node.childNodes && node.childNodes.length && cleanUpTree( node, skip || noncleanup.indexOf( tag ) !== -1, head );\r
};\r
textNode = null;\r
break;\r