前两天,[url=http://blog.csdn.net/aimingoo]Aimingoo[/url]问我如何能捕获E4X对象的事件(如修改了一个属性),我这两天稍做了研究,发现:
还真没办法!
问题在于E4X的模型,与现有JavaScript和DOM模型根本是不同的!
所以E4X的xml对象上,根本没有addEventListener之类的方法。而E4X的操作也不是基于对象上的方法的,有直接的运算符(例如+=可以用来追加元素),所以甚至也不可能使用暴力AOP(例如改写Element.setAttribute方法)。
理论上说,貌似E4X的xml对象有domNode()方法(我没有核对过规范ECMA357——连不上,难道ecma网站被功夫王河蟹了?),可以获得对应的DOM节点,然后应该可以addEventListener,但是实际上目前无论rhino和spidermonkey都不支持该方法(谁给测一下AS3?)。而且反过来,要对DOM对象包装得到E4X的xml对象(例如new XML(document)),也没有得到支持(再次,谁给测一下AS3)。也就是说,目前为之,E4X的xml对象,虽然是native了,但是和DOM却是完全割裂的。
这种割裂不仅是当前的implementation的问题,而是存在一些深层次的矛盾。
BE同志说:“I have a jaundiced view of E4X”,并指出了一些重要的兼容性问题。
而Rhino的David Caldwell说“Some of these semantics simply can't be transparent, due to underlying differences in the object models”。
问题的细节,有兴趣的同志可以参考:
[url]http://groups.google.com/group/mozilla.dev.tech.js-engine/browse_thread/thread/6566b430328bc3ef#[/url]
[url]https://bugzilla.mozilla.org/show_bug.cgi?id=270553[/url]
一句话,E4X虽然看上去很美,随手用用也不错,但还是存在很多问题的。并且从BE等的表态来看,至少要等到ES4之后,才有可能开始去解决这些问题。
顺便马后炮一下:我从一开始就觉得E4X有点鸡肋。。。
还真没办法!
问题在于E4X的模型,与现有JavaScript和DOM模型根本是不同的!
所以E4X的xml对象上,根本没有addEventListener之类的方法。而E4X的操作也不是基于对象上的方法的,有直接的运算符(例如+=可以用来追加元素),所以甚至也不可能使用暴力AOP(例如改写Element.setAttribute方法)。
理论上说,貌似E4X的xml对象有domNode()方法(我没有核对过规范ECMA357——连不上,难道ecma网站被功夫王河蟹了?),可以获得对应的DOM节点,然后应该可以addEventListener,但是实际上目前无论rhino和spidermonkey都不支持该方法(谁给测一下AS3?)。而且反过来,要对DOM对象包装得到E4X的xml对象(例如new XML(document)),也没有得到支持(再次,谁给测一下AS3)。也就是说,目前为之,E4X的xml对象,虽然是native了,但是和DOM却是完全割裂的。
这种割裂不仅是当前的implementation的问题,而是存在一些深层次的矛盾。
BE同志说:“I have a jaundiced view of E4X”,并指出了一些重要的兼容性问题。
而Rhino的David Caldwell说“Some of these semantics simply can't be transparent, due to underlying differences in the object models”。
问题的细节,有兴趣的同志可以参考:
[url]http://groups.google.com/group/mozilla.dev.tech.js-engine/browse_thread/thread/6566b430328bc3ef#[/url]
[url]https://bugzilla.mozilla.org/show_bug.cgi?id=270553[/url]
一句话,E4X虽然看上去很美,随手用用也不错,但还是存在很多问题的。并且从BE等的表态来看,至少要等到ES4之后,才有可能开始去解决这些问题。
顺便马后炮一下:我从一开始就觉得E4X有点鸡肋。。。