Определить DOMContentLoaded в iframe

Я был удивлен, обнаружив следующее нене работает, поскольку событие DOMContentLoaded не 'т огонь (this.els является объектом элементов).

this.els.stage_ifr.prop('src', 'templates/'+ee.globals.creating+'/item'+this.id);
this.els.stage_ifr[0].addEventListener('DOMContentLoaded', function() {
    alert('loaded!');
}, false);

Страница загружается в iframe нормально, но обратного вызова нет. Уровень DOM нольonloadОднако работает.

this.els.stage_ifr[0].onload = function() { alert('loaded!'); }; //
 Utkanos06 июн. 2013 г., 14:27
попробую. Отложенный обходной путь jQuery работает, если онне ходи. Благодарю.
 Utkanos06 июн. 2013 г., 14:07
Интересно - мне следовало подумать, что это прекрасно, если фрейм находится в той же области. Если это действительно закрытое дело, не стесняйтесь опубликовать его как ответ, и яприму.
 Teemu06 июн. 2013 г., 13:54
Исключительно я предоставляю ссылку на MSDN:элемент iframe, Как вы можете прочитать на этой странице,DOMContentLoaded Можно'быть привязанным к.iframe
 dude26 мар. 2016 г., 14:54
 Teemu06 июн. 2013 г., 14:25
Вы можете попробовать прикрепитьDOMContentLoaded (методdocument только для того, чтобыstage_ifr[0].contentDocumentЯЯ просто не уверен, если бы он существовал в то время, когда вымне это понадобится ... я

Ответы на вопрос(3)

Решение Вопроса

В процессе ответаэтот вопросЯ обнаружил причину твоейDOMContentLoaded слушатель событий нет работа. Мне кажется, у вас есть две проблемы.

Ты первый'пытаюсь слушатьDOMContentLoaded событие на самом iFrame. Это неСобытие iFrame. Это событие документа. Таким образом, вы должны обратиться к iFrame, чтобы получить contentWindow, а затем получить документ из этого. Это приводит ко второму вопросу.

Во-вторых, когда iFrame создается впервые, у него есть фиктивнаяdocument в нем, который НЕ тот же документ, который в конечном итоге будет там, когда динамический контент загружается через.src приписывать. Итак, даже если вы сделали:

this.els.stage_ifr.contentWindow.document

чтобы получить документ в iFrame, он не обязательно будет правильным документом и, следовательно,DOMContentLoaded событие выиграноне стреляю (яЯ видел это поведение в Chrome).

MDN говорит, что можно слушатьDOMFrameContentLoaded событие на самом iFrame, и это будет соответствовать тому, когда базовый документ действительно получаетDOMContentLoaded, К сожалению, я могучтобы это событие работало в любом браузере. Итак, в данный момент единственный обходной путь, который я знаю, - это вызвать событие загрузки изнутри самого iFrame, где он может прослушивать свой собственныйDOMContentLoaded событие (оно может вызвать родительское окно, если это необходимо) или просто прослушатьload событие на объекте iFrame и знать, что он выигралЗапускается до тех пор, пока такие ресурсы, как таблицы стилей и изображения в iFrame, также не будут загружены.

Во всяком случае, я думал, чтоЯ объяснил кое-что из того, что происходило с вашим исходным кодом, и предложил другое решение, даже если этот вопрос был опубликован более года назад (хотя так и не получил ответа).

Обновление: Я

мы разработали метод отслеживанияDOMContentLoaded для iFrame, загруженного с тем же источником, что и его родитель. Вы можете увидеть кодВот.

 dude21 мар. 2016 г., 21:23
Я уже спрашивал себя, почемуreadyState всегдаcompleted в хроме. Теперь я знаю этоs потому что Chrome устанавливает пустой документ и после этого создает фактический документ iframe (связанный с атрибутом src). Такое плохое поведение, если бы Chrome справился с этим как с другим браузером, который мы могли бы просто использовать.readyState
 J. Bruni11 апр. 2017 г., 17:59
DOMFrameContentLoaded это не толькоMozilla-специфическое событие но также "Событие дополнения », который "никогда не подвергается воздействию веб-содержимого и может использоваться только в контексте содержимого Chrome ".
 dude26 мар. 2016 г., 14:55

Это может быть больше взломать, но помог мне решить аналогичную проблему.

Я слушаюonmouseenter содержимого кадра сейчас.

Это событие срабатывает впередиload (если пользователь перемещает мышь). Но, как и в моем случае, мне нужно событие для инициализации контекстного меню, так или иначе, использование мыши было предварительным условием.

Он даже срабатывает, когда содержимое фрейма изменяется под мышью.

 Utkanos01 дек. 2017 г., 11:56
Интересный подход. Спасибо за внимание.

Попробовав разные варианты, я обнаружил, что у меня работает следующий код:

var iframe = document.getElementById("app-frame-id");
iframe.contentWindow.addEventListener("DOMContentLoaded", onFrameDOMContentLoaded, true);
function onFrameDOMContentLoaded () { 
     console.log("DOMContentLoaded");
};
 Raul Rene21 авг. 2015 г., 16:37
Это нене работает, когда вы меняете фреймисточник
 dude21 мар. 2016 г., 21:31
Кажется, работает на меня. Но не могли бы вы описать, что именно это делает и почему вы неt присвоить это событие свойству документа?contentWindow

Ваш ответ на вопрос