Подтвердить что ты не робот

Содержимое iFrame исчезает после использования других вкладок в одном браузере

Существует много сообщений об исчезновении содержимого iFrame, но те, которые я могу найти, касаются немедленного исчезновения или случайного исчезновения содержимого.

Моя ситуация немного отличается.

У меня есть iframe внутри родительского div:

<div id="punt" contentid="123">
    <iframe id="content_frame" sandbox="allow-forms allow-popups allow-scripts allow-same-origin" src="" ></iframe>
</div>

Где iframe полностью заполняет его родительский элемент, который сам по себе является почти полным размером окна просмотра.

Содержимое iframe устанавливается через JS/JQuery:

function loadURL(url){
    $('#content_frame').attr('src', url);
}

Кроме того, eventListeners привязаны к iframe

$("#content_frame").on("load", function () {
    if(isNewURL){
        bindAndFocus();
    }
});

где

function bindAndFocus(){
    $('#content_frame').bind({
        mouseenter: function(e) {
            overiFrame = $(this).parent().attr('contentid');
        },
        mouseleave: function(e) {
            overiFrame = -1;
        }
    });
}

Когда содержимое очищается, слушатель отклоняется:

$('#content_frame').unbind('mouseenter mouseleave');

И все это прекрасно работает. URL-адрес загружается нормально, контент прокручивается и может взаимодействовать, как если бы он просматривался непосредственно в браузере. Слушатель - попытка взлома (из другого сообщения SO) при определении, когда iframe был связан с - небольшим ударом и промахом, но не проблемой.

Но тогда...

Таинственный Исчезающий Закон!?

Проблема возникает, когда вы загружаете URL-адрес в iframe, а затем некоторое время играете на других вкладках (в одном браузере). Исчезновение не мгновенно - быстрое переключение между несколькими вкладками, а затем назад не влияет. Но когда вы проводите некоторое время на другой вкладке (несколько минут или дольше), а затем возвращаетесь, содержимое частично исчезает.

Чтобы уточнить...

Если контент достаточно длинный, чтобы прокручиваться в пределах iframe (т.е. на большинстве веб-страниц), то исчезает только видимая часть. Прокрутка покажет остальную загруженную страницу, но исчезнувшая часть не будет повторно отображаться без перезагрузки содержимого.

Visual, чтобы помочь устранить любую путаницу:

iframe mess

На изображении iframe находится красное поле. Все, что внутри доступно для просмотра, снаружи скрыто.

Слева направо:

Перед использованием других вкладок

  • URL-адрес, загруженный внутри iframe

  • Загруженные страницы прокручиваются правильно в iframe, и все содержимое можно просмотреть

После использования других вкладок

  1. URL-адрес по-прежнему загружается в iframe, но содержимое рамки (видимое) исчезло

  2. Прокрутка в iframe показывает оставшееся содержимое загруженной страницы, но исчезнувший контент не возвращается без перезагрузки URL-адреса в iframe

Примечание:

Это поведение тестируется только в Safari, но проблема с крупным браузером все-таки проблема. Это может быть только исправление Safari или универсальная проблема iframe.

iframe Проблемы с песочницей в стороне, что происходит с магическим исчезающим актом?

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

(Изображение дерева/пути взято из здесь)

4b9b3361

Ответ 1

Возможно, это проблема с перерисованием/перепланировкой. Его просто слабое предположение:(

a.style.display='none';
a.offsetHeight;
a.style.display='block';

найдено здесь

Попробуйте сделать максимально точным. Для целей тестирования вы можете ссылаться на тело IFrame.

Больше (много) информации

Я не уверен, когда нужно перерисовывать в лучшем случае. Вы можете проверить исправление на обработчике mouseenter. Возможно, вы можете обнаружить вкладку-переключатель, прослушивая window.onblur и window.onfocus.

Ответ 2

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

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

Следующий код может помочь уменьшить утечку производительности.

var url = 'what.com';
var loadURL = function(url) {
  // replace with your function
  console.log(url);
}

function getHiddenProp() {
    var prefixes = ['webkit','moz','ms','o'];
    
    // if 'hidden' is natively supported just return it
    if ('hidden' in document) return 'hidden';
    
    // otherwise loop over all the known prefixes until we find one
    for (var i = 0; i < prefixes.length; i++){
        if ((prefixes[i] + 'Hidden') in document) 
            return prefixes[i] + 'Hidden';
    }

    // otherwise it not supported
    return null;
}

var isHidden = (function() {
    // I'm using an IIFE here so that getHiddenProp is only run once, when this code inits, instead of ever time the tab changes.
    var prop = getHiddenProp();
    return function() {
        if (!prop) return false;
        return document[prop];
    }
})();

document.addEventListener('visibilitychange', function(){
    if(isHidden() === false) {
        // Wrapping your function in this event listener and this if statement ensures it only runs when the user navigates back to this tab.  There may even be a more performant way of doing this, so poke around if you decide to use this.
        loadURL(url);
    }
});

Ответ 3

Сколько памяти у вашего компьютера? Iframe можно было выгрузить из памяти из-за низкой памяти, доступной для всех вкладок, и Safari считал, что iframe не имеет значения. В этом случае вы не можете много сделать (другое, что модернизирует ваш компьютер), хотя попытайтесь найти, если JQuery занимает память (это огромная библиотека) и попытаться минимизировать ваш код (используйте программу, которая удаляет пробелы и т.д.)..)