如何通过 Javascript 检测对 WebP 的支持?如果可能,我想使用功能检测而不是浏览器检测,但我找不到这样做的方法。Modernizr ( www.modernizr.com ) 不检查它。
检测 WebP 支持
IT技术
javascript
html
image
webp
                    2021-02-04 20:51:11
                
                    
                
            
        6个回答
            这是我的解决方案 - 大约需要 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;
 }
}
我认为这样的事情可能会奏效:
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 ...
});
更高级的检查器: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");
});
首选解决方案 HTML5
<picture>
  <source srcset="/path/to/image.webp" type="image/webp">
  <img src="/path/to/image.jpg" alt="insert alt text here">
</picture>
谷歌官方方式:
由于一些旧浏览器对 webp 部分支持,因此最好更具体地说明您尝试使用的 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