Хорошо, любой другой браузер отлично работает с методом, который я кодировал до сих пор, но по какой-то причине 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' не является объектом».
Я получаю бессмысленную ошибку JavaScript. Добавлю в пост через минуту.
Вы можете прояснить свой вопрос, добавив некоторую информацию о том, что вы сделали и каковы ваши настройки отладки, чтобы избежать лишних вопросов. Вы также предполагаете, что ответ должен включать пробный блок, но оставьте это на усмотрение ответчиков или поясните, почему.
Я открыт для других методов (это просто предложение).
Вы назвали свой фрейм? в противном случае "писатель" не был бы определен. И еще раз, вы проверили, поддерживает ли IE designMode? Я не верю.
IE вроде поддерживает это ... msdn.microsoft.com/en-us/library/aa753622(VS.85).aspx
Это ужасное название. Кто здесь исправляет названия? Может быть, «доступ к фреймам через DOM в IE» или что-то подобное?
Хорошее предложение Амвросий.
Спасибо и извините за плохое название. :)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я даже не уверен, что IE поддерживает этот режим дизайна.
И .contentDocument - это только IE8, IE7 и менее использует .contentWindow.document, но окна iframe являются частью коллекции фреймов.
попробуйте это, должен быть кроссбраузер:
<iframe name = "writer"></iframe>
frames["writer"].document.body.innerHTML = "some html...";
Изменилось, теперь работает намного лучше - спасибо! Но это все равно не удается (как отмечалось выше).
Я что-то упустил? не следует ли вам использовать что-то вроде:
window.frames[nameOrNumberOfFrame]...
См. Также в MSDN:
This collection contains only window objects and does not provide access to the corresponding frame and iframe objects. To access these objects, use the all collection for the document containing the objects.
Сейчас я использую window.frames. Вы предлагаете вместо этого использовать коллекцию <i> all </i>?
Я предлагаю вам использовать то, что Microsoft заявляет, что вы должны использовать - в конце концов, это их браузер ...
Вам нужно указать свой iframe на фиктивный документ для IE. Просто создайте файл blank.html со следующим:
<html><body></body></html>
и установите <iframe src = "blank.html" ... >
Затем вы можете ссылаться на frame.document.body.innerHTML = '...', как вам нравится.
Кстати, это ужасный заголовок для вопроса.
Спасибо за идею, но по-прежнему выдает ту же ошибку. Я вручную проверил, что страница /blank.html загружается должным образом, и включил точный код, указанный выше.
Было бы проще просто использовать <iframe src = "about: blank" ...> - нет необходимости создавать другой файл, если браузер вполне способен генерировать пустую страницу.
В конце я использовал фреймы ['frameName']. Document.write ('someText'), но только если другой метод не работает.
Очевидно, IE8 не делает элементы фрейма доступными до тех пор, пока не загрузится вся родительская страница. Также обратите внимание, что вы можете записать во фрейм до загрузки родительской страницы, но это перезапишет фрейм и предотвратит его загрузку.
Простое решение - переместить вызов InitEditor () из тела сюда:
<body onload = "InitEditor()">
Возможно, iframe еще не загружен. Я могу продублировать вашу ошибку "'frames.writer.document.body' is null or not an object". Я добавил к нему setTimeout, и это сработало для меня.
setTimeout(function () {
frames['writer'].document.body.innerHTML = "some text";
}, 200);
Получаете ли вы при этом ошибку JavaScript или IE, или это просто не работает?