Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   Получение доступа к Object.prototype внутри Iframe в IE8 (https://javascript.ru/forum/css-html-internet-explorer/57146-poluchenie-dostupa-k-object-prototype-vnutri-iframe-v-ie8.html)

dfionov 21.07.2015 22:54

Получение доступа к Object.prototype внутри Iframe в IE8
 
Добрый вечер.
Есть созданный iframe.
Появилась необходимость добавить у этого iframe несколько методов в prototype у всех объектов (Object).

Получаем сначала window ифрейма
var win = iframe.contentWindow || iframe.contentDocument.defaultView;
Далее пытаемся получить Object внутри этого window
alert(win.Object);
Во всех браузерах, включая ie выше 8-й версии, получаем объект, а в IE8 (ниже не проверял - не требуется) получаем undefined.

Так вот, вопрос - как в IE8 добавить внутри Iframe в прототип к Object свои методы?

Deff 22.07.2015 00:21

dfionov,
Загрузки фрейма дожидаетесь ? В ИЕ он типично дольше грузится, чем top document

dfionov 22.07.2015 00:53

Цитата:

Сообщение от Deff (Сообщение 380753)
dfionov,
Загрузки фрейма дожидаетесь ? В ИЕ он типично дольше грузится, чем top document

Да, фрейм успевает загрузиться.
И забыл упомянуть - alert(win.Element) в том же IE8 срабатывает нормально, т. е. показывает ожидаемый
function Element() {
    [native code]
}
А вот в win.Object - undefined.

PS: просто alert(Object) выдаёт также нужный function Object()..., но мне нужно именно внутри iframe прототипы задать.

Deff 22.07.2015 01:22

dfionov,
1. Пробуйте впихнуть во фрейм скрипт, пусть он во фрейме сам меняет прототипы, (дать функции(или объекту) глобальное имя, для возможности вызова и задания параметров из топ документа)
2. А само свойство prototype на главной работает ?

dfionov 22.07.2015 01:39

Deff,
1. Это первое, что пришло на ум, но это, скорее, как костыль выглядит, а хочется найти решение.
2. Да, всё работает. Все встроенные объекты работают, их прототипы также создаются.
Object, Array, Element содержат всё, что требуется, а <iframe>.window.Object и .Array не работают. Но при этом <iframe>.window.Element почему-то работает.

Deff 22.07.2015 01:53

dfionov,
Ну по идее таже фигня присутствует и в jquery, по крайней мере в старых, DOM - объекты созданные на основном документе не переносятся во фрейм даже клонированием, причем это не всегда, иногда простые объекты и переносятся, возможно сложности с отцепкой событий
Приходится использовать такие выкрутасы
var doc= winNAME.contentWindow || winNAME.contentDocument
winNAME.$('cелектор',doc.body)

Ксать не понял зачем у Вас
var win = iframe.contentWindow || iframe.contentDocument.defaultView;

dfionov 22.07.2015 02:17

Deff, всё верно, объекты, созданные внутри одного объекта window и не должны переноситься в, по сути, другое окно (коим iframe и является). Но тут вопрос в другом - встроенные объекты-то должны быть у этого нового окна. А их почему-то нет.

А по поводу defaultView:
var doc= winNAME.contentWindow || winNAME.contentDocument;
Тут мы получим или contentWindow, или (совсем в старых браузерах) contentDocument. Но это разные по иерархии объекты. Первый - window, второй - document. У второго есть свойство defaultView, которое как раз ссылается на его родительский window.

Deff 22.07.2015 02:30

dfionov,
http://javascript.ru/forum/events/29...-v-iframe.html
http://www.w3schools.com/jsref/prop_...ntdocument.asp
http://javascript.ru/forum/events/35...osoby-est.html

Для получения window. фрейма наиболее просто использовать атрибут name="winNAME" и по нему обращаться к фрейму

dfionov 22.07.2015 03:00

По ссылкам идёт обсуждение того, как вообще получить доступ к элементам iframe.
А у меня уже есть полученный [object Window] моего ифрейма, но никак не пойму, почему у него в ie8 отсутствуют встроенные объекты типа Object, Array. Т.е. <iframe>.window.Object, например, равен undefined.

Deff 22.07.2015 03:09

dfionov,
Ну дык попробуйте вставить скрипт в ифрейм и вызвать c главной функцию во фрейме
через winNAME.имя фукции
Как вставить скрипт - там разбиралось(вроде как пять строк).
А если созданный фрейм не пустой изначально(а со ссылкой), так можно вставить прям скрипт изначально на страницу страницу.
Функция во фрейме может передать данные(вызвать) функцию на главной
window.top.имя функции
=======================================
:) Вы проставили фрейму name ?
<iframe name="winNAME" src=""></iframe>
Тогда вызов функции из фрейма: winNAME.имя функции


Часовой пояс GMT +3, время: 06:30.