{\r
var listener = nativeListeners[ eventName ] = getNativeListener( this, eventName );\r
\r
- if ( this.$.addEventListener )\r
- this.$.addEventListener( eventName, listener, !!CKEDITOR.event.useCapture );\r
- else if ( this.$.attachEvent )\r
+ if ( this.$.attachEvent )\r
this.$.attachEvent( 'on' + eventName, listener );\r
+ else if ( this.$.addEventListener )\r
+ this.$.addEventListener( eventName, listener, !!CKEDITOR.event.useCapture );\r
}\r
\r
// Call the original implementation.\r
var listener = nativeListeners && nativeListeners[ eventName ];\r
if ( listener )\r
{\r
- if ( this.$.removeEventListener )\r
- this.$.removeEventListener( eventName, listener, false );\r
- else if ( this.$.detachEvent )\r
+ if ( this.$.detachEvent )\r
this.$.detachEvent( 'on' + eventName, listener );\r
+ else if ( this.$.removeEventListener )\r
+ this.$.removeEventListener( eventName, listener, false );\r
\r
delete nativeListeners[ eventName ];\r
}\r
}\r
+ },\r
+\r
+ /**\r
+ * Removes any listener set on this object.\r
+ * To avoid memory leaks we must assure that there are no\r
+ * references left after the object is no longer needed.\r
+ */\r
+ removeAllListeners : function()\r
+ {\r
+ var nativeListeners = this.getCustomData( '_cke_nativeListeners' );\r
+ for ( var eventName in nativeListeners )\r
+ {\r
+ var listener = nativeListeners[ eventName ];\r
+ if ( this.$.detachEvent )\r
+ this.$.detachEvent( 'on' + eventName, listener );\r
+ else if ( this.$.removeEventListener )\r
+ this.$.removeEventListener( eventName, listener, false );\r
+\r
+ delete nativeListeners[ eventName ];\r
+ }\r
}\r
};\r
})();\r
{\r
var customData = {};\r
\r
+ CKEDITOR.on( 'reset', function()\r
+ {\r
+ customData = {};\r
+ });\r
+\r
/**\r
* Determines whether the specified object is equal to the current object.\r
* @name CKEDITOR.dom.domObject.prototype.equals\r
};\r
\r
/**\r
- * @name CKEDITOR.dom.domObject.prototype.getCustomData\r
+ * Removes any data stored on this object.\r
+ * To avoid memory leaks we must assure that there are no\r
+ * references left after the object is no longer needed.\r
+ * @name CKEDITOR.dom.domObject.prototype.clearCustomData\r
+ * @function\r
+ */\r
+ domObjectProto.clearCustomData = function()\r
+ {\r
+ // Clear all event listeners\r
+ this.removeAllListeners();\r
+\r
+ var expandoNumber = this.$._cke_expando;\r
+ expandoNumber && delete customData[ expandoNumber ];\r
+ };\r
+\r
+ /**\r
+ * Gets an ID that can be used to identiquely identify this DOM object in\r
+ * the running session.\r
+ * @name CKEDITOR.dom.domObject.prototype.getUniqueId\r
+ * @function\r
+ * @returns {Number} A unique ID.\r
*/\r
domObjectProto.getUniqueId = function()\r
{\r