OSDN Git Service

Version 0.6.27, bugfix for X.Dom.Parser.
authoritozyun <itozyun@user.sourceforge.jp>
Wed, 5 Mar 2014 21:07:23 +0000 (06:07 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Wed, 5 Mar 2014 21:07:23 +0000 (06:07 +0900)
0.6.x/js/core/00_builtin.js
0.6.x/js/dom/11_XDomDTD.js
0.6.x/js/dom/11_XDomNode.js
0.6.x/js/dom/12_XDomEvent.js
0.6.x/js/dom/17_XDomNodeList.js
0.6.x/js/dom/18_XDomQuery.js
0.6.x/js/dom/19_XDomParser.js

index 081d8a0..6d4b1a1 100644 (file)
@@ -36,15 +36,15 @@ Function.prototype.apply || (Function.prototype.apply = function (x, y) {
                        a = [];\r
                        for (i = 0; i < j; ++i)\r
                                a[i] = 'y[' + i + ']';\r
-                       r = eval('x.__apply(' + a.join(',') + ')');\r
+                       //r = eval('x.__apply(' + a.join(',') + ')');\r
+                       // closuer compiler 対策\r
+                       r = (new Function( 'x,y', 'return x.__apply(' + a.join(',') + ')' ))( x, y );\r
                        break;\r
        };\r
-       // delete x.__apply ? x.__apply : x.constructor.prototype.__apply ;\r
        // ie5\r
        if( x === window ){\r
                x.__apply = void 0;\r
        } else {\r
-               //delete x.__apply ? x.__apply : x.constructor.prototype.__apply ;\r
                if( x.constructor && x.constructor.prototype.__apply ){\r
                        delete x.constructor.prototype.__apply;\r
                } else\r
index 41a9f05..de6d12d 100644 (file)
@@ -1,5 +1,6 @@
 \r
 X.Dom.DTD = {\r
-       EMPTY : {area:1,base:1,basefont:1,br:1,col:1,frame:1,hr:1,img:1,input:1,isindex:1,link:1,meta:1,param:1,embed:1 }//,\r
+       EMPTY : {area:1,base:1,basefont:1,br:1,col:1,frame:1,hr:1,img:1,input:1,isindex:1,link:1,meta:1,param:1,embed:1 },//,\r
        //      video:1,audio:1}\r
+       ATTR_VAL_IS_URI : 'action,archive,background,cite,classid,codebase,data,href,longdesc,profile,src,usemap'.split( ',' )\r
 };\r
index 1ad2852..549382a 100644 (file)
@@ -206,12 +206,17 @@ Node._getXNode = function( v ){
 \r
 \r
 Node.create = function( tag, opt_attrs, opt_css ){\r
+       var list, i;\r
        switch( Node._getType( tag ) ){\r
                case Node.IS_STRING :\r
                        Node._newByTag = true;\r
                        return new Node( tag, opt_attrs, opt_css );\r
                case Node.IS_HTML_STRING :\r
-                       return X.Dom.parse( tag, true )[ 0 ];\r
+                       list = X.Dom.parse( tag, true );\r
+                       for( i = list.length; 1 < i; ){\r
+                               list[ --i ].destroy();\r
+                       };\r
+                       return list[ 0 ];\r
        };\r
 };\r
 Node.createText = function( text ){\r
@@ -524,10 +529,10 @@ Node.prototype.remove = function(){
 };\r
 \r
 Node.prototype.empty = function(){\r
-       var xnodes = this._xnodes, child, i, l;\r
-       if( xnodes && ( l = xnodes.length ) ){\r
-               for( i = 0; i < l; ++i ){\r
-                       xnodes[ i ].destroy();\r
+       var xnodes = this._xnodes, i;\r
+       if( xnodes && ( i = xnodes.length ) ){\r
+               for( ; i; ){\r
+                       xnodes[ --i ].destroy();\r
                };\r
                xnodes.length = 0;\r
        };\r
@@ -548,15 +553,14 @@ Node.prototype.destroy = function( isChild ){
                //for( ; i; ){\r
                //      xnodes[ --i ].destroy( true );\r
                //};\r
-               //xnodes.length = 0;\r
        };\r
-       elm && this.unlisten(); // イベントの退避\r
+       elm && this._listeners && this.unlisten(); // イベントの退避\r
 \r
        delete Node._chashe[ this._uid ];\r
        delete this._state;\r
        \r
        if( this._root ){\r
-               this.remove( isChild );\r
+               !isChild && this.remove();\r
        } else {\r
                this.parent && this.parent._xnodes.splice( this.parent._xnodes.indexOf( this ), 1 );\r
                elm && !isChild && this._actualRemove();\r
@@ -730,7 +734,7 @@ Node.prototype.html = function( html, opt_outer ){
                '<', this._tag,\r
                this._id ? ' id=' + this._id : _,\r
                this._className ? ' class="' + this._className + '"' : _,\r
-               this._attrText === _ ? _ : this._attrText || ( this._attrText = X.Dom.Attr.objToAttrText( this._attrs ) ),\r
+               this._attrText || ( this._attrText = X.Dom.Attr.objToAttrText( this._attrs ) ),\r
                this._cssText ? ' style="' + this._cssText + '"' : _,\r
        '>' ];\r
        \r
@@ -1086,11 +1090,6 @@ Node.prototype._actualCreate =
                        html, xnodes, n, i, l;\r
                \r
                if( this._xnodeType === 3 ){\r
-                       //html = [];\r
-                       //for( i = 0, l = this._text.length; i < l; ++i ){\r
-                       //      html.push( this._text.charCodeAt( i ) );\r
-                       //};\r
-                       //html = html.join( ',' );\r
                        html = [ '<FONT id=ie4uid', uid, ' UID="', uid, '">', this._text, '</FONT>' ];// fake textNode\r
                        delete this._rawNode;\r
                } else {\r
@@ -1208,7 +1207,7 @@ Node.prototype._actualRemove =
 \r
                        if( !elm ) return;\r
                        this._xnodeType === 1 && this._migrateEvent();// イベントの退避\r
-                       // elm.parentNode.tagName check tagName is for ie7\r
+                       // elm.parentNode.tagName for ie7\r
                        !isChild && elm.parentNode && elm.parentNode.tagName && elm.parentNode.removeChild( elm );\r
                }) :\r
        document.all ?\r
index 71ee2c1..1a22f4f 100644 (file)
@@ -242,6 +242,7 @@ X.Dom.Node.prototype.handleEvent =
                                e.stopPropagation();
                        };
                        if( ret & X.Callback.PREVENT_DEFAULT ){
+                               this._tag === 'A' && this._rawNode.blur();
                                e.preventDefault();
                                return false;
                        };
@@ -253,6 +254,7 @@ X.Dom.Node.prototype.handleEvent =
                                event.cancelBubble = true;
                        };
                        if( ret & X.Callback.PREVENT_DEFAULT ){
+                               this._tag === 'A' && this._rawNode.blur();
                                return event.returnValue = false;
                        };
                });
@@ -399,12 +401,7 @@ X.Dom.listenOnce( X.Dom.Event.DOM_INIT, function(){
                                childNodes = X.copyArray( childNodes );
 
                                if( textarea ){
-                                       xnode.attr( 'value', xnode.text() );
-                                       for( l = xnode._xnodes.length; i < l; ++i ){
-                                               xnode._xnodes[ i ].destroy();
-                                       };
-                                       xnode._xnodes.length = 0;
-                                       delete xnode._xnodes;
+                                       xnode.attr( 'value', xnode.text() ).empty();
                                        return;
                                };
 
@@ -528,12 +525,7 @@ X.Dom.listenOnce( X.Dom.Event.DOM_INIT, function(){
                                //children = X.copyArray( children );
 
                                if( textarea ){
-                                       xnode.attr( 'value', xnode.text() );
-                                       for( l = xnode._xnodes.length; i < l; ++i ){
-                                               xnode._xnodes[ i ].destroy();
-                                       };
-                                       xnode._xnodes.length = 0;
-                                       delete xnode._xnodes;
+                                       xnode.attr( 'value', xnode.text() ).empty();
                                        return;
                                };
 
@@ -581,10 +573,11 @@ X.Dom.listenOnce( X.Dom.Event.DOM_INIT, function(){
                                                 * 未知のタグについては、閉じタグも含めてタグ名扱いになる
                                                 */
                                                if( tag === '!' || tag.charAt( 0 ) === '/' ){
+                                                       alert( '## ' + tag );
                                                        continue;
                                                } else
                                                if( xnode._tag !== tag ){
-                                                       alert( xnode._tag + ' ' + xnode._xnodeType + ' !== ' + tag + '\n' + elm.outerHTML );
+                                                       alert( xnode._tag + ' ' + ' !== ' + tag + '\nxnode.html():' + xnode.attr('cite') + '\nelm.outerHTML:' +  elm.outerHTML );
                                                } else {
                                                        xnode._rawNode = elm;
                                                        xnode._root    = parent._root;
@@ -612,7 +605,7 @@ X.Dom.listenOnce( X.Dom.Event.DOM_INIT, function(){
                                        // for
                                        if( !xnode._rawNode ){
                                                alert( xnode._tag + ' ' + xnode._id + ' !== none...' );
-                                               --i;
+                                               //--i;
                                        };
                                        ++j;
                                        flag &= 6;
@@ -635,6 +628,10 @@ X.Dom.listenOnce( X.Dom.Event.DOM_INIT, function(){
        xnodes.push.apply( xnodes, X.Dom.parse( body.innerHTML, true ) );
        delete Node.skipCreate;
        
+       //alert(body.innerHTML);
+       
+       //alert(r.html());
+       
        createTree( r, body.childNodes || body.children );
        
        i = xnodes.length;
index b5c3ce0..7bc3fb8 100644 (file)
@@ -43,24 +43,23 @@ X.Dom.NodeList.prototype.each = function( func ){
 /* --------------------------------------\r
  *  Fuction Base, multi, getter, setter,\r
  */\r
-(function(){\r
+X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT, function(){\r
        var target = X.Dom.NodeList.prototype,\r
                src    = X.Dom.Node.prototype,\r
                p, v, multi;\r
-\r
        for( p in src ){\r
                v = src[ p ];\r
-               if( typeof v === 'funciton' && !target[ p ] ){\r
+               if( X.Type.isFunction( v ) && !target[ p ] ){\r
                        target[ p ] = multi = new Function( [\r
                                'var a=arguments,s=a.callee,f=s.f,t=this,i,l=t.length;',\r
                                'if(0<l){',\r
-                                       'for(i=0;i<l;++i)if(i===l-1)return f.apply(t[i],a)else f.apply(t[i],a);',\r
+                                       'for(i=0;i<l;++i)if(i===l-1)return f.apply(t[i],a);else f.apply(t[i],a);',\r
                                '}',\r
                                'return f.apply(t,a)'\r
                        ].join( '' ) );\r
-                       multi.f = src[ p ];\r
+                       multi.f = v;\r
                };\r
        };\r
-})();\r
+});\r
 \r
 \r
index 8a6f572..719311a 100644 (file)
@@ -208,7 +208,7 @@ X.Dom.Query._parse = function( query, last ){
        X.Dom.find = X._shortcut = Node.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
-                       parents   = scope, // 探索元の親要素\r
+                       parents   = scope, // 探索元の親要素 XNodeList の場合あり\r
                        noLower   = 'title id name class for href src',\r
                        ARY_PUSH  = Array.prototype.push,\r
                        ret       = [], // 結果要素\r
index 27845ba..535e472 100644 (file)
        };
 
        function _parseStartTag( stack, last, handler, html ){
-               var phase = 0,
+               var uri   = X.Dom.DTD.ATTR_VAL_IS_URI,
+                       phase = 0,
                        l     = html.length,
                        i     = 0,
                        attrs = [],
                                                ( ( phase = 5 ) && ( attrName = html.substring( start, i ) ) );
                                        break;
                                case 5 : // 属性の = または次の属性または htmlタグの閉じ
+                                       whiteSpace.indexOf( chr ) !== -1 ?// ie4 未対応の属性には cite = http:// となる
+                                               1 :
                                        alphabets.indexOf( chr ) !== -1 ?
                                                ( ( phase = 4 ) && ( attrs[ attrs.length ] = attrName ) && ( start = i ) ) :
                                        chr === '=' ?
                                case 8 : //閉じ quot のない属性の値
                                        whiteSpace.indexOf( chr ) !== -1 ?
                                                ( ( phase = 3 ) && saveAttr( attrs, attrName, html.substring( start, i ) ) ) :
-                                       ( chr === '>' || ( empty = html.substr( i, 2 ) === '/>' ) ) &&
-                                               ( ( phase = 9 ) && saveAttr( attrs, attrName, html.substring( start, i ) ) );
+                                       ( chr === '>' ) ?
+                                               ( ( phase = 9 ) && saveAttr( attrs, attrName, html.substring( start, i ) ) ) :
+                                       ( !escape && uri.indexOf( attrName ) === -1 && html.substr( i, 2 ) === '/>' ) && // attr の val が uri で / で終わりかつ、未対応属性の場合
+                                               ( empty = true );
                                        break;
                        };
                        escape = chr === '\\' && !escape; // \\\\ is not escape for "