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

时间:2012-10-25 19:25:58

标签: javascript internet-explorer mootools

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

document.body.getElement('.className');

Firefox和Chrome的回答还不错,但IE上的document.body没有Mootools Element方法。

在查看the documentation之后,一些示例在document.body中包含$()以将其公开给Mootools方法。

只是想知道它在FireFox / Chrome中运行良好的原因,但不能在IE中自动生成?

1 个答案:

答案 0 :(得分:7)

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

的方法

在旧的IE中,这不会发生(它继承自内置的原型,但它只读 - 是的)。查看有关原因的任何主题 - 例如。 Is there really no way to expose the prototype of a html element in IE (<8)?

简而言之,它是DOM。这不是ECMA规范。他们没有这样做。他们现在这样做(完全是因为IE9)

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

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

所以,如果你这样做了:

$(document.body);
document.body.addClass('bar').adopt(new Element('div')); 

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

将来,mootools将不是原型而是包装(如jquery),因此任何元素访问都将通过$ type函数。

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