Анимированное фоновое изображение в скрытом ‹div› не загружается или загружается без анимации

Я потратил целый день, пытаясь создать скрипт, который при «отправке» скрывает форму и показывает скрытую с анимированным индикатором выполнения. Проблема в том, что Internet Explorer не показывает анимированные gif-изображения в скрытых элементах div. Изображения статичны. Я посетил много веб-сайтов и нашел скрипт, который использует:

document.getElementById(id).style.backgroundImage = 'url(/images/load.gif)';

Наконец, мой скрипт работает в Internet Explorer, Firefox, Opera, но... Google Chrome вообще не отображает изображение. Я вижу только текст div. После многих тестов я обнаружил следующее: единственный способ увидеть фоновое изображение в Google Chrome — включить это же изображение где-нибудь на странице (за пределами скрытого блока div) с размерами в 1 пиксель:

<img src="/images/load.gif" width="1" heigh="1" /> 

Это сработало, но... после этого грязного решения Microsoft Explorer по какой-то причине снова показывает изображение как статичное. Итак, мой вопрос: есть ли способ заставить Gogle Chrome показывать изображение? Спасибо. Это мой сценарий:

<script language="JavaScript" type="text/javascript">

function ver (id, elementId){
if (document.getElementById('espera').style.visibility == "visible") {
    return false;
}else{
var esplit = document.forms[0]['userfile'].value.split(".");
ext = esplit[esplit.length-1];
    if (document.forms[0]['userfile'].value == '') {
        alert('Please select a file');
        return false;
    }else{
        if ((ext.toLowerCase() == 'jpg')) {
            document.getElementById(id).style.position = 'absolute';
            document.getElementById(id).style.display = 'inline';
            document.getElementById(id).style.visibility = "visible";
            document.getElementById(id).style.backgroundImage = 'url(/images/load.gif)';
            document.getElementById(id).style.height = "100px";
            document.getElementById(id).style.backgroundColor = '#f3f3f3';
            document.getElementById(id).style.backgroundRepeat = "no-repeat";
            document.getElementById(id).style.backgroundPosition = "50% 50%";

        var element;
            if (document.all)
                element = document.all[elementId];
            else if (document.getElementById)
                element = document.getElementById(elementId);
            if (element && element.style)
                element.style.display = 'none'; 

            return true;
        }else{
            alert('This is not a jpg file');    
            return false;
        }
    }
}
}  
</script>


<div id="frmDiv">
<form  enctype="multipart/form-data" action="/upload.php" method="post" name="upload3" onsubmit="return ver('espera','frmDiv');">
<input type="hidden" name="max_file_size" value="4194304" />
<table border="0" cellspacing="1" cellpadding="2" width="100%">
<tr bgcolor="#f5f5f5">
<td>File (jpg)</td>
<td>
<input type="file" name="userfile" class="upf" /></td></tr>
<tr bgcolor="#f5f5f5">
<td>&nbsp;</td>
<td>
<input class="upf2" type="submit" name="add" value="Upload" />
</td></tr></table></form>
</div>


<div id="espera" style="display:none;text-align:center;float:left;width:753px;">&nbsp;<br />&nbsp;<br />&nbsp;<br />&nbsp;<br />
&nbsp;<br />Please wait...<br />&nbsp;
</div>

person user    schedule 06.04.2010    source источник
comment
Возможно, пришло время, наконец, оставить IE6 в покое. Это также происходит в IE7+?   -  person Paul Lammertsma    schedule 07.04.2010
comment
Пол, это IE7. Я прочитал эту длинную ветку: west-wind.com/Weblog/posts/1227. .aspx и похоже, что для этой проблемы нет решения.   -  person user    schedule 07.04.2010


Ответы (1)


Пытаться:

(new Image).src="/images/load.gif";

Сама большая G использует эту технику для предварительной загрузки запросов DNS на свою домашнюю страницу.


ОБНОВЛЕНИЕ Из-за ошеломляющей -1, которую я получил... Мне нужно объяснить, почему вышеизложенное может работать для тупиц, которые голосуют против, когда они не понимают возможности данного решения.

Google Chrome вполне может «разумно» выбирать, какие ресурсы загружать, анализируя, будут ли они действительно отображаться на странице (аналогично тому, как браузеры не загружают каждый background-image:url(image) в файле CSS). Если это так, то следующее также может быть правдой: если время, которое предназначено для отображения изображения «load.gif», МЕНЬШЕ, чем время, необходимое для загрузки изображения, тогда оно будет выглядеть так, как будто изображение не отображается. вообще (даже если он только загружается).

Предварительно загрузив изображение с помощью '(new Image).src ="image.gif";' подход, мы гарантируем, что изображение будет готово в кеше браузера и, таким образом, сразу же доступно, когда это необходимо.

Что касается того, почему Internet Exploder показывает только один кадр, я не уверен. На странице должны быть другие переменные, вызывающие такое поведение (длительный скрипт, ограничение количества циклов, закодированных в самом GIF,?).

person David Murdoch    schedule 06.04.2010
comment
-1 Пожалуйста, прочитайте вопрос. У него нет проблем с предварительной загрузкой. Изображение просто не отображается в Chrome. - person Josh Stodola; 06.04.2010
comment
Запустите это как можно скорее на своей странице, чтобы инициировать загрузку изображения (в закадровый буфер и кеш браузера). - person dkamins; 06.04.2010
comment
Спасибо, Дэвид Мердок. К сожалению, это не решает проблему - показывает изображение в Google Chrome, но делает изображение статичным в Internet Explorer :( - person user; 06.04.2010
comment
Только что обнаружил, что все работает нормально во всех браузерах, если я включаю (new Image).src=/images/load.gif; на другой странице, к которой пользователь обращался перед отправкой формы. Я включу его на страницу входа, если нет другого решения. Не лучшее решение, но оно работает. - person user; 06.04.2010
comment
@Гуанч. В вашем скрипте много проблем с производительностью. Вам следует подумать о рефакторинге. Также не требуется 'language=JavaScript'. О, если бы вы хотели добавить мне +1, это было бы здорово! :-) - person David Murdoch; 07.04.2010
comment
Спасибо Дэвид Мердок за вашу помощь. Я не знаю скрипт Java и возможные проблемы с производительностью. Обычно я использую бесплатные скрипты, но в этот раз не удалось найти скрипт, работающий во всех браузерах. Мои скрипты состоят из 2 скриптов, написанных другими людьми - первая часть проверяет, выбран ли файл jpg и показывает скрытый div, вторая часть скрывает форму. Я нашел обсуждение этой проблемы, которое было открыто 6 лет назад и до сих пор активно: west-wind.com/Weblog/posts/1227.aspx - person user; 07.04.2010