2007-09-10
鸡肋的E4X
关键字: E4X
前两天,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有点鸡肋。。。
还真没办法!
问题在于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有点鸡肋。。。
- 14:13
- 浏览 (1689)
- 评论 (2)
- 分类: JS
- 进入论坛
- 发布在 javascript研究小组 圈子
- 相关推荐
评论
hax
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;
}
}
felixding
2007-09-10
Hi你好,你曾在我的Blog发表留言(http://www.heartstringz.net/blog/jquery-ajax-fails-in-ie/#comments),但我不是很明白具体的修改方法,肯请赐教。
发表评论
提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则
- 浏览: 139355 次
- 性别:

- 来自: 上海

- 详细资料
搜索本博客
最近加入圈子
最新评论
-
一个嵌入式HTML引擎
这个引擎的源码在什么地方可以下阿
-- by lizhaosuper -
注册Facebook的一点点用户 ...
注册验证码确实有点变态。好在只是一次性的。我经常看到一些网站每次留言都要验证码, ...
-- by hax -
注册Facebook的一点点用户 ...
那个注册验证码太强了点
-- by jinhao7773 -
注册Facebook的一点点用户 ...
第一次使用facebook也发现了这点。他的工作很细致。
-- by wutao8818 -
向左转?向右转?
这个论坛有人发过了
-- by lonelyblue






评论排行榜