Обнаружение поддержки WebP

Как я могу определить поддержку WebP через Javascript? Я хотел бы использовать обнаружение функций, а не обнаружение браузера, если это возможно, но я не могу найти способ сделать это. Modernizr (www.modernizr.com) его не проверяет.


person dieki    schedule 06.04.2011    source источник
comment
Если вы загрузите такое изображение в элемент Image, а затем проверите ширину и высоту в браузере, который не поддерживает этот формат, вы получите что-нибудь?   -  person Pointy    schedule 07.04.2011
comment
(Я имел в виду объект Image , а не элемент; например, new Image () ...)   -  person Pointy    schedule 07.04.2011
comment
Выглядит неплохо. Таким образом я могу получить сообщение «Я действительно поддерживаю WebP»; но я не могу получить сообщение "Я не поддерживаю WebP".   -  person dieki    schedule 07.04.2011
comment
Я разместил аналогичный вопрос: Что официальная рекомендация Google по обнаружению поддержки браузера WebP? в группе WebP Google.   -  person Mike    schedule 31.01.2013
comment
Это лучше: queryj.wordpress.com/2012/06/11 / Detecting-webp-support   -  person user956584    schedule 15.05.2014
comment
@Mike На этот раз есть официальная заметка разработчиков Google для этого.   -  person hexalys    schedule 29.05.2014
comment
Если вы хотите, чтобы Firefox реализовал собственный WebP, вы можете проголосуйте за эту проблему в своем баг-трекере.   -  person Blaise    schedule 19.07.2014
comment
Эти ответы абсолютно безумны. Это же современный Интернет ?!   -  person Simon_Weaver    schedule 26.06.2018
comment
@Simon_Weaver, этому вопросу и комментариям уже несколько лет. Старые вопросы редко поддерживаются каким-либо существенным образом; однако вы всегда можете добавить новый ответ.   -  person Pointy    schedule 08.10.2018
comment
Не знаю, новый ли он, но модернизатор проверяет его now: modernizr.com/download? webp-setclasses & q = webp   -  person suther    schedule 30.12.2020


Ответы (17)


Это мое решение - занимает около 6 мс, и я считаю, что WebP - это функция только для современного браузера. Использует другой подход с использованием функции canvas.toDataUrl () вместо изображения в качестве способа обнаружения функции:

function support_format_webp()
{
 var elem = document.createElement('canvas');

 if (!!(elem.getContext && elem.getContext('2d')))
 {
  // was able or not to get WebP representation
  return elem.toDataURL('image/webp').indexOf('data:image/webp') == 0;
 }
 else
 {
  // very old browser like IE 8, canvas not supported
  return false;
 }
}
person Rui Marques    schedule 01.12.2014
comment
Большой! Все равно использовал его для холста, так что это быстрый и полезный тест. - person Josiah; 02.03.2015
comment
Это лучшее решение. Если вы любитель модулей npm, я опубликовал сокращенную версию этого модуля как _1 _ - person fregante; 04.08.2016
comment
Это должен быть принятый ответ, потому что у всех остальных есть задержка из-за указания на сетевой ресурс или URI данных. - person imal hasaranga perera; 02.03.2017
comment
Вы должны установить ширину и высоту 1 пиксель, иначе toDataURL будет очень длинным в Chrome и Opera. - person vitaliydev; 22.06.2017
comment
Упрощенная версия: webp = e => document.createElement('canvas').toDataURL('image/webp').indexOf('data:image/webp') == 0; - person António Almeida; 26.03.2018
comment
это великолепно - person oblalex; 09.12.2018
comment
Это не работает в Firefox 65, который поддерживает отображение webp, но не создает URL-адрес данных webp из элемента холста. - person carlcheel; 13.12.2018
comment
Люблю это, потому что это синхронно, однако @carlcheel прав. FF 65 (у которого есть поддержка webp) по-прежнему возвращает false здесь :-( - person RoccoB; 10.01.2019
comment
Это было бы замечательно, если бы это работало для FF65 и Edge18. Оба они поддерживают webp, но сериализуют холст с данными: image / png. - person undefinederror; 11.01.2019
comment
Что касается macOS BigSur, который добавляет поддержку WebP в Safari, это, к сожалению, также не работает в Safari, так же, как FF65 + toDataURL('image/webp') создает PNG. - person duncanwilcox; 27.07.2020
comment
Похоже, это работает только в Chrome, это не очень полезно ... - person Maxime Chéramy; 16.11.2020
comment
это не работает с Safari 14. Safari 14 поддерживает webp, но эта функция возвращает false. - person Ivan; 06.07.2021

Я думаю, что что-то вроде этого может сработать:

var hasWebP = false;
(function() {
  var img = new Image();
  img.onload = function() {
    hasWebP = !!(img.height > 0 && img.width > 0);
  };
  img.onerror = function() {
    hasWebP = false;
  };
  img.src = 'http://www.gstatic.com/webp/gallery/1.webp';
})();

В Firefox и IE обработчик «onload» просто не будет вызываться вообще, если изображение не может быть распознано, и вместо этого вызывается «onerror».

Вы не упомянули jQuery, но в качестве примера того, как справиться с асинхронным характером этой проверки, вы можете вернуть объект jQuery «Deferred»:

function hasWebP() {
  var rv = $.Deferred();
  var img = new Image();
  img.onload = function() { rv.resolve(); };
  img.onerror = function() { rv.reject(); };
  img.src = 'http://www.gstatic.com/webp/gallery/1.webp';
  return rv.promise();
}

Тогда вы могли бы написать:

hasWebP().then(function() {
  // ... code to take advantage of WebP ...
}, function() {
  // ... code to deal with the lack of WebP ...
});

Вот пример jsfiddle.


Более продвинутая программа проверки: http://jsfiddle.net/JMzj2/29/. Он загружает изображения из URL-адреса данных и проверяет, успешно ли он загружается. Поскольку WebP теперь также поддерживает изображения без потерь, вы можете проверить, поддерживает ли текущий браузер только WebP с потерями или WebP без потерь. (Примечание: это также неявно проверяет поддержку URL-адресов данных.)

var hasWebP = (function() {
    // some small (2x1 px) test images for each feature
    var images = {
        basic: "data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAACyAgCdASoCAAEALmk0mk0iIiIiIgBoSygABc6zbAAA/v56QAAAAA==",
        lossless: "data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA="
    };

    return function(feature) {
        var deferred = $.Deferred();

        $("<img>").on("load", function() {
            // the images should have these dimensions
            if(this.width === 2 && this.height === 1) {
                deferred.resolve();
            } else {
                deferred.reject();
            }
        }).on("error", function() {
            deferred.reject();
        }).attr("src", images[feature || "basic"]);

        return deferred.promise();
    }
})();

var add = function(msg) {
    $("<p>").text(msg).appendTo("#x");
};

hasWebP().then(function() {
    add("Basic WebP available");
}, function() {
    add("Basic WebP *not* available");
});

hasWebP("lossless").then(function() {
    add("Lossless WebP available");
}, function() {
    add("Lossless WebP *not* available");
});
person Pointy    schedule 06.04.2011
comment
Потрясающие! Это работает в FF, Chrome и IE 9. По какой-то причине это не работает в IE8 или IE7. - person dieki; 07.04.2011
comment
У меня это работает в IE7 - попробуйте jsFiddle, который я только что связал с концом ответа. - person Pointy; 07.04.2011
comment
Ну, в моем исходном ответе только что была загрузка - я даже не знал, что для объектов Image есть ошибка :-) - person Pointy; 07.04.2011
comment
Ах да. Я использовал URL-адрес data: вместо изображения, и IE7 этого не поддерживает. :П - person dieki; 07.04.2011
comment
Да ладно, это бы сработало :-) Я немного удивлен, что он не удосужился вызвать обработчик ошибок, но мы говорим об IE7, и это несколько удивительно, когда ему вообще удается что-то делать. - person Pointy; 07.04.2011
comment
Что ж, это ответ на мой первоначальный вопрос. Но есть ли у вас идеи по обнаружению этого с помощью чистого javascript, без необходимости в изображении? Вот что я пытался сделать с данными: url. - person dieki; 07.04.2011
comment
Хм, мой пример извлекает реальное изображение из Google, и, поскольку это их формат, они могут не возражать :-) Но нет, поскольку IE не понимает URL-адреса данных, и, конечно, у них нет возможности явно сообщить вам они не знают о чем-то изобретенном с тех пор, как были выпущены, я не могу придумать другого способа сделать это, кроме как напрямую попробовать изображение. возможно, что эти браузеры будут кэшировать данные изображения, даже если они не могут создать из них изображение ... - person Pointy; 07.04.2011
comment
Я только что понял, что могу заставить IE8 правильно работать с URL-адресами data: и заставить IE7 выдавать для него ошибку; проблема заключалась в том, что они не поддерживают их напрямую в javascript. См. jsfiddle.net/HaLXz - person dieki; 07.04.2011
comment
Хм, хорошо. Я хотел написать патч для добавления поддержки Modernizr, но для этого он должен быть только JS. :) - person dieki; 07.04.2011
comment
@Pointy: ваш отложенный код можно немного настроить, чтобы обнаруживать только один раз (в отличие от каждого вызова), запоминая себя (поэтому он всегда возвращает одно и то же обещание, а не генерирует новый каждый раз). Просто мысль... - person ircmaxell; 31.05.2013
comment
@ircmaxell да, это правда; или его можно было бы включить в что-то вроде Modernizr, которое само запомнило бы. - person Pointy; 31.05.2013
comment
Похоже, это не работает для Safari на OSX. Тем не менее, приведенный ниже ответ. - person Sam Tolton; 17.06.2019
comment
@SamTolton ну, этому ответу восемь лет :) - person Pointy; 17.06.2019

Предпочтительное решение в HTML5

<picture>
  <source srcset="/path/to/image.webp" type="image/webp">
  <img src="/path/to/image.jpg" alt="insert alt text here">
</picture>

Wiki на W3C

person Andrei Krasutski    schedule 28.10.2017
comment
Работает отлично, type="image/webp" критичен для того, чтобы браузер пропустил его, если формат неизвестен! - person adrianTNT; 14.11.2018
comment
Это хорошо, но это не работает для фоновых изображений, и если вы модифицируете webp на сайт, и это требует изменения вашего html, что также означает изменение всех мест в вашем CSS, которые ссылаются на тег img. - person kloddant; 06.01.2020
comment
Да, это лучшее решение проблемы. Спасибо - person Janith; 28.02.2020
comment
Все ли браузеры, поддерживающие webp, также поддерживают элемент изображения? - person molerat; 28.07.2020
comment
Хотя нативный HTML5 предпочтительнее, большинство браузеров загружают и JPG, и WEBP, что отрицательно сказывается на времени загрузки. Подробно: smashingmagazine.com/ 2013/05 / - person Jan Werkhoven; 22.11.2020

Официальный способ от Google:

Поскольку некоторые старые браузеры имеют частичную поддержку webp, поэтому лучше уточнить, какие именно веб-страницы вы используете. пытаются использовать и обнаружить эту особую функцию, и вот официальная рекомендация Google для как определить конкретную функцию webp:

// check_webp_feature:
//   'feature' can be one of 'lossy', 'lossless', 'alpha' or 'animation'.
//   'callback(feature, isSupported)' will be passed back the detection result (in an asynchronous way!)
function check_webp_feature(feature, callback) {
    var kTestImages = {
        lossy: "UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",
        lossless: "UklGRhoAAABXRUJQVlA4TA0AAAAvAAAAEAcQERGIiP4HAA==",
        alpha: "UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAARBxAR/Q9ERP8DAABWUDggGAAAABQBAJ0BKgEAAQAAAP4AAA3AAP7mtQAAAA==",
        animation: "UklGRlIAAABXRUJQVlA4WAoAAAASAAAAAAAAAAAAQU5JTQYAAAD/////AABBTk1GJgAAAAAAAAAAAAAAAAAAAGQAAABWUDhMDQAAAC8AAAAQBxAREYiI/gcA"
    };
    var img = new Image();
    img.onload = function () {
        var result = (img.width > 0) && (img.height > 0);
        callback(feature, result);
    };
    img.onerror = function () {
        callback(feature, false);
    };
    img.src = "data:image/webp;base64," + kTestImages[feature];
}

Пример использования:

check_webp_feature('lossy', function (feature, isSupported) {
    if (isSupported) {
        // webp is supported, 
        // you can cache the result here if you want
    }
});

Обратите внимание, что загрузка изображений не блокируется и выполняется асинхронно. Это означает, что любой код, зависящий от поддержки WebP, предпочтительно помещать в функцию обратного вызова.

Также обратите внимание, что другие синхронные решения не будут работать с Firefox 65.

person AbdelHady    schedule 11.02.2019

Это старый вопрос, но Modernizr теперь поддерживает обнаружение Webp.

http://modernizr.com/download/

Найдите img-webp в разделе «Неосновные обнаружения».

person Jake Wilson    schedule 23.06.2014
comment
Источник полезен, чтобы узнать, что они сделали. / Modernizr / Modernizr / blob / - person Simon_Weaver; 26.06.2018
comment
Для меня он работал достаточно надежно и позволяет работать с классами CSS .webp и .no-webp для большей гибкости. - person molerat; 28.07.2020

Вот версия ответа Джеймса Вестгейта в ES6.

function testWebP() {
    return new Promise(res => {
        const webP = new Image();
        webP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';
        webP.onload = webP.onerror = () => {
            res(webP.height === 2);
        };        
    })
};

testWebP().then(hasWebP => console.log(hasWebP));

FF64: ложь

FF65: правда

Chrome: правда

Мне нравится синхронный ответ от Руи Маркеса, но, к сожалению, FF65 по-прежнему возвращает false, несмотря на возможность отображать WebP.

person RoccoB    schedule 10.01.2019

Вот код без необходимости запрашивать изображение. Обновлено с помощью новой скрипки qwerty.

http://jsfiddle.net/z6kH9/

function testWebP(callback) {
    var webP = new Image();
    webP.onload = webP.onerror = function () {
        callback(webP.height == 2);
    };
    webP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';
};

testWebP(function(support) {
    document.body.innerHTML = support ? 'Yeah man!' : 'Nope';
});
person James Westgate    schedule 07.06.2012
comment
Для меня это было полностью нарушено. Я раздвоил его и заставил работать: jsfiddle.net/z6kH9 - person qwerty; 28.06.2014
comment
Будет ли это работать во всех браузерах? Я имею в виду проблемы других решений в Safari + FF65 +. - person molerat; 28.07.2020
comment
Думаю, это лучшее решение. По-прежнему хотелось бы увидеть тесты в старых браузерах и браузерах, не поддерживающих webp. - person Kostanos; 12.10.2020

WebPJS использует более интеллектуальное определение поддержки WebP без необходимости внешних изображений: http://webpjs.appspot.com/

person unxed    schedule 20.11.2011
comment
Сценарий, который они используют для загрузки файла, можно использовать без фактического использования файла. Просто замените внутреннюю часть на то, что вы хотели бы сделать, если нет поддержки WebP. - person tgrosinger; 29.11.2011
comment
Похоже, они используют URL-адреса данных, и это то, что я в конечном итоге использовал. - person dieki; 16.01.2012

Я обнаружил, что обнаружение функции поддержки webp требует 300 + мс, когда страница загружена JavaScript. Итак, я написал скрипт с функциями кеширования:

  • кеш скрипта
  • кеш локального хранилища

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

/**
 * @fileOverview WebP Support Detect.
 * @author ChenCheng<[email protected]>
 */
(function() {

  if (this.WebP) return;
  this.WebP = {};

  WebP._cb = function(isSupport, _cb) {
    this.isSupport = function(cb) {
      cb(isSupport);
    };
    _cb(isSupport);
    if (window.chrome || window.opera && window.localStorage) {
      window.localStorage.setItem("webpsupport", isSupport);
    }
  };

  WebP.isSupport = function(cb) {
    if (!cb) return;
    if (!window.chrome && !window.opera) return WebP._cb(false, cb);
    if (window.localStorage && window.localStorage.getItem("webpsupport") !== null) {
      var val = window.localStorage.getItem("webpsupport");
      WebP._cb(val === "true", cb);
      return;
    }
    var img = new Image();
    img.src = "data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA";
    img.onload = img.onerror = function() {
      WebP._cb(img.width === 2 && img.height === 2, cb);
    };
  };

  WebP.run = function(cb) {
    this.isSupport(function(isSupport) {
      if (isSupport) cb();
    });
  };

})();
person sorrycc    schedule 09.04.2013

Изображения WebP с htaccess

Поместите следующее в свой .htaccess файл, и изображения jpg / png будут заменены изображениями WebP, если они находятся в той же папке.

<IfModule mod_rewrite.c>
  RewriteEngine On

  # Check if browser support WebP images
  RewriteCond %{HTTP_ACCEPT} image/webp

  # Check if WebP replacement image exists
  RewriteCond %{DOCUMENT_ROOT}/$1.webp -f

  # Serve WebP image instead
  RewriteRule (.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]
</IfModule>

<IfModule mod_headers.c>
  Header append Vary Accept env=REDIRECT_accept
</IfModule>

<IfModule mod_mime.c>
  AddType image/webp .webp
</IfModule>

Дополнительные сведения см. здесь

person Andrei Krasutski    schedule 28.10.2017

вот простая функция с Promise, основанная на ответе Pointy

let webpSupport = undefined // so we won't have to create the image multiple times
const webp1Px = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA'

function isWebpSupported () {
  if (webpSupport !== undefined) {
    return Promise.resolve(webpSupport)
  }

  return new Promise((resolve, _reject) => {
    const img = new Image()
    img.onload = () => {
      webpSupport = !!(img.height > 0 && img.width > 0);
      resolve(webpSupport)
    }
    img.onerror = () => {
      webpSupport = false
      resolve(webpSupport)
    }
    img.src = webp1Px
  })
}
person Liron Navon    schedule 05.08.2018
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа. - person Nic3500; 05.08.2018
comment
Я думал, что это довольно ясно, мы пытаемся загрузить изображение webp из строки base64 (которая имеет ширину и высоту 1 пиксель), если мы загрузили его правильно (вызывается onload), он поддерживается, если нет (вызывается onerror), это не так, я просто обернул его в обещании. - person Liron Navon; 24.06.2019

Моя короткая версия. Я использовал его, чтобы дать браузеру webP или jpg / png.

Google съел это, и старый iphone (f̶u̶c̶k̶i̶n̶g̶ ̶s̶h̶e̶e̶t̶ -safari) тоже отлично работает!

function checkWebP(callback) {
    var webP = new Image();
    webP.onload = webP.onerror = function () {
        callback(webP.height == 2);
    };
    webP.src = 'data:image/webp;base64,UklGRjoAAABXRUJQVlA4IC4AAACyAgCdASoCAAIALmk0mk0iIiIiIgBoSygABc6WWgAA/veff/0PP8bA//LwYAAA';
};

checkWebP(function(support) {
      if(support) {
          //Do what you whant =)
         console.log('work webp');
      }else{
          //Do what you whant =)
         console.log('not work, use jgp/png')
      }
      
})

person Alexander Sanik    schedule 06.08.2019

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

function testWebP = () => {
    const canvas = typeof document === 'object' ? 
    document.createElement('canvas') : {};
    canvas.width = canvas.height = 1;
    return canvas.toDataURL ? canvas.toDataURL('image/webp').indexOf('image/webp') === 5 : false;
}

Этот метод значительно улучшил время рендеринга.

person Guy Sopher    schedule 09.04.2018
comment
не работает в Firefox ... который поддерживает image/webp, но в этом случае возвращает false (но правильно работает как в Safari, так и в Chrome) - person a14m; 11.03.2019

Обнаружение и замена расширений Webp на JavaScript:

 async function supportsWebp() {
  if (!self.createImageBitmap) return false;

  const webpData = 'data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA=';
  const blob = await fetch(webpData).then(r => r.blob());
  return createImageBitmap(blob).then(() => true, () => false);
}

(async () => {
  if(await supportsWebp()) {
    console.log('webp does support');
  }
  else {
    $('#banners .item').each(function(){
        var src=$(this).find('img').attr('src');
        src = src.replace(".webp", ".jpg");
        $(this).find('img').attr('src',src);
    });
    console.log('webp does not support');
  }
})();
person Limitless isa    schedule 09.07.2018

Это гибридный метод HTML / Javascript, который позволит вам определять поддерживаемые типы изображений в порядке предпочтения (ваши предпочтения). В этом примере он вернет первый поддерживаемый тип изображения в браузере и проверит AVIF, WebP, JpegXL и JPG.

<picture style="display:none;">
<source type=image/avif srcset="data:image/avif;base64,AAAAFGZ0eXBhdmlmAAAAAG1pZjEAAACgbWV0YQAAAAAAAAAOcGl0bQAAAAAAAQAAAB5pbG9jAAAAAEQAAAEAAQAAAAEAAAC8AAAAGwAAACNpaW5mAAAAAAABAAAAFWluZmUCAAAAAAEAAGF2MDEAAAAARWlwcnAAAAAoaXBjbwAAABRpc3BlAAAAAAAAAAQAAAAEAAAADGF2MUOBAAAAAAAAFWlwbWEAAAAAAAAAAQABAgECAAAAI21kYXQSAAoIP8R8hAQ0BUAyDWeeUy0JG+QAACANEkA= 1x">
<source type=image/webp srcset="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA 1x">
<source type=image/jxl srcset="data:image/jxl;base64,/woAEBAJCAQBACwASxLFgoUJEP3D/wA= 1x">
<img onload=console.log(this.currentSrc.substring(this.currentSrc.indexOf(':')+1,this.currentSrc.indexOf(';'))) src="data:image/jpg;base64,/9j/4AAQSkZJRgABAQIAHAAcAAD/2wBDAAMDAwMDAwMDAwMEBAQEBAYFBQUFBgkGBwYHBgkOCAoICAoIDgwPDAsMDwwWEQ8PERYZFRQVGR4bGx4mJCYyMkP/wgALCAABAAEBAREA/8QAFAABAAAAAAAAAAAAAAAAAAAACf/aAAgBAQAAAABU/wD/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/9oACAEBAAE/AH//2Q==">
</picture>

Вы можете заменить функцию журнала на все, что вам нужно.

Преимущества такого подхода:

  1. вам не нужно создавать и запрашивать кучу объектов в Javascript, поэтому это эффективно
  2. Браузеру не нужно загружать изображения, они закодированы встроенным образом, поэтому работают быстро и синхронно. Вы можете вставить это куда угодно и получить ответ в следующей строке без обратных вызовов.
  3. Браузер создаст результат изображения только для первой поддерживаемой строки, поэтому он эффективен.
  4. Добавить поддержку будущих изображений легко, добавив одну строку.
  5. Вы можете заказать изображения для любого приоритета, который вы будете использовать в своем приложении.
  6. Вы можете превратить это в отдельные тесты, обрезав типы изображений, которые вам не нужны.
  7. Это должно работать, даже если элемент PICTURE не поддерживается, но требует currentSrc, поэтому IE11 не сработает. В этом случае просто проверьте currentSrc в img или предположите, что поддержка JPG всегда присутствует.

РЕДАКТИРОВАТЬ: удален разрыв строки, который попал в пример, спасибо.

person dbquarrel    schedule 24.02.2021
comment
в примере avif есть дополнительный разрыв строки, который нарушает функциональность - person AllInOne; 27.03.2021

Используя ответ @Pointy, это для Angular 2+:

import { Injectable } from '@angular/core';
import { Subject }    from 'rxjs/Subject';

@Injectable()
export class ImageService {
    private isWebpEnabledSource = new Subject<boolean>();

    isWebpEnabledAnnounced$ = this.isWebpEnabledSource.asObservable();

    isWebpEnabled() {
        let webpImage = new Image();

        webpImage.src = 'data:image/webp;base64,UklGRjIAAABXRUJQVlA4ICYAAACyAgCdASoCAAEALmk0mk0iIiIiIgBoSygABc6zbAAA/v56QAAAAA==';

        webpImage.onload = () => {
            if (webpImage.width === 2 && webpImage.height === 1) {
                this.isWebpEnabledSource.next(true);
            } else {
                this.isWebpEnabledSource.next(false);
            }
        }
    }
}
person Serj Sagan    schedule 09.05.2018

Улучшенная версия для работы с Firefox на основе Rui Marques. Я добавил сканирование различных строк на основе комментариев к этому ответу.

Если это улучшение принято сообществом, его следует отредактировать в этом ответе.

function canUseWebP()
{
    var elem = document.createElement('canvas');

    if (!!(elem.getContext && elem.getContext('2d')))
    {
        var testString = (!(window.mozInnerScreenX == null)) ? 'png' : 'webp';
        // was able or not to get WebP representation
        return elem.toDataURL('image/webp').indexOf('data:image/' + testString) == 0;
    }

    // very old browser like IE 8, canvas not supported
    return false;
}
person Jeffrey Simon    schedule 15.03.2020
comment
Попробуйте elem.toDataURL ('image / blablabla'). Это также возвращает png, так что это не решение Firefox. - person Filyus; 14.02.2021
comment
Кроме того, testString не определен. - person Amethi; 01.06.2021