Closed Bug 275306 Opened 20 years ago Closed 20 years ago

javascript: eventhandler assignment with "with()"

Categories

(Core :: DOM: Core & HTML, defect)

1.0 Branch
x86
Other
defect
Not set
trivial

Tracking

()

RESOLVED DUPLICATE of bug 159849

People

(Reporter: bugzilla.mozilla.org, Unassigned)

References

()

Details

when i do not misinterpret the Object Model of javascript the following things should do the same: obj = some_input_htmlnode function test(){alert(this)} with(obj) { onkeyup = test } and obj.onkeyup = test but the 1st variant returns the window-object and the second the html-node
You have in the url in the function this code: obj = document.getElementById("test"); with(obj) {onkeyup = test} obj.onkeyup = test so the first onkeyup gets overwritten by the second. You simply get two keyup events when the input is focused, one for the input and one for the window. When the input is not focused, you only get the event for the window. I think this is INVALID.
Product: Firefox → Core
(In reply to comment #1) > When the input is not focused, you only get the event for the window. > > I think this is INVALID. Well, i figured that out already. It seems so that the implicit onkeyup of the window-element (which is owner of all userdefined functions) has higher precedence than the onkeyup of the object that is used with the with() http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf If I interpret the chapter about the with() correctly (page 79) all propertys of the object should be within the current scope and so overrule the implicit propertys of the window-object. But i might be wrong...
Unqualified names within a |with| statement only match existing properties, they won't create new ones. If you check the result of |"onkeyup" in obj| before and after |with| you'll see it is false in both cases.
Assignee: bugs → general
Component: JavaScript Console → DOM: Level 0
QA Contact: firefox.js-console → ian
(In reply to comment #3) > Unqualified names within a |with| statement only match existing properties well a with(obj){tabIndex = 10} works on an unset tabindex according to the DTD for XHTML1.0 Strict both attributes are #IMPLIED (and when not set: empty). And still... the window-object's onkeyup should be undefined too, since the with creates a local scope the property should either be created or the variable onkeyup should cease to exist after the with()-Block.
|with| does not create a local scope, it adds an object to the front of the scope chain. The following script: with (Math) { abc=15; } sets the global object's abc property to 15, just like your code sets the global object's onkeyup property to test. onkeyup (or any other event) is not defined as a property of HTMLInputElement in DOM HTML or DOM Events; tabIndex is, that's why you can set it unqualified in a with block. However, your code works in IE and it may be desirable to be compatible here. Do you know any website that is affected by this?
ah, now I understand. I misinterpreted the definition of with() and since it worked in Opera (and IE too as you said) i thought it is a bug in the Javascript-Engine. Well, maybe the eventhandlers are internally predefind with "null" in IE or Opera... have to check this. And no, I don't know any site affected, i was just developing a little tool in javascript and tried to save some typing with with() Since with() is rarely used I think there is no need for compatibility with IE. It's just an counter-intuitive part of the JavaScript... which is correctly implemented by Mozilla. A standardscompliant way would be (would it?) to define every property of HTMLnodes with null-pointers i.e. But I think thats to much efford for such a tiny bit of code... and could lead to other Bugs. Well... we can just forget about it... silly dumb me :(
*** This bug has been marked as a duplicate of 159849 ***
Status: UNCONFIRMED → RESOLVED
Closed: 20 years ago
Resolution: --- → DUPLICATE
You need to log in before you can comment on or make changes to this bug.