论坛首页 Web前端技术论坛

鸡肋的E4X

浏览 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有点鸡肋。。。
   发表时间:2007-09-10  
Hi你好,你曾在我的Blog发表留言(http://www.heartstringz.net/blog/jquery-ajax-fails-in-ie/#comments),但我不是很明白具体的修改方法,肯请赐教。
0 请登录后投票
   发表时间: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;
		}
	}
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics