Как работать с контентом iframe с помощью Prototype - PullRequest
2 голосов
/ 18 сентября 2009

Проблема в том, что по умолчанию библиотека Prototype не может получить доступ к чему-либо в iframe.

Я нашел некоторые обходные пути (например, пример ), но никто не обеспечивает полную поддержку прототипа / фрейма. Кто-нибудь знает способ сделать это?

PS: не использовать iframes не вариант:)

1 Ответ

9 голосов
/ 18 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...