- From: Nikolas Zimmermann <zimmermann@physik.rwth-aachen.de>
- Date: Wed, 05 May 2010 14:06:43 +0200
- To: www-svg@w3.org
- Message-id: <9B4B3BBA-9DEC-4A56-9788-FC5E8A69CCB8@physik.rwth-aachen.de>
Good morning svg crowd, I've looked again at WebKit's SVGUseElement/SVGElementInstance implementation and came across a problem. The spec is very vague about the differences between target/ currentTarget. Please check the testcase below and its discussion. Would be _great_ to get some feedback, especially it would be nice to get Opera/FF/IE9/WebKit on the same track. Testcase ================== <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink "> <defs> <rect id="rect" fill="red" width="100" height="100" onclick="eventHandler(evt)"/> </defs> <use id="use" xlink:href="#rect"/> <text x="100" y="150" font-size="50" onclick="runTest()">Click me! </text> <script> var rect = document.getElementById("rect"); var use = document.getElementById("use"); var rectInstance = use.instanceRoot; function eventHandler(evt) { alert('target: ' + evt.target + ' current target: ' + evt.currentTarget); } function fireSimulatedMouseClickEvent(eventTarget) { var event = document.createEvent("MouseEvents"); event.initMouseEvent("click", true, true, document.defaultView, 1, 0, 0, 0, 0, false, false, false, false, 0, null); eventTarget.dispatchEvent(event); } function runTest() { fireSimulatedMouseClickEvent(rect); fireSimulatedMouseClickEvent(rectInstance); } </script> </svg> How to test ================== #1) Click on the red rectangle. Should result in: alert: "target: [object SVGElementInstance] current target: [object SVGElementInstance]" #2) Click on the text. _I THINK_ it should result in: (that's the path I've chosen for WebKit) alert: "target: [object SVGRectElement] current target: [object SVGRectElement]" alert: "target: [object SVGElementInstance] current target: [object SVGElementInstance]" Discussion ================== #1) The first one is logical, the spec says: If event attributes are assigned to referenced elements, then the actual target for the event will be the SVGElementInstance object within the "instance tree" corresponding to the given referenced element. #2) This is tricky. think it should be possible to dispatch an event manually to every element in the DOM. So dispatching directly to "rect", should work as expected, and not end up on a SVGElementInstance. This should explain the expected result for the first alert(), as stated above. Is it correct? When dispatching manually to the "rectInstance" WebKit delivers it to the SVGElementInstance, and Opera does not. It says "target: [object SVGRectElement] current target: [object SVGRectElement]" Can anyone explain what's happening? Just a bug in Opera? I think the spec clearly states here, that the event should end up on the SVGElementInstance. Further questions ================== Spec says: The event handling for the non-exposed tree works as if the referenced element had been textually included as a deeply cloned child of the 'use' element, except that events are dispatched to the SVGElementInstance objects. The event's target and currentTarget attributes are set to the SVGElementInstance that corresponds to the target and current target elements in the referenced subtree ..... The currentTarget attribute of the event can be used to determine through which object an event listener was invoked. What does the last sentence mean in practice? Does it talk about target pointing to eg. SVGRectElement, but currentTarget pointing to a SVGElementInstance? Of course when the event bubbles currentTarget and target are not equal anymore, but I'm wondering about the target phase. The sentence above makes me thing there is some difference that I'm overlooking. To rephrase: When is currentTarget != target? Only when capturing/ bubbling? Can anyone enlighten me? Thanks in advance, Niko
Received on Wednesday, 5 May 2010 12:07:18 UTC