From: Raymond I. <xw...@ya...> - 2004-09-17 21:16:58
|
Sound pretty cool Andrew. The documenations always lag behind the source. That's just how things sometimes goes. Keep up the good work __ Raymond Irving --- Andrew Gillett <an...@zo...> wrote: > Hi, > > I've been having some problems with keyboard events > in DynAPI. So for > the last few weeks I've been trying to understand > the DynAPI event > model, particularly how it relates to keyboard > events. After an awful > lot of effort, I've come to understand how the > browser event model works > (fairly straightforward) and how DynAPI events work > (anything but > straightforward). > > As far as I know, the DynAPI 3 event handling model > isn't documented at > all, so I'm in the process of writing up an > explanation of how it > works. I'll post a url to it soon. > > Anyway the problem I've experienced is illustrated > by the two attached > files. The first example, DynLayerEvent.html, works > as you would expect. > The document contains a DynLayer which contains an > <input> element. > There are "keydown" event handlers attached to both > the DynLayer and the > document. When the input has focus and you press a > key, both handlers > are invoked. > > Now look at TemplateEvent.html. It is almost exactly > the same except > that instead of DynLayer, I've used a Template. > "Template" is a fairly > simple subclass of DynLayer. In this case, when you > press a key in the > input field, only the document event handler is > triggered. > > The cause of this problem is at line 151 of > api/ext/dynkeyevent.js : > > DynElement.prototype.captureKeyEvents=function() { > var > elm=(this.getClassName()=='DynLayer')?this.elm:this.doc; > if(!elm||!this._hasKeyEvents) return true; > > This code fails for any subclass of DynLayer. The > correct behavior for a > subclass of DynLayer is to assign this.elm to the > local variable elm. > Instead, elm is assigned this.doc, which is null for > any class other > than DynDocument. This bug makes it impossible to > write a widget that > extends DynLayer and is still able to handle key > events using a DynAPI > event handler. > > A fixed version of the function looks like: > > DynElement.prototype.captureKeyEvents=function() { > var > elm=(this.getClassName()=='DynDocument')?this.doc:this.elm; > if(!elm||!this._hasKeyEvents) return true; > > The same code also needs fixing in the > releaseKeyEvents function > (dynkeyevent.js, line 167). > > I have tested my change on FireFox and IE and I'm > confident that it > won't introduce any problems. > > > Andrew > > --------------------------------- DynLayer Key Event handlingdynapi.library.setPath('../src/');dynapi.library.include('dynapi.api');dynapi.library.include('DynKeyEvent');function init(){ var lyr = new DynLayer('Text: [input] '); dynapi.document.addChild(lyr); lyr.addEventListener({ onkeydown:function(e){alert('dynlayer');} }); dynapi.document.addEventListener({ onkeydown:function(e){alert('document');} });}dynapi.onLoad(init); --------------------------------- Template Key Event handlingdynapi.library.setPath('../src/');dynapi.library.include('dynapi.api');dynapi.library.include('TemplateManager');dynapi.library.include('DynKeyEvent');function init(){ var tpl = new Template('Text: [input] '); dynapi.document.addChild(tpl); tpl.addEventListener({ onkeydown:function(e){alert('template');} }); dynapi.document.addEventListener({ onkeydown:function(e){alert('document');} });}dynapi.onLoad(init); |