答案 0 :(得分:3)
您可以使用
进行功能检查if ("URL" in window)
但是,这不会验证功能是否正确。你可能想考虑添加一个polyfill。
请注意,IE / Edge似乎真的将内置构造函数作为对象,这意味着typeof Ctor === "object"
在这些浏览器中是true
。因此,如果他们在Edge中为其添加支持,则"function"
的检查将无效。
答案 1 :(得分:2)
完全可靠,您无法做到这一点。如果URL
存在并且是一个函数,您可以接近测试:
if (typeof URL !== "function") {
// It is not supported
}
然后你可以进行进一步的测试,看看它看起来像鸭子一样:
function URL_is_supported() {
if (typeof URL !== "function") {
return false;
}
// Beware: You're calling the function here, so it it isn't the expected URL function it might have undesired side effects
var url = new URL("http://example.com");
if (url.hostname !== "example.com") {
return false;
}
// and whatever other tests you wanted to do before you're convinced
return true;
}
答案 2 :(得分:0)
检查根级别(窗口)是否支持任何内容只是尝试在条件级别访问它。 E.G。
(window.URL) OR JUST (typeof URL === "function")
var a = window.URL ? window.URL(text).host : ....
还要记住,窗口的事实有一个" URL"财产并不意味着它是一个类/功能,它是你所期望的 因此,最好的方法是使用至少保证它是函数
的typeof版本进行检查最接近检查URL是否真正受支持的是检查其原型和静态函数
function isURLSupported(){
if(typeof window.URL!=="function" || typeof URL.createObjectURL !== "function" || typeof URL.revokeObjectURL !== "function"){
return false;
}
var oURLprototype= ["host","hostname","href","origin","password","pathname","port","protocol","search","searchParams","username"];
for(var i=0;i<oURLprototype.length;i++){
if(URL.prototype.hasOwnProperty(oURLprototype[i])===undefined){
return false;
}
}
return true;
}
对于那些支持类为Object而不是Function类的实现的人 - 功能归功于https://stackoverflow.com/a/7356528/835753
function isFunction(functionToCheck) {
var getType = {};
return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]';
}
function isURLSupported(){
if(!isFunction(window.URL) || !isFunction(URL.createObjectURL) || !isFunction(URL.revokeObjectURL)){
return false;
}
var oURLprototype= ["host","hostname","href","origin","password","pathname","port","protocol","search","searchParams","username"];
for(var i=0;i<oURLprototype.length;i++){
if(URL.prototype.hasOwnProperty(oURLprototype[i])===undefined){
return false;
}
}
return true;
}