Je pense que quelque chose comme ça pourrait marcher :
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';
})();
Dans Firefox et IE, le gestionnaire "onload" n'est pas appelé du tout si l'image ne peut pas être comprise, et le gestionnaire "onerror" est appelé à la place.
Vous n'avez pas mentionné jQuery, mais à titre d'exemple pour gérer la nature asynchrone de cette vérification, vous pourriez renvoyer un objet 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();
}
Alors vous pourriez écrire :
hasWebP().then(function() {
// ... code to take advantage of WebP ...
}, function() {
// ... code to deal with the lack of WebP ...
});
Voici un exemple de jsfiddle.
Un vérificateur plus avancé : http://jsfiddle.net/JMzj2/29/ . Celui-ci charge les images à partir d'une URL de données et vérifie si le chargement est réussi. Étant donné que WebP prend également en charge les images sans perte, vous pouvez vérifier si le navigateur actuel prend en charge uniquement WebP avec perte ou également WebP sans perte. (Remarque : cette vérification porte aussi implicitement sur la prise en charge des URL de données).
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");
});
2 votes
Si vous chargez une telle image dans un élément Image, et que vous vérifiez ensuite la largeur et la hauteur dans un navigateur qui n'a pas supporte le format, est-ce que vous obtenez quelque chose ?
0 votes
(Je voulais dire "Image objet ", pas élément ; comme, "nouvelle Image()" ... )
0 votes
Ça a l'air bien. Je peux obtenir un "Je supporte WebP" de cette façon, mais je ne peux pas obtenir un "Je ne supporte pas WebP".
4 votes
J'ai posté une question similaire : Quelle est la recommandation "officielle" de Google pour détecter la prise en charge de WebP par les navigateurs ? sur le groupe Google WebP.
0 votes
C'est mieux : queryj.wordpress.com/2012/06/11/detecting-webp-support
0 votes
@Mike Il y a un officiel Note de développement Google pour ça maintenant.
0 votes
Si vous souhaitez que Firefox implémente le WebP natif, vous pouvez votez pour ce problème dans leur suivi de bogues .
0 votes
Ces réponses sont complètement folles. C'est le web moderne, non ? !
3 votes
@Simon_Weaver la question et les commentaires datent tous de plusieurs années. Les anciennes questions sont rarement "maintenues" de manière significative ; vous êtes cependant toujours libre d'ajouter une nouvelle réponse.
0 votes
Je ne sais pas si c'est nouveau, mais les modernisateurs le vérifient.
now
: modernizr.com/download?webp-setclasses&q=webp