Bug Tracker

Opened 13 years ago

Closed 13 years ago

Last modified 8 years ago

#939 closed bug (fixed)

events don't work with iframes

Reported by: Volker Mische Owned by:
Priority: major Milestone: 1.1.3
Component: event Version: 1.1a
Keywords: Cc:
Blocked by: Blocking:

Description

If you want to add an event to an iframe it doesn't get fired. I tested it with Iceweasel 2.0.0.1. Here is a minimal example of the problem:

<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <title>event bug</title>
    <script type="text/javascript" src="../jquery-1.1.1.js"></script>
    <script type="text/javascript">
function edit()
{
    var iframe = document.getElementById('myiframe');
    var doc = iframe.contentDocument;
    doc.designMode="on";

    // works in iceweasel 2.0.0.1
    doc.addEventListener('click',function(){alert("addEventListener");},false);
    // doesn't work
    $(doc).bind('click',function(){alert("bind");},false);
}
    </script>
  </head>
  <body onload="edit()">
    <iframe id="myiframe"></iframe>
  </body>
</html>

There's a problem with the event handling code. Please take a look at Dean Edwards' current add event code and his blog entry: he has added support for DOM 2 event handling. With this addition it works. Here's a patch against rev1312 (the patch isn't perfect as i don't know much about jquery's eventhandling but it should serve as a starting point)

Index: event.js
===================================================================
--- event.js	(revision 1312)
+++ event.js	(working copy)
@@ -17,32 +17,36 @@
 		if( data ) 
 			handler.data = data;
 
-		// Make sure that the function being executed has a unique ID
-		if ( !handler.guid )
-			handler.guid = this.guid++;
+		if (element.addEventListener) {
+			element.addEventListener(type, handler, false);
+                } else {
+			// Make sure that the function being executed has a unique ID
+			if ( !handler.guid )
+				handler.guid = this.guid++;
 
-		// Init the element's event structure
-		if (!element.events)
-			element.events = {};
+			// Init the element's event structure
+			if (!element.events)
+				element.events = {};
 
-		// Get the current list of functions bound to this event
-		var handlers = element.events[type];
+			// Get the current list of functions bound to this event
+			var handlers = element.events[type];
 
-		// If it hasn't been initialized yet
-		if (!handlers) {
-			// Init the event handler queue
-			handlers = element.events[type] = {};
+			// If it hasn't been initialized yet
+			if (!handlers) {
+				// Init the event handler queue
+				handlers = element.events[type] = {};
 
-			// Remember an existing handler, if it's already there
-			if (element["on" + type])
-				handlers[0] = element["on" + type];
-		}
+				// Remember an existing handler, if it's already there
+				if (element["on" + type])
+					handlers[0] = element["on" + type];
+			}
 
-		// Add the function to the element's handler list
-		handlers[handler.guid] = handler;
+			// Add the function to the element's handler list
+			handlers[handler.guid] = handler;
 
-		// And bind the global event handler to the element
-		element["on" + type] = this.handle;
+			// And bind the global event handler to the element
+			element["on" + type] = this.handle;
+		}
 
 		// Remember the function in a global list (for triggering)
 		if (!this.global[type])
@@ -55,18 +59,22 @@
 
 	// Detach an event or set of events from an element
 	remove: function(element, type, handler) {
-		if (element.events)
-			if ( type && type.type )
-				delete element.events[ type.type ][ type.handler.guid ];
-			else if (type && element.events[type])
-				if ( handler )
-					delete element.events[type][handler.guid];
+		if (element.removeEventListener) {
+			element.removeEventListener(type, handler, false);
+		} else {
+			if (element.events)
+				if ( type && type.type )
+					delete element.events[ type.type ][ type.handler.guid ];
+				else if (type && element.events[type])
+					if ( handler )
+						delete element.events[type][handler.guid];
+					else
+						for ( var i in element.events[type] )
+							delete element.events[type][i];
 				else
-					for ( var i in element.events[type] )
-						delete element.events[type][i];
-			else
-				for ( var j in element.events )
-					this.remove( element, j );
+					for ( var j in element.events )
+						this.remove( element, j );
+		}
 	},
 
 	trigger: function(type, data, element) {

Change History (3)

comment:1 Changed 13 years ago by john

need: Test Case

comment:2 Changed 13 years ago by joern

need: Test CaseCommit

Added test in [1587].

comment:3 Changed 13 years ago by brandon

Resolution: fixed
Status: newclosed

This is fixed in Rev. 1765.

Note: See TracTickets for help on using tickets.