如何使用Prototype处理iframe contentDocument

时间:2009-09-18 10:06:03

标签: javascript iframe prototypejs

问题在于,默认情况下,Prototype库无法访问iframe中的任何内容。

我找到了一些解决方法(例如example),但没有人提供对protytpe / iframe的完全支持。有谁知道这样做的方法吗?

PS:不使用iframe不是一种选择:)

1 个答案:

答案 0 :(得分:9)

如果您想在不同文档中使用Prototype - 并且iframe是不同的文档 - 您必须在每个文档中包含该脚本,并使用正确的副本访问相关文档。

jQuery和任何其他直接引用document的框架也是如此。库的每个实例都与其自己的document对象相关联。因此,当您从父脚本创建元素时,其ownerDocument是父窗口。尝试将该元素附加到iframe文档中,您应该获得DOMException.WRONG_DOCUMENT_ERR。

var iframe= $('myiframe');
// get window and document objects for iframe (IE compatible)
var idoc= iframe.contentDocument || iframe.contentWindow.document;
var iwin= iframe.contentWindow || iframe.contentDocument.defaultView;

Element.extend(idoc);
idoc.body.insert('<div>hello</div>'); // fail, wrong document

iwin.Element.extend(idoc); // use the copy of Prototype in the iframe's window
idoc.body.insert('<div>hello</div>'); // ok

(请注意,在Firefox中你实际上不会得到一个WRONG_DOCUMENT_ERR,因为他们会默默地为你修复这个错误。但更复杂的操作会很快让你处于奇怪的,不一致的状态。)

大多数JS库旨在简化单文档脚本;它们隐藏了DOM操作中涉及的大部分血腥细节,其中一种方法就是忽略document对象。但是,这使得它们不太适合跨文档脚本,在那里知道使用哪个document是至关重要的。

跨文档脚本已经令人困惑。使用一个不是专门用来处理它的JS框架(我不知道那个)只会使生活更加怪异。