Доступ к фреймам через 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' не является объектом».

Получаете ли вы при этом ошибку JavaScript или IE, или это просто не работает?

Welbog 21.01.2009 21:04

Я получаю бессмысленную ошибку JavaScript. Добавлю в пост через минуту.

PythonPower 21.01.2009 21:23

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

Adriano Varoli Piazza 21.01.2009 21:25

Я открыт для других методов (это просто предложение).

PythonPower 21.01.2009 21:33

Вы назвали свой фрейм? в противном случае "писатель" не был бы определен. И еще раз, вы проверили, поддерживает ли IE designMode? Я не верю.

jishi 21.01.2009 22:05

IE вроде поддерживает это ... msdn.microsoft.com/en-us/library/aa753622(VS.85).aspx

PythonPower 21.01.2009 22:41

Это ужасное название. Кто здесь исправляет названия? Может быть, «доступ к фреймам через DOM в IE» или что-то подобное?

AmbroseChapel 22.01.2009 05:51

Хорошее предложение Амвросий.

Prestaul 22.01.2009 06:52

Спасибо и извините за плохое название. :)

PythonPower 22.01.2009 16:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
9
8 424
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы активировали IE отладкаудобства?

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

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

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

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

frames["writer"].document.body.innerHTML = "some html...";

Изменилось, теперь работает намного лучше - спасибо! Но это все равно не удается (как отмечалось выше).

PythonPower 21.01.2009 22:46

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

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>?

PythonPower 21.01.2009 23:21

Я предлагаю вам использовать то, что Microsoft заявляет, что вы должны использовать - в конце концов, это их браузер ...

Dror 22.01.2009 10:06

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

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

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

Затем вы можете ссылаться на frame.document.body.innerHTML = '...', как вам нравится.

Кстати, это ужасный заголовок для вопроса.

Спасибо за идею, но по-прежнему выдает ту же ошибку. Я вручную проверил, что страница /blank.html загружается должным образом, и включил точный код, указанный выше.

PythonPower 22.01.2009 16:05

Было бы проще просто использовать <iframe src = "about: blank" ...> - нет необходимости создавать другой файл, если браузер вполне способен генерировать пустую страницу.

Evan 16.05.2009 00:01
Ответ принят как подходящий

В конце я использовал фреймы ['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);

Другие вопросы по теме