2012-06-18 10 views
0

У меня проблема с изменением bg-изображения из div. Он работает на Google Chrome и Firefox безупречно, но на IE он немного висит. В IE очень медленно, и иногда он действительно загружает изображение должным образом. мой JQuery код:Изменение изображения bg через JQuery очень медленно на IE

$("a.preview").click(function(e){ 
    var carregar = new Image(); 
    $(carregar).attr('src','imagens/logos/' + this.id +'.jpg'); 
    var img = "imagens/logos/" + this.id +".jpg"; // recebe src da imagem de acordo com a ID 
    var alvo = this.id; // salva ID do disparador 
    var logo = document.createElement('img'); // cria objeto imagem 
    var $logoCarregado = $(logo); // recebe o objeto imagem criado 
    $logoCarregado.attr('src', 'imagens/logos/'+ alvo +'_logo.png'); //define atributo src da imagem criada 

    $(".box").fadeOut("fast"); 
    $(".box").hide(); 
    $(".overlay").hide("fast"); 
    $(".logo").hide("fast"); 
    $(".logo").empty(); 

    $(".loader").show("fast"); // mostra carregamento 
    $(carregar).load(function() { // carrega o conteudo 
     $(".loader").hide("fast"); // esconde imagem de carregamento 
     $(".logo").empty(); // apaga conteúdo da ID logo 
     $("#menu").fadeOut("fast"); //fadeOut menu 
     $(".overlay").show("fast"); // mostra barra do conteúdo da página do cliente  
     $(".logo").show("fast"); // mostra logo do cliente 
     $logoCarregado.appendTo('.logo'); // atribue a logo do cliente á div logo 
     $("#fundo").empty(); 
     $("#fundo").append("<img src='"+ img +"' class='bg' />"); // troca o fundo 
     var logoHeight = $logoCarregado.height() + 100; // seta o tamanho da logo + 80 como altura 

     if (logoHeight <= 120){ //verifica posição do logo do cliente 

     $(".box" + "#"+alvo) // seleciona o box de texto de acordo com a ID do disparador 
      .css("display", + "block") // mostra o box 
      .css("left","0%") // define distância da margem esquerda do box 
      .fadeIn("fast") // fadeIn texto 
      .css("top",+ logoHeight+100 + 'px'); // define altura do box 
     $(".box" + "#"+alvo).animate({ 
      left: '8%'}, 300); // anima entrada do texto 
     } 
     else{ 

      $(".box" + "#"+alvo) // seleciona o box de texto de acordo com a ID do disparador 
      .css("display", + "block") // mostra o box 
      .css("left","0%") // define distância da margem esquerda do box 
      .fadeIn("fast") // fadeIn texto 
      .css("top",+ logoHeight + 'px'); // define altura do box 
     $(".box" + "#"+alvo).animate({ 
      left: '8%'}, 300); // anima entrada do texto 
     } 

     }); 
return false; 
    }); 

Сайт: link

ответ

0

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

Таким образом, вместо того, чтобы использовать это:

$(".box").fadeOut("fast"); 
$(".box").hide(); 
$(".overlay").hide("fast"); 
$(".logo").hide("fast"); 
$(".logo").empty(); 

Попробуйте это ...

var $boxElem = $('.box'); 
var $logoElem = $('.logo'); 

$boxElem.fadeOut("fast").hide(); 
$(".overlay").hide("fast"); 
$logoElem.hide("fast").empty(); 

Или еще лучше ...

var boxElem = document.getElementsByClassName('box')[0]; 
+0

ТКС много для наконечника micadelli ! Похоже, что теперь он работает лучше после изменений, которые вы предложили, но он все еще не работает так гладко, как на хроме, например. Предварительный просмотр можно найти здесь: http://www.zecaconsoni.com.br/ftp/novo/clientes.html все равно, чтобы оптимизировать время загрузки этих изображений? Добавление предварительной загрузки сделает ее более медленной, так как она должна будет загружать каждое изображение bg правильно? Заранее спасибо. – japabr

+0

Кажется, что это очень большие изображения, которые вы загружаете ... Я бы, вероятно, сделал это так, чтобы он начал загружать их после полной загрузки страницы «клиентов» и, возможно, добавить какой-то индикатор выполнения, где-то на странице .. это мои 2 цента – micadelli

+0

Изображение имеет средний вес 400 кб каждая, я думал, что проблема будет в коде, который я написал, но поскольку никто не указал на это, я полагаю, что это правильно, что меня путает, почему Chrome, Safari и Firefox представляют страницу так, как должно быть, но IE этого не делает. Если предварительная загрузка выполняется после отображения страницы, я должен использовать document.load или .ready? Tks снова – japabr

0

Это зависит, что именно происходит медленно. Это может быть вызвано следующими причинами:

  • изменения DOM
  • Backgroud образ загрузки

JQuery замедляет браузер по дизайну. Чтобы добиться действительно быстрой страницы, не используйте jQuery.

Стоит предварительно загрузить изображение:

var imageObj = new Image(); 
imageObj.src = 'image.png'; 

Тогда вы можете просто переключать CSS классы:

.mode1 { 
    background-image: url(default.png); 
} 

.mode2 { 
    background-image: url(image.png); 
} 

на ECMAScript:

document.getElementById('logo').className = 'mode2'; 
+0

Václav Я не знаю, как это объяснить, но «ощущение» его медленного или застревания где-то просто происходит, когда я использую IE. В противном случае это вполне нормально. Интересно, это что-то не так с моим кодом или его стандартным поведением в IE. Вы получили доступ к ссылке, которую я опубликовал? Предварительная загрузка каждого изображения не поможет, потому что пользователю придется много ждать (каждое изображение - 400 кб). И так как мой BG изменяется только тогда, когда пользователь нажимает на ссылку, я думал, что это будет быстрее делать это с помощью JQuery, и у меня есть другие анимации, исполняемые вместе. Tks много для ответа tho. – japabr

+0

Я посетил вашу страницу и проследил сетевое общение. Opera загружает все изображения, указанные CSS при загрузке страницы. IE загружает их, когда они необходимы.Вы должны предварительно загружать изображения после загрузки страницы. Пользователь не должен был ждать. –

+0

Итак, сценарий предварительной загрузки запускается на document.load или document.ready? – japabr

 Смежные вопросы

  • Нет связанных вопросов^_^