[Twisted-web] How to insert an Athena event handler using Stan?

kgi iacovou at gmail.com
Tue Oct 31 03:58:35 CST 2006


Hi all.

I've got some LiveElements in an Athena page to which I want to attach event 
handlers. Their XHTML is stan-based.

What I've got right now (which works) is something like this, which I've 
understood is the Right Way to do it if you're explicitly using inline 
Javascript:

    _js = (
        "Nevow.Athena.Widget.get(this).keyPressed(this, event); " +
        "return false;"
    )

    docFactory = loaders.stan (
        T.div (
            render = T.directive ( 'liveElement' ),
            ) [
                "Blah Text Label",
                T.input (
                    type = "text",
                    _class = "sw-input",
                    onkeyup = _js,
                    ),
                T.div ( _class = "sw-output" ) [ "Blah More Text" ],
            ]
    )


There are messages in the mailing list (for example, from JP on October 11th 
2006) recommending that one should use the athena:handler feature, like this:

  <textarea>
    <athena:handler event="onkeypress" handler="keyPressed" />
  </textarea>

However, if one has stan-based rather than file-based XHTML, it's neither 
documented nor obvious how this should be done. I've managed to get this far:

    from nevow import stan
    ...
    _athena = stan.Proto (
        'athena:handler event="onkeypress" handler="keyPressed"'
    )
    ...
    T.input ( type = "text", _class = "sw-input" ) [ _athena ]

This serialises OK, but it doesn't work, because the node doesn't get 
rewritten; that is, the generated XHTML contains the athena:handler node 
verbatim.

Now, rewriteEventHandlerNodes() in Nevow/nevow/athena.py (around line 962) 
seems to traverse the tree looking for athena:handler nodes and replacing 
them with "Nevow.Athena.Widget.handleEvent()" Javascript, so I presume that 
the node I'm creating fails to get identified as an athena:handler node 
because I'm creating it incorrectly.

What is the correct way to create such a node such that it gets picked up by 
rewriteEventHandlerNodes()?

Regards,

Ricky



More information about the Twisted-web mailing list