为什么我需要使用Mootools Element方法扩展document.body $(document.body)?

Jul*_*Lam 3 javascript internet-explorer mootools

因此,在尝试让我的应用程序在最新的IE上工作之后,事实证明IE不喜欢以下代码:

document.body.getElement('.className');
Run Code Online (Sandbox Code Playgroud)

Firefox和Chrome的反应还不错,但document.body在IE上没有Mootools Element方法.

细算的文件,一些包裹的例子document.body$()将其暴露在MooTools的方法.

只是想知道它在FireFox/Chrome中工作正常的原因,但不能在IE中自动运行?

Dim*_*off 7

这是因为IE暴露(或者,呃,不)元素原型的扩展方式.在适当的浏览器中,document.body- 以及作为DOM的一部分并且从Element派生的所有其他内容 - 继承附加到的方法Element.prototype

在旧的IE中,这不会发生(它继承自内置的原型,但它只读 - 是的).查看有关原因的任何主题 - 例如.真的没有办法在IE中公开html元素的原型(<8)吗?

简而言之,它是DOM.这不是ECMA规范.他们没有这样做.他们现在这样做(完全自IE9以来)

MooTools - 是典型的 - 通过扩展它手动访问的元素来解决这个问题.它通过$或元素构造函数或Slick(当它第一次遇到元素时)这样做.

在IE中,扩展将不仅设置元素存储/ uid,它将从Element.prototype复制对expando属性的引用到元素对象本身.

所以,如果你这样做了:

$(document.body);
document.body.addClass('bar').adopt(new Element('div')); 
Run Code Online (Sandbox Code Playgroud)

这会奏效.您只需要扩展一次,然后将所有方法复制到实际对象上.

在未来,mootools将不是原型而是包装(如jquery)所以任何元素访问都将通过$ type函数.

请参阅https://github.com/mootools/mootools-core/blob/master/Source/Element/Element.js#L268-275