2010-09-10 18 views
48

Sto sviluppando un'applicazione Twitter che fa riferimento alle immagini direttamente da Twitter. Come posso evitare di riprodurre le gif animate?Arresto dell'animazione GIF a livello di programmazione

L'utilizzo di window.stop() alla fine della pagina non funziona per me in Firefox.

C'è un migliore hack JavaScript? Preferibile questo dovrebbe funzionare per tutti i browser

+0

Se hai linguaggio lato server a vostra disposizione penso che meglio codice lato server per l'uso di prendere il primo fotogramma, memorizzarlo sul vostro server e mostrare invece .. –

+0

Il problema è che ci sono 15-60 immagini da Twitter per cambiare. Vedi http://jetwick.com (open source). – Karussell

+0

sì ma lo cambi solo una volta, quindi non dovrebbe essere un problema. –

risposta

43

Questa non è una soluzione cross browser ma ha funzionato in firefox e opera (non in ie8: - /). Preso from here

[].slice.apply(document.images).filter(is_gif_image).map(freeze_gif); 

function is_gif_image(i) { 
    return /^(?!data:).*\.gif/i.test(i.src); 
} 

function freeze_gif(i) { 
    var c = document.createElement('canvas'); 
    var w = c.width = i.width; 
    var h = c.height = i.height; 
    c.getContext('2d').drawImage(i, 0, 0, w, h); 
    try { 
     i.src = c.toDataURL("image/gif"); // if possible, retain all css aspects 
    } catch(e) { // cross-domain -- mimic original with all its tag attributes 
     for (var j = 0, a; a = i.attributes[j]; j++) 
      c.setAttribute(a.name, a.value); 
     i.parentNode.replaceChild(c, i); 
    } 
} 
+2

Sta usando HTML5 quindi, per quanto posso vedere, dovrebbe funzionare su qualsiasi browser che supporti HTML5. In base a questo: http://www.deepbluesky.com/blog/-/browser-support-for-css3-and-html5_72/ IE continua a non supportarlo. –

+0

grazie per aver segnalato questo – Karussell

+3

I * penso * questo funzionerebbe solo su gif animate locali rispetto a quelle ospitate su un dominio diverso – donohoe

1

Questo è un po 'un trucco, ma potresti provare a caricare la gif in un iframe e chiamare window.stop() dall'iframe (su se stesso) una volta che l'immagine è stata caricata. Ciò impedisce il resto della pagina di fermarsi.

+1

questo rallenterà il rendering della pagina? – Karussell

+0

io non la penso così, no. Provalo! – Jason

+0

Ti dispiacerebbe fornirmi un esempio di codice. Non riuscivo a farlo funzionare con il tuo metodo + vedere l'aggiornamento – Karussell

42

Ispirato alla risposta di @Karussell ho scritto Gifffer. Dateci un'occhiata qui https://github.com/krasimir/gifffer

Aggiunge automaticamente il controllo stop/play sulla parte superiore della Gif.

+2

Vorrei poter +5 questo. –

+1

Vorrei poter +5 il commento precedente qui ... :) Questo è un piccolo (ma molto intelligente) pezzo di codice per gestire GIF animate come quella. Grazie – TheCuBeMan

7

Nel tentativo di migliorare la risposta di Karussell, questa versione dovrebbe essere cross-browser, blocca tutte le immagini comprese quelle che hanno una fine di file non corretta (ad esempio pagine di caricamento automatico dell'immagine), e non è in conflitto con la funzione dell'originale immagine, facendo clic sul pulsante destro del mouse come se fosse in movimento.

Farei rilevare l'animazione, ma è molto più intensivo che congelarli a prescindere.

function createElement(type, callback) { 
    var element = document.createElement(type); 

    callback(element); 

    return element; 
} 

function freezeGif(img) { 
    var width = img.width, 
    height = img.height, 
    canvas = createElement('canvas', function(clone) { 
     clone.width = width; 
     clone.height = height; 
    }), 
    attr, 
    i = 0; 

    var freeze = function() { 
     canvas.getContext('2d').drawImage(img, 0, 0, width, height); 

     for (i = 0; i < img.attributes.length; i++) { 
      attr = img.attributes[i]; 

      if (attr.name !== '"') { // test for invalid attributes 
       canvas.setAttribute(attr.name, attr.value); 
      } 
     } 

     canvas.style.position = 'absolute'; 

     img.parentNode.insertBefore(canvas, img); 
     img.style.opacity = 0; 
    }; 

    if (img.complete) { 
     freeze(); 
    } else { 
     img.addEventListener('load', freeze, true); 
    } 
} 

function freezeAllGifs() { 
    return new Array().slice.apply(document.images).map(freezeGif); 
} 

freezeAllGifs(); 
Problemi correlati