Ich denke so etwas könnte funktionieren:
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';
})();
In Firefox und IE wird der "Onload" -Handler überhaupt nicht aufgerufen, wenn das Bild nicht verstanden werden kann, und stattdessen wird der "Onerror" aufgerufen.
Sie haben jQuery nicht erwähnt, aber als Beispiel für den Umgang mit der Asynchronität dieser Prüfung können Sie ein jQuery-Objekt "Zurückgestellt" zurückgeben:
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();
}
Dann könnten Sie schreiben:
hasWebP().then(function() {
}, function() {
});
Hier ist ein jsfiddle-Beispiel.
Ein erweiterter Prüfer: http://jsfiddle.net/JMzj2/29/ . Dieser lädt Bilder von einer Daten-URL und prüft, ob sie erfolgreich geladen wurden. Da WebP jetzt auch verlustfreie Bilder unterstützt, können Sie überprüfen, ob der aktuelle Browser nur verlustbehaftetes WebP oder auch verlustfreies WebP unterstützt. (Hinweis: Dies überprüft implizit auch die Unterstützung von Daten-URLs.)
var hasWebP = (function() {
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() {
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");
});