gpt4 book ai didi

javascript - 如何检查自定义协议(protocol)是否受支持

转载 作者:IT王子 更新时间:2023-10-29 02:58:26 26 4
gpt4 key购买 nike

我们正在使用注册自己协议(protocol)的软件。我们可以通过如下链接从浏览器运行应用程序:

customprotocol://do_this.

但是有没有办法检查用户系统是否支持这种自定义协议(protocol)?如果没有,我们希望用户先安装软件。

例如:

if (canHandle ('customprotocol')) {
// run software
}
else {
// ask to install
}

编辑我知道 protocolLong 属性,但它仅适用于 IE。

最佳答案

不幸的是,没有简单的方法可以实现这一点。当然没有预先确定协议(protocol)处理程序是否已安装的方法。

Internet Explorer,如您所述,具有 protocolLong 属性,但我无法让它为所有自定义协议(protocol)处理程序返回除“未知协议(protocol)”以外的任何内容-- 如果有人知道如何让 IE 返回正确的值,请告诉我,以便我更新此部分。我在 IE 中找到的最佳解决方案是 append to the user agent string或在您的应用程序中安装浏览器扩展程序,以公开 Javascript 可访问属性。

Firefox 是迄今为止最简单的主要浏览器,因为它允许您尝试并捕获失败的导航尝试。返回的错误对象包含一个 name 属性,其值为 NS_ERROR_UNKNOWN_PROTOCOL:

try {
iframe.contentWindow.location.href = "randomprotocolstring://test/";
} catch(e) {
if (e.name == "NS_ERROR_UNKNOWN_PROTOCOL")
window.location = "/download/";
}

Firefox 会弹出自己的警告框:

Firefox doesn't know how to open this address, because the protocol (randomprotocolstring) isn't associated with any program.

一旦您关闭此框,catch block 将执行并且您有一个工作回退。

其次是 Opera,它允许您使用可预测性法则来检测点击的自定义协议(protocol)链接是否成功。如果自定义协议(protocol)点击有效,该页面将保持在同一位置。如果没有安装处理程序,Opera 将导航到错误页面。这使得使用 iframe 检测起来相当容易:

   iframe.contentWindow.location = "randomprotocolstring://test/";
window.setTimeout(function () {
try {
alert(ifr.contentWindow.location);
} catch (e) { window.location = "/download/"; }
}, 0);

此处的setTimeout 是为了确保我们在 导航之后检查位置。请务必注意,如果您尝试访问该页面,Opera 会抛出 ReferenceException(跨域安全错误)。这无关紧要,因为我们只需要知道位置从 about:blank 发生了变化,因此 try...catch 可以正常工作。

Chrome 在这方面的表现很糟糕。如果自定义协议(protocol)处理程序失败,它会完全压缩。如果处理程序有效……你猜对了……它绝对有效。恐怕无法区分两者。

我还没有测试过 Safari,但我担心它会与 Chrome 一样。

欢迎您试用 test code I wrote在对此进行调查时(我自己对此有既得利益)。它与 Opera 和 Firefox 交叉兼容,但目前在 IE 和 Chrome 中没有任何作用。

关于javascript - 如何检查自定义协议(protocol)是否受支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2872090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com