Доступ к фреймам через DOM в IE

Хорошо, любой другой браузер отлично работает с методом, который я закодировал до сих пор, но по какой-то причине Internet Explorer не будет работать. Я потратил часы времени (больше времени, чем на разработку этой функции!) на совместимость и близок к тому, чтобы сдаться!

У меня есть форум, и одна из его полезных функций — редактор WYSIWYG. Для этого у меня есть IFrame, который действует как документ:

<iframe name="writer" src="/scripts/blank.html" class="writer"></iframe>

Это текущее состояние JavaScript (постоянно обновляется):

function initEditor()
{
    w = frames['writer']
    wc = g('writerCopy')

    if(w == null) return

    frames['writer'].document.designMode = 'on'
    frames['writer'].document.body.innerHTML = styleSheet+wc.value
    frames['writer'].focus()
}

Теперь он работает частично, но не работает в строке:

frames['writer'].document.body.innerHTML = styleSheet+wc.value

в Internet Explorer с «frames.writer.document.body» имеет значение null или не является объектом».


person Community    schedule 21.01.2009    source источник
comment
Вы получаете ошибку JavaScript или IE, когда делаете это, или это просто не работает?   -  person Welbog    schedule 21.01.2009
comment
Я получаю бессмысленную ошибку JavaScript. Добавлю в пост через минуту.   -  person    schedule 21.01.2009
comment
Вы можете уточнить свой вопрос, добавив некоторую информацию о том, что вы сделали и какова ваша настройка отладки, чтобы избежать лишних вопросов. Вы также предполагаете, что ответ должен включать блок try, но оставляете это на усмотрение отвечающих или поясняете, почему.   -  person Adriano Varoli Piazza    schedule 21.01.2009
comment
Я открыт для других методов (это просто предложение).   -  person    schedule 21.01.2009
comment
Вы назвали свою раму? иначе писатель был бы не определен. И еще раз, проверяли ли вы, что IE поддерживает designMode? Я не верю.   -  person jishi    schedule 21.01.2009
comment
IE вроде бы поддерживает... msdn.microsoft.com /en-us/library/aa753622(VS.85).aspx   -  person    schedule 21.01.2009
comment
Это ужасное название. Кто здесь исправляет заголовки? Может быть, доступ к фреймам через DOM в IE или аналогичный?   -  person AmbroseChapel    schedule 22.01.2009
comment
Хорошее предложение, Амвросий.   -  person Prestaul    schedule 22.01.2009
comment
Спасибо и извините за плохой заголовок. :)   -  person    schedule 22.01.2009


Ответы (7)


Я даже не уверен, что IE поддерживает этот режим проектирования.

И .contentDocument только IE8, IE7 и меньше использует .contentWindow.document, но окна iframe являются частью коллекции фреймов.

попробуйте это, должно быть кроссбраузерным:

<iframe name="writer"></iframe>

frames["writer"].document.body.innerHTML = "some html...";
person jishi    schedule 21.01.2009
comment
Изменил, теперь работает намного лучше - спасибо! Но это все еще терпит неудачу (как отмечалось выше). - person ; 21.01.2009

Вам нужно указать свой iframe на фиктивный документ для IE. Просто создайте файл blank.html со следующим:

<html><body></body></html>

и установите <iframe src="blank.html" ... >

Затем вы можете ссылаться на frame.document.body.innerHTML = '...' сколько душе угодно.

Кстати, это ужасное название вопроса.

person Crescent Fresh    schedule 22.01.2009
comment
Спасибо за идею, но все равно выдает ту же ошибку. Я вручную проверил, что страница /blank.html загружается должным образом, и включил точный код выше. - person ; 22.01.2009
comment
Было бы проще просто использовать ‹iframe src=about:blank ...› — нет необходимости создавать еще один файл, когда браузер вполне способен генерировать пустую страницу. - person Evan; 16.05.2009

Очевидно, что IE8 не делает элементы фрейма доступными до тех пор, пока не загрузится вся родительская страница. Также обратите внимание, что вы можете писать во фрейм до загрузки родительской страницы, но это перезапишет фрейм и предотвратит его загрузку.

Простое решение — переместить вызов InitEditor() из тела сюда:

<body onload="InitEditor()">
person Community    schedule 01.08.2009

Возможно, iframe еще не загружен. Я могу продублировать вашу ошибку «frames.writer.document.body» имеет значение null или не является объектом. Я добавил setTimeout вокруг него, и это сработало для меня.

setTimeout(function () {
    frames['writer'].document.body.innerHTML = "some text";
}, 200);
person aakoch    schedule 17.02.2010

Активировали ли вы в IE отладку услуги?

person Adriano Varoli Piazza    schedule 21.01.2009

Я что-то упустил здесь? разве вы не должны использовать что-то вроде:

window.frames[nameOrNumberOfFrame]...

См. также в MSDN:

Эта коллекция содержит только объекты окон и не предоставляет доступ к соответствующим объектам фреймов и iframe. Чтобы получить доступ к этим объектам, используйте коллекцию all для документа, содержащего объекты.

person Dror    schedule 21.01.2009
comment
Сейчас я использую window.frames. Вы предлагаете вместо этого использовать коллекцию ‹i›all‹/i›? - person ; 21.01.2009
comment
Я предлагаю вам использовать то, что Microsoft заявляет, что вы должны использовать - в конце концов, это их браузер ... - person Dror; 22.01.2009

В конце концов я использовал фреймы['frameName'].document.write('someText') но только в случае сбоя другого метода.

person Community    schedule 25.01.2009