2015-04-08 19 views
19

Mam następujący fragment kodu, który służy do pobrania małej części zdjęcia o wysokiej rozdzielczości na mojej stronie internetowej. Ideą jest, aby ludzie mają wgląd w jakości oryginalnej przed podjęciem decyzji o zakupie, czy nie:Zmiana atrybutu src obrazu za pomocą jQuery nie zawsze jest stosowana w przeglądarce Chrome/Opera

$('#magviewplus').attr('src', '/photos/original-snippet.php?id=<?php echo $nID?>&x='+left+'&y='+top).load(function() { 
    window.clearInterval(maginterval); 
    magtimer=3; 
    maginterval=window.setInterval(magViewCountdown,1000); 
    $('#clicktoenhance').html('Exiting in '+magtimer+'s...'); 
}); 

Z jakiegoś powodu, to jest przerywany. Fiddler pokazuje, że fragment jest zawsze wczytywany, ale jest wyświetlany tylko czasami. Nawet jeśli nie wyświetla się, kod w zdarzeniu load() działa dobrze.

Uważa, że ​​jest załadowany, Fiddler pokazuje, że jest załadowany, ale około 50% czasu nie wyświetla, gdzie powinien.

To zdarza się mniej na moim biurku w domu, a więcej na moim laptopie, gdy jestem poza domem, więc zastanawiam się, czy jest to w jakiś sposób związane z zasobem będącym nieco powolnym ładowaniem czasami ...?

Wszelkie pomysły?

edit: to rzeczywiście wydaje się ograniczony do Chrome & Opery, to działa dobrze w Firefox/IE11

+0

co robi magViewCountdown zrobić? – mplungjan

+0

Nic istotnego - wystarczy zaktualizować tekst clicktoenhance - pokazuje odliczanie, a następnie ukrywa pole po zakończeniu odliczania. – Codemonkey

+0

@Codemonkey Czy nie używasz wtyczek Adblock w przeglądarce Chrome i Firefox? Może nie lubią ".php" na twoim obrazie src – Dyrk

Odpowiedz

3

wygląda problemu jest dobrze udokumentowane, jak to wynika z następujących stanowisk:

  1. jquery callback on image load when changing the src

  2. Capturing load event for images dynamically changing their source

  3. jQuery callback on image load (even when the image is cached)

Proponuję załadować nowy obraz w pamięci, a następnie, gdy Zdarzenie ładunek ten nowy obraz, należy zmienić src rzeczywistego obrazu i robić, co jeszcze trzeba zrobić. Oryginalne zdjęcie pozostaje nienaruszona i wszelkie inne imprezy (inne niż obciążenia) załączone do niej powinny pozostać nienaruszone:

$(new Image()).attr('src', '/photos/original-snippet.php?id=<?php echo $nID?>&x=' + left + '&y=' + top).load(function() { 
    $('#magviewplus').attr('src', this.src); 
    window.clearInterval(maginterval); 
    magtimer = 3; 
    maginterval = window.setInterval(magViewCountdown,1000); 
    $('#clicktoenhance').html('Exiting in ' + magtimer + 's...'); 
}); 

DEMO

+0

Nadal utrzymuję, że moje pytanie nie dotyczy zdarzenia obciążenia, per se .... Ale ładowanie src do pamięci, a następnie przypisywanie (poprzez zdarzenie load ...) do obrazu wydaje się mieć stałe rzeczy, I myśleć. Będę testować przez cały dzień i sprawdzę, czy jest on konsekwentnie poprawiany przed zaakceptowaniem. – Codemonkey

+0

Po zapoznaniu się z testami daj mi znać. Jeśli odkryjesz, co według Ciebie może być przyczyną problemu, udostępnij je; jeśli możesz dostarczyć demo, byłby to olbrzymi krok w kierunku znalezienia głównej przyczyny. – PeterKA

+0

Musiałem dostosować niektóre buforowanie, aby uniknąć dwukrotnego załadowania obrazu (co oczywiście spowolniło to) za pomocą kodu, ale teraz, gdy już to zrobiłem, wszystko wydaje się całkiem dobre. Nie mam czasu ani ochoty go zhaczyć na demo Obawiam się ... :( – Codemonkey

0

Zastosowanie .load(), aby załadować obraz:

$('#magviewplus').load('/photos/original-snippet.php?id=<?php echo $nID?>&x='+left+'&y='+top, function() { 
    window.clearInterval(maginterval); 
    magtimer=3; 
    maginterval=window.setInterval(magViewCountdown,1000); 
    $('#clicktoenhance').html('Exiting in '+magtimer+'s...'); 
}); 
+0

Próbowałem go i wygląda na to, że w ogóle nie działa, i przegląda dokumenty jquery, które wydają się być dla fragmentów kodu HTML, więc nie działałoby w tym scenariuszu. – Codemonkey

1

Można użyć obrazu onload wydarzenie.

Ta procedura obsługi zdarzenia zostanie wywołana na elemencie obrazu po zakończeniu ładowania obrazu.

Kod

var url = '/photos/original-snippet.php?id=<?php echo $nID?>&x='+left+'&y='+top; 

var img = new Image(); 

img.onload = function() { 
    //When load's sucessfully 
    $('#magviewplus').prop('src', url); 

    window.clearInterval(maginterval); 
    magtimer=3; 
    maginterval=window.setInterval(magViewCountdown,1000); 
    $('#clicktoenhance').html('Exiting in '+magtimer+'s...'); 
}; 

img.onerror = function() { 
    //When load's fails 
}; 

img.src = url; //Set URL 
+2

Powinieneś zdefiniować onload PRZED ustawieniem .src - Czy to jednak nie to samo co jQuery.load? – mplungjan

+0

Wygląda na to, że problem wygląda dokładnie tak samo. – Codemonkey

+0

@Codemonkey, czy używasz tego samego adresu URL w innym miejscu? – Satpal

5

edytowane aby pokazać, że to nie działa ...

Wydawało się początkowo, że pragmatyczne "rozwiązanie" było usunięcie i ponowne dodaj zdjęcie:

<div id="magviewholder"><img id="magviewplus" src="pixel.gif" alt=""></div> 

Tak jak poniżej:

$('#magviewholder').children("img").remove() 
$('#magviewholder').append('<img>'); 

$('#magviewholder>img').attr('onerror','imgError(this)').attr('id','magviewplus').attr('src', '/photos/original-snippet.php?id=<?php echo $nID?>&x='+left+'&y='+top).load(function() { 
    window.clearInterval(maginterval); 
    magtimer=3; 
    maginterval=window.setInterval(magViewCountdown,1000); 
    $('#clicktoenhance').html('Exiting in '+magtimer+'s...'); 
}); 

To wydaje się działać we wszystkich przeglądarkach w pierwszym, ale wydaje się być tak samo przerywany teraz ...

+0

Czy możesz podać kroki prowadzące do wyświetlenia obrazu? na przykład ... 'Użytkownik klika na obrazie .. użytkownik wzięty do strony X ... ładuje się strona ... na stronie ładuje się obraz src jest zamieniany ... na inną funkcję x dzieje się ... ... także dlaczego używaj obciążenia ? może dostarczyć demo tego, co robisz? –

-1

Problem może być związany z polityką buforowania zasobów klienta, który zależy od przeglądarki i jej ustawienia. Jeśli tak, możesz wymusić przeładowanie obrazu, dołączając losową liczbę jako parametr do ciągu adresu. Z punktu widzenia serwera parametr ten nie ma znaczenia, ale dla przeglądarki jest to zupełnie nowy zasób, nawet w rzeczywistości jest taki sam.Poniżej próbka ilustruje tę metodę:

$('#loadbtn').click(function(){ 
 
    $('#msg').html("loading..."); 
 
    $('#myimg').attr("src", "http://cache1.asset-cache.net/xt/165920320.jpg?v=1&g=fs1%7C0%7CISI%7C20%7C320&s=1" + 
 
    "&rnd=" + Math.random()); 
 
}); 
 

 
$('#myimg').load(function(){ 
 
    $('#msg').html("loaded"); 
 
});
#loadbtn { 
 
    margin: 16px; 
 
} 
 
#msg { 
 
    margin: 16px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<img id='myimg' src='http://cache1.asset-cache.net/xt/165920320.jpg?v=1&g=fs1%7C0%7CISI%7C20%7C320&s=1' /> 
 
<div> 
 
    <input type=button id='loadbtn' value='reload' /> 
 
</div> 
 
<div id='msg'>loading...</div>

+0

Jasno stwierdziłem w pytaniu, że widzę zasób załadowany do Skrzypka. Ergo to nie jest problem z buforowaniem. A większość wniosków jest już nowa/wyjątkowa. – Codemonkey

-1

spróbować umieścić de „nazwa” własność w znaczniku o tej samej wartości, podobne właściwość "id".

<id="magviewplus" name="magviewplus".../> 

w ten sposób jQuery nawet w Chrome wykryje atribute i zmienić poprawnie, w Olders wersja jQuery zignorować jeśli to działa, nadzieję, że to pomaga