检查是否支持URL()

时间:2017-03-09 15:48:17

标签: javascript

如何检查当前浏览器是否支持类URL()? 基于文档,它在IE中不受支持

我想用它从字符串中获取一个域:

var text = ...
var domain = new URL(text).host;

3 个答案:

答案 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;
}