2010-09-10 3 views
48

Я разрабатываю приложение Twitter, которое ссылается на изображения непосредственно из Twitter. Как предотвратить воспроизведение анимированных gifs?Остановка анимации GIF Programmatically

Использование window.stop() в конце страницы не работает для меня в Firefox.

Есть ли лучший JavaScript-хак? Предпочтительно это должно работать для всех браузеров.

+0

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

+0

Проблема заключается в том, что существует 15 до 60 изображения из твиттера для изменения. См. Http://jetwick.com (с открытым исходным кодом). – Karussell

+0

Да, но вы меняете его только один раз, поэтому это не должно быть проблемой. –

ответ

43

Это не кросс-браузерное решение, но это работало в firefox и opera (не в ie8: - /). Взятые 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

Он использует HTML5, насколько я могу судить, он должен работать на любом браузере, поддерживающем HTML5. В соответствии с этим: http://www.deepbluesky.com/blog/-/browser-support-for-css3-and-html5_72/ IE все еще не поддерживает его. –

+0

спасибо, что указали это – Karussell

+3

Я * думаю * это будет работать только на локальных анимированных gifs, а не на других доменах – donohoe

1

Это немного взломанный, но вы можете попробовать загрузить gif в iframe и вызвать window.stop() изнутри iframe (по себе) после загрузки изображения. Это предотвратит остановку остальной части страницы.

+1

будет ли это замедлять рендеринг страниц? – Karussell

+0

Я так не думаю, нет. попробуй! – Jason

+0

Не могли бы вы привести пример кода. Я не мог заставить его работать с вашим методом + видеть обновление – Karussell

42

Вдохновленный ответом @Karussell я написал Gifffer. Здесь вы можете ознакомиться здесь https://github.com/krasimir/gifffer

Он автоматически добавляет контроль остановки/воспроизведения на вершине вашего Gif.

+2

Желаю, чтобы я смог +5. –

+1

Жаль, что я мог +5 здесь оставить комментарий ... :) Это очень маленький (но очень умный) код для обработки анимированных GIF-файлов. благодаря – TheCuBeMan

7

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

Я бы заставил его обнаруживать анимацию, но это намного более интенсивное, чем просто замораживание.

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(); 

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

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