OSDN Git Service

Version 0.6.37, bugfix.
authoritozyun <itozyun@user.sourceforge.jp>
Fri, 2 May 2014 13:09:26 +0000 (22:09 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Fri, 2 May 2014 13:09:26 +0000 (22:09 +0900)
0.6.x/index.html
0.6.x/js/core/00_X.js
0.6.x/js/core/01_XUa.js
0.6.x/js/dom/10_XDom.js
0.6.x/js/dom/11_XDomNode.js
0.6.x/js/dom/12_XDomEvent.js
0.6.x/js/dom/14_XDomAttr.js
0.6.x/js/dom/15_XDomStyle.js
0.6.x/js/dom/18_XDomQuery.js
0.6.x/js/dom/22_XDomBuilder.js

index 13e9d5c..4ed54e8 100644 (file)
@@ -1,12 +1,15 @@
-<!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
@@ -28,7 +31,6 @@
 <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
index 9a0404f..68f25c3 100644 (file)
@@ -77,7 +77,6 @@ X.matchTest = function( array1, array2 ){
        };\r
        return true;\r
 };\r
-\r
        \r
 // bonus: hotfix for IE6 SP1 (bug KB823727)\r
 document.execCommand && document.execCommand( 'BackgroundImageCache', false, true );\r
index 679912e..064cb3b 100644 (file)
@@ -43,6 +43,9 @@ X.UA.IEMobile = navigator.userAgent.toLowerCase().indexOf( 'iemobile' ) !== -1 |
                                ( 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
@@ -52,3 +55,15 @@ X.UA.EInk =
        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
index 98ae022..acd55f8 100644 (file)
@@ -3,7 +3,7 @@ X.Dom = X.Class._override(
        new X.EventDispatcher(),\r
        {\r
                readyState   : -1,\r
-               active       : true,\r
+               active       : !!document.activeElement,\r
                _root        : null,\r
 \r
                _lock        : false,\r
@@ -14,6 +14,12 @@ X.Dom = X.Class._override(
 /* -----------------------------------------------\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
@@ -140,12 +146,13 @@ X.Dom = X.Class._override(
                },\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
@@ -210,7 +217,10 @@ X.Dom = X.Class._override(
                        // 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
@@ -219,10 +229,19 @@ X.Dom = X.Class._override(
                \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
index 332a005..36a7ffb 100644 (file)
@@ -72,7 +72,7 @@ X.Dom.Node = X.EventDispatcher.inherits(
                        \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
@@ -101,7 +101,7 @@ X.Dom.Node = X.EventDispatcher.inherits(
                                                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
@@ -1262,6 +1262,9 @@ Node.prototype._actualRemove =
                        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
index c387000..0c3a820 100644 (file)
@@ -8,7 +8,7 @@
 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
@@ -35,6 +35,10 @@ if( window.addEventListener ){
                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
@@ -164,6 +168,23 @@ X.Dom.Event.ANIME_BEFORE_STOP   = ++X.Event._LAST_EVENT; // xnode.stop() のみ
 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
@@ -180,7 +201,7 @@ X.Dom.Node.prototype.listen = function( type, arg1, arg2, arg3 /* [ listener ||
 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
@@ -211,7 +232,7 @@ X.Dom.Node.prototype._removeEvent =
                (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
index a67c7df..e0ec4c2 100644 (file)
@@ -171,6 +171,13 @@ X.Dom.Attr = {
                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
@@ -240,6 +247,13 @@ X.Dom.Node.prototype.attr = function( nameOrObj /* v */ ){
                };\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
index 2d2055d..20c879a 100644 (file)
@@ -1073,29 +1073,31 @@ X.Dom.Node.prototype.cssText = function( v ){
 };
 
 /*
- * ここでは 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;
@@ -1125,8 +1127,8 @@ X.Dom.Node.prototype._getCharSize =
        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' ) );
@@ -1136,11 +1138,11 @@ X.Dom.Node.prototype._getCharSize =
                        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 ) ){
index 2e183bc..2aa5d95 100644 (file)
@@ -207,7 +207,7 @@ X.Dom.Query._parse = function( query, last ){
        // セレクター\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
index 8fb5f9c..7def580 100644 (file)
@@ -12,11 +12,12 @@ X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT,
                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
@@ -38,7 +39,7 @@ X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT,
                                                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