浏览 3584 次
锁定老帖子 主题:鸡肋的E4X
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-10
Aimingoo问我如何能捕获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”。 问题的细节,有兴趣的同志可以参考: http://groups.google.com/group/mozilla.dev.tech.js-engine/browse_thread/thread/6566b430328bc3ef# https://bugzilla.mozilla.org/show_bug.cgi?id=270553 一句话,E4X虽然看上去很美,随手用用也不错,但还是存在很多问题的。并且从BE等的表态来看,至少要等到ES4之后,才有可能开始去解决这些问题。 顺便马后炮一下:我从一开始就觉得E4X有点鸡肋。。。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-09-10
Hi你好,你曾在我的Blog发表留言(http://www.heartstringz.net/blog/jquery-ajax-fails-in-ie/#comments),但我不是很明白具体的修改方法,肯请赐教。
|
|
返回顶楼 | |
发表时间:2007-09-10
felixding 写道 Hi你好,你曾在我的Blog发表留言(http://www.heartstringz.net/blog/jquery-ajax-fails-in-ie/#comments),但我不是很明白具体的修改方法,肯请赐教。
你说的那个问题,从你给出的最后一个链接上的说明来看,可能是因为某个版本winxp下无法使用Microsoft.XMLHttp,实际上,根据IEBlog,应该使用MSXML2.XMLHttp.6.0和MSXML2.XMLHttp.3.0,而不要使用其他版本。所以我建议你直接修改jQuery的源码。将其中的new ActiveXObject('Microsoft.XMLHttp')改为new ActiveXObject('MSXML2.XMLHttp.3.0')试试看。至于我说的两次,是指可以用try,像这样: try { xml = new ActiveXObject('MSXML2.XMLHttp.6.0') } catch(e) { xml = new ActiveXObject('MSXML2.XMLHttp.3.0') } 创建XHR,我建议你参考Sarissa的代码,或者参考以下我写的示例: var _req; if (typeof XMLHttpRequest == 'function') { _req = new XMLHttpRequest(); } else if (typeof ActiveXObject == 'function') { _req = XMLHTTP(6) || XMLHTTP(3) || XMLHTTP(2); if (_req == null) throw Error('Failed to create XMLHTTP object'); } else { throw Error('No XMLHttpRequest'); } function XMLHTTP(version) { var progId; var v = parseInt(version); if (v >= 3 && v <= 6) { progId = 'Msxml2.XMLHTTP.' + v + '.0'; } else if (v == 2) { progId = 'Microsoft.XMLHTTP'; } else { return; } try { return new ActiveXObject(progId); } catch(e) { return null; } } |
|
返回顶楼 | |