Jquery Iframe Наследование - PullRequest
       16

Jquery Iframe Наследование

1 голос
/ 09 сентября 2010

Я на полпути к созданию очень сложного приложения с использованием jquery.

Короче говоря, модули загружаются в iframes (чтобы сохранить песочницу и учесть разные вещи).

У меня естьнемного проблем со ссылками на объект / библиотеку jquery в iframe (от его родителя).

Я могу написать функции, которые включены в родительский объект, и вызвать их с parent. $ (). mymodule ({...});где модуль должен сканировать документ на наличие iframe, затем извлекать его содержимое, затем искать элементы, к которым применяются методы (немного затянуто, но это работает !!) ..

Сегодня утром я решил, что должно бытьлучший способ сделать это, и это добавить функции модуля непосредственно в Iframe, чтобы они имели некоторый контекст, проблема в том, что я не могу ссылаться на объект jquery из родительского объекта внутри iframe. Я предположил, что родительский.$ (""). show ("# some-element-in-the-iframe") будет иметь достаточно контекста для выбора элемента в Iframe, но кажется, что он просто пытается найти этот элемент в родительском документе.

Что я хотел бы знать:

Есть ли способ, которым я могу использовать jquery, загруженный в родительский объект и его методы, или мне нужно загрузить отдельный экземпляр jquery в iframe - и еслиМне нужно загрузить этот новый экземпляр jquery, будет ли он загружаться из кэша клиента или ему придется снова загружать библиотеку с сервера.

Кажется, яЭто должно быть возможно, но этот «родитель», кажется, переключает контекст селектора обратно на родительский документ.

Я попытался добавить параметр контекста в родительский. $ ("# some-element", "# iframe-id "), но это тоже не работает.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2010

Вы используете $('#some_iframe').contents(), чтобы получить оболочку для document объекта iframe:

$('#some_iframe').contents().find('#some_element').show();

Но это ограничено. Для простого случая show() вы можете обойтись без него, но, как правило, один экземпляр jQuery не предназначен для межстрановых сценариев; некоторые операции (в частности, создание контента), скорее всего, не будут выполнены. Если вы хотите использовать все возможности jQuery, вам обычно нужно загружать копию jQuery в каждый отдельный документ.

Получить объект window (контейнер для ваших глобальных функций, $ и т. Д.) Для родительского документа очень просто: parent. Получить объект window для дочернего документа не так просто. Теоретически, это должно быть выполнимо через frames.some_iframe, но исторически - и в Firefox это все еще случай - который не работает для id="some_iframe", но только для устаревшего атрибута name .

Вместо этого можно перейти от объекта DOM самого iframe к окну, но то, как вы это делаете, не является стандартным для всех браузеров, и jQuery вам в этом не поможет.

var iframe= document.getElementById('some_iframe');  // or $('#some_iframe')[0]
var iwindow= 'contentWindow' in iframe? iframe.contentWindow : iframe.contentDocument.defaultView;
iwindow.$('#some_element').show();

(contentWindow - расширение IE, не везде поддерживаемое. contentDocument стандартно, но не поддерживается в IE.)

если мне нужно загрузить этот новый экземпляр jquery, он загрузится из клиентского кэша

Да.

0 голосов
/ 09 сентября 2010

Включите jquery в ваши страницы iframed.Пока они используют один и тот же URL, он будет использовать кешированную версию браузера.

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