Javascript를 통해 WebP에 대한 지원을 어떻게 감지 할 수 있습니까? 가능하면 브라우저 감지 대신 기능 감지를 사용하고 싶지만 방법을 찾을 수 없습니다. Modernizr ( www.modernizr.com )는 그것을 확인하지 않습니다.
답변
이것은 내 솔루션입니다-약 6ms가 걸리고 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>
답변
Google의 공식 방법 :
일부 오래된 브라우저는 webp를 부분적으로 지원하므로이 특정 기능을 사용하고 감지하려는 webp 기능을 더 구체적으로 지정하는 것이 좋습니다 . 특정 webp 기능을 감지하는 방법에 대한 Google의 공식 권장 사항 은 다음과 같습니다 .
// 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에서 제대로 작동하지 않습니다.
답변
이것은 오래된 질문이지만 Modernizr는 이제 Webp 탐지를 지원합니다.
http://modernizr.com/download/
img-webp
비 핵심 감지 항목을 찾습니다 .
답변
다음은 ES6에서 James Westgate의 답변 버전입니다.
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 : 참
크롬 : 참
나는 Rui Marques의 동기식 대답을 좋아하지만 불행히도 FF65는 WebP를 표시 할 수있는 기능이 있음에도 불구하고 여전히 false를 반환합니다.
답변
다음은 이미지를 요청하지 않아도되는 코드입니다. qwerty의 새로운 바이올린으로 업데이트되었습니다.
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';
});