* \r
*/\r
\r
-if( window.addEventListener ){\r
+if( X.Dom.EVENT_W3C ){\r
X.Dom.Event = function( e, xnode ){\r
//this._event = e;\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
+ if( e.target ){\r
+ this.target = Node._getXNode( e.target.nodeType === 3 ? e.target.parentNode : e.target );// defeat Safari bug // xnode\r
+ };\r
+ if( e.relatedTarget ){\r
+ this.relatedTarget = Node._getXNode( e.relatedTarget.nodeType === 3 ? e.relatedTarget.parentNode : e.relatedTarget ); // xnode\r
+ };\r
\r
this.currentTarget = xnode; // xnode\r
- this.relatedTarget = Node._getXNode( e.relatedTarget ); // xnode\r
this.eventPhase = e.eventPhase;\r
\r
this.clientX = e.clientX;\r
\r
if( this._xnodeType === 0 || this._xnodeType === 3 || !arg1 ) return this;\r
\r
- ( !this._listeners || !this._listeners[ type ] ) && this._addEvent( type );\r
+ ( !this._listeners || !this._listeners[ type ] ) && X.Type.isString( type ) && this._addEvent( type );\r
\r
return typeof arg1 === 'function' ?\r
X.EventDispatcher.prototype.listen.call( this, type, this, arg1, arg2 ) :\r
};\r
\r
X.Dom.Node.prototype._addEvent =\r
+ // Days on the Moon DOM Events とブラウザの実装 \r
+ // http://nanto.asablo.jp/blog/2007/03/23/1339502\r
+ // Safari 2 では関数オブジェクトしか EventListener として使えませんが、Safari のナイトリービルドでは handleEvent メソッドを持つオブジェクトも EventListener として使えるようです。\r
+ X.Dom.EVENT_W3C && X.UA.Safari && X.UA.Safari < 3 ?\r
+ (function( type ){\r
+ var raw = this._rawNode;\r
+ if( !raw ) return;\r
+ this._handleEvent = this._handleEvent || X.Callback.create( this );\r
+ if( this._xnodeType === 4 ){ // Image\r
+ raw[ 'on' + type ] = this._handleEvent;\r
+ } else {\r
+ raw.addEventListener( type, this._handleEvent, false );\r
+ };\r
+ }) :\r
X.Dom.EVENT_W3C ?\r
(function( type ){\r
this._rawNode && this._rawNode.addEventListener( X.Dom.Event.Rename[ type ] || type, this, false );\r
\r
X.EventDispatcher.prototype.unlisten.apply( this, arguments );\r
\r
- l && !list[ type ] && this._removeEvent( type );\r
+ l && !list[ type ] && X.Type.isString( type ) && this._removeEvent( type );\r
\r
return this;\r
};\r
\r
X.Dom.Node.prototype._removeEvent =\r
+ X.Dom.EVENT_W3C && X.UA.Safari && X.UA.Safari < 3 ?\r
+ (function( type ){\r
+ var raw = this._rawNode;\r
+ if( !raw ) return;\r
+ \r
+ if( this._xnodeType === 4 ){ // Image\r
+ raw[ 'on' + type ] = '';\r
+ } else {\r
+ raw.removeEventListener( type, this._handleEvent, false );\r
+ };\r
+ if( !this._listeners ){\r
+ X.Callback._correct( this._handleEvent );\r
+ delete this._handleEvent;\r
+ };\r
+ }) :\r
X.Dom.EVENT_W3C ?\r
(function( type ){\r
var elm = this._rawNode;\r
};\r
});\r
\r
+// Is this in regard to the Safari 1.x preventDefault bug on click/dblclick?\r
+// https://groups.google.com/forum/#!msg/comp.lang.javascript/uYEuCHjHxnw/yKoHtZJPa1QJ\r
\r
X.Dom.Node.prototype.handleEvent =\r
X.Dom.EVENT_W3C ?\r
(function( e ){\r
var ret = X.EventDispatcher.prototype.dispatch.call( this, new X.Dom.Event( e, this ) );\r
-\r
+ \r
if( ret & X.Callback.STOP_PROPAGATION ){\r
e.stopPropagation();\r
};\r
if( ret & X.Callback.PREVENT_DEFAULT ){\r
this._tag === 'A' && this._rawNode.blur();\r
e.preventDefault();\r
+ if( X.UA.Safari && X.UA.Safari < 3 ){\r
+ if( e.type === 'click' || e.type === 'dbclick' ){\r
+ X.Dom._safariPreventDefault = true;\r
+ };\r
+ };\r
return false;\r
};\r
}) :\r
};\r
};\r
\r
-\r
-\r
/* -----------------------------------------------\r
* Document Ready\r
* Dean Edwards/Matthias Miller/John Resig\r
*/\r
+\r
+// SafariでJavaScriptのデバッグをする方法\r
+// safari1.3 可\r
+// http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html\r
+\r
/* for ie9+/Mozilla/Opera9 */\r
if( X.Dom.DOM_W3C ){\r
- X.Dom.Node._document.listenOnce( 'DOMContentLoaded', X.Dom._init );\r
+ Node._document.listenOnce( 'DOMContentLoaded', X.Dom._init );\r
} else\r
if( 5 <= X.UA.IE && X.inHead ){\r
// if this script in Head\r
this.readyState === 'complete' && X.Dom._init();\r
};\r
} else\r
-if( X.UA.WebKit ){ // sniff\r
+// Re: onLoad doesn't work with Safari?\r
+// http://lists.apple.com/archives/web-dev/2003/Oct/msg00036.html\r
+if( X.UA.WebKit || ( X.UA.Safari && X.UA.Safari < 3 ) ){ // sniff\r
X.Timer.add( 10, function(){\r
if( !X.Dom._init ) return X.Callback.UN_LISTEN;\r
if( 'loaded|complete'.indexOf( document.readyState ) !== -1 ) return X.Dom._init();\r
});\r
};\r
+ /* for other browsers */\r
+ Node._window.listenOnce( 'load', X.Dom._init ); \r
+\r
+\r
\r
-/* for other browsers */\r
-X.Dom.Node._window.listenOnce( 'load', X.Dom._init );\r
\r
//\r
-X.Dom.listenOnce( X.Dom.Event.XDOM_READY, function(e){ console.log( 'X.Dom XDomReady ' + X.Dom.readyState ); } );\r
+X.Dom.listenOnce( X.Dom.Event.XDOM_READY, function(e){\r
+ console.log( 'X.Dom XDomReady ' + X.Dom.readyState );\r
+} );\r
+\r
+if( X.UA.Safari && X.UA.Safari < 3 ){\r
+ document.documentElement.onclick =\r
+ document.documentElement.ondbclick = function( e ){\r
+ if( X.Dom._safariPreventDefault ){\r
+ X.Dom._safariPreventDefault = false;\r
+ e.preventDefault();\r
+ return false;\r
+ };\r
+ };\r
+};\r
\r
X.Dom.listenOnce( X.Dom.Event.VIEW_RESIZED, function(e){ console.log( 'X.Dom VIEW_RESIZED ' + e.w + 'x' + e.h ); } );\r
\r