Мы используем jQuery Thickbox для динамического отображения iframe, когда кто-то нажимает на картинку. В этом iframe мы используем библиотеку galleria a javascript для отображения нескольких изображений.
Кажется, проблема в том, что $(document).ready
iframe запускается слишком рано, а содержимое iframe даже еще не загружено, поэтому код галереи неправильно применяется к элементам DOM. $(document).ready
кажется, использует родительское состояние готовности iframe, чтобы решить, готов ли iframe.
Если мы извлечем функцию, вызванную документом, готовым в отдельную функцию, и вызовем ее по истечении времени ожидания 100 мс. Это работает, но мы не можем рисковать в производстве с медленным компьютером.
$(document).ready(function() { setTimeout(ApplyGalleria, 100); });
Мой вопрос: к какому событию jQuery мы должны привязаться, чтобы иметь возможность выполнять наш код, когда готов динамический iframe, а не только его родитель?
Ответы:
Я ответил на аналогичный вопрос (см. Обратный вызов Javascript после завершения загрузки IFRAME? ). Вы можете получить контроль над событием загрузки iframe с помощью следующего кода:
Имея дело с iframes, я нашел достаточно хорошим, чтобы использовать событие загрузки вместо события готовности документа.
источник
.load()
событие устарело. Используйте.on( "load", handler )
вместо этого.Используя jQuery 1.3.2, у меня сработало следующее:
ПЕРЕСМОТР :! На самом деле приведенный выше код иногда выглядит так, как будто он работает в Firefox, а не как в Opera.
Вместо этого я реализовал решение опроса для моих целей. Упрощенно это выглядит так:
Для этого не требуется код на вызываемых страницах iframe. Весь код находится и выполняется из родительского фрейма / окна.
источник
setInterval
для опроса вместо.В IFrames я обычно решаю эту проблему, помещая небольшой скрипт в самый конец блока:
Эта работа большую часть времени для меня. Иногда самое простое и наивное решение является наиболее подходящим.
источник
parent
чтобы получить копию jQuery и использоватьparent.$(document).ready(function(){ parent.IFrameLoaded( ); });
для инициализации iframe.Следуя идее доктора Джокепу и Дэвида Мердока, я реализовал более полную версию. Это требует, чтобы jQuery и для родителя, и для iframe, и для iframe был под вашим контролем.
код iframe:
родительский тестовый код:
источник
Нашел решение проблемы.
Когда вы нажимаете на ссылку в виде «толстого ящика», которая открывает iframe, он вставляет iframe с идентификатором TB_iframeContent.
Вместо того чтобы полагаться на
$(document).ready
событие в коде iframe, мне просто нужно привязать событие загрузки iframe в родительском документе:Этот код находится в iframe, но привязывается к событию элемента управления в родительском документе. Работает в FireFox и IE.
источник
top.document
который позволяет мне иметь код внутри iframe, чтобы он мог определить, когда iframe загрузился. (Хотяload
после этого ответа устарела и должна быть замененаon("load")
.)В основном то, что другие уже опубликовали, но ИМХО немного чище:
источник
Попробуй это,
Все, что вам нужно сделать, это создать функцию JavaScript testframe_loaded ().
источник
Я загружаю PDF с jQuery ajax в кеш браузера. Затем я создаю встроенный элемент с данными уже в кеше браузера. Я думаю, это будет работать и с iframe.
Вы также должны правильно установить заголовки http.
источник
Это была именно та проблема, с которой я столкнулся с нашим клиентом. Я создал небольшой плагин jquery, который, кажется, работает для готовности iframe. Он использует опрос для проверки документа iframe readyState в сочетании с внутренним URL документа в сочетании с источником iframe, чтобы убедиться, что iframe фактически «готов».
Проблема с «onload» заключается в том, что вам нужен доступ к фактическому iframe, добавляемому в DOM, если вы этого не сделаете, вам нужно попытаться отловить загрузку iframe, которая, если она кешируется, может и не быть. Мне нужен был скрипт, который можно было вызывать в любое время и определять, готов ли iframe или нет.
Вот вопрос:
Святой Грааль для определения, загружен ли локальный iframe
и вот jsfiddle, который я в конце концов придумал.
https://jsfiddle.net/q0smjkh5/10/
В приведенном выше jsfiddle я жду, когда onload добавит iframe в dom, а затем проверяет состояние готовности внутреннего документа iframe - который должен быть междоменным, потому что он указывает на википедию - но Chrome, похоже, сообщает о «завершении». Затем метод iready плагина вызывается, когда iframe фактически готов. Обратный вызов пытается снова проверить состояние готовности внутреннего документа - на этот раз, сообщая о междоменном запросе (что правильно), - в любом случае кажется, что он работает для того, что мне нужно, и надеюсь, что это поможет другим.
источник
Эта функция из этого ответа - лучший способ справиться с этим, поскольку
$.ready
явное сбой для iframes. Вот решение не поддерживать это.load
Событие также не срабатывает , если IFrame уже загружен. Очень расстраивает, что это остается проблемой в 2020 году!}
источник