Если вы хотите использовать Prototype в разных документах - а iframes - это разные документы - вы должны включить скрипт в каждый документ и использовать правильную копию для доступа к связанному документу.
То же самое касается 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-фреймворка, который специально не предназначен для этого (и я не знаю, что такое), делает жизнь еще более странной.