Javascript 启动应用程序(如果已安装)或重定向至下载
在每个repo上,GitHub都有一个标记为“Clone in Desktop”(示例:)的按钮。如果已安装GitHub for Mac,则Javascript 启动应用程序(如果已安装)或重定向至下载,javascript,macos,github,href,url-scheme,Javascript,Macos,Github,Href,Url Scheme,在每个repo上,GitHub都有一个标记为“Clone in Desktop”(示例:)的按钮。如果已安装GitHub for Mac,则href类似于: github-mac://openRepo/https://github.com/github/developer.github.com 这将打开GitHub for Mac并提供克隆回购协议的功能。如果没有,则href为: http://mac.github.io` 这是GitHub for Mac的下载页面。我想在我的网站上做一些类
href
类似于:
github-mac://openRepo/https://github.com/github/developer.github.com
这将打开GitHub for Mac并提供克隆回购协议的功能。如果没有,则href
为:
http://mac.github.io`
这是GitHub for Mac的下载页面。我想在我的网站上做一些类似的事情:如果安装了,打开我的应用程序,如果没有,重定向到下载。如何才能最好地实现这一点?这可以通过Javascript或PHP实现 对于Javascript,有一个很酷的库is.js,可用于环境检查。请看这里: 您只需在HTML中创建一个div,然后根据诸如:is_windows()或!是(windows) 您也可以使用PHP。为此,您可以使用此问题第一个答案中的代码:
现在,基于getOS()和/或getBrowser函数的返回,您可以向用户呈现不同的内容。。。这是一个简单的if-else块代码:)
享受吧 GitHub是如何做到的?
客户端包括一个名为的本地服务,该服务在后台运行。GitHub页面通过URLhttps://ghconduit.com:25035/status
摘自:
例如,导管位于存储库页面上的Clone in Desktop
按钮和文件页面上的Open
按钮的后面。导管侦听来自浏览器的有关GitHub的Mac操作的查询。要了解这一点,请访问。它应该是这样的:
如果您运行了GitHub管道服务,页面上的JavaScript将从该URL获取数据,并为“桌面克隆”按钮提供一个GitHub mac://
URL。否则,URL将返回404响应,并假设您没有安装GitHub for Mac,并提供下载链接
如何实现这样的功能? 不幸的是,在浏览器中没有JavaScript API来执行此操作。浏览器无法识别的协议由操作系统本身处理。我尽了最大努力,但我只能为Mac上的Firefox开发出一个体面的JavaScript专用解决方案,为Safari开发出一个丑陋的半生不熟的解决方案。这两种黑客都依赖于未定义的行为,并且都不适用于Chrome。你可以在下面看到我的研究代码 如果你想用GitHub的方式来做,你必须创建一个本地HTTP服务器,它作为一个服务在你的用户机器上的一个已知端口上运行。然后,您可以使用JavaScript连接到它并检索有关已安装应用程序的信息。这样做并不是一件小事,除非它提供了一些惊人的功能,否则我建议不要这样做 不过,实现这一点的JavaScript代码相当简单。假设您返回适当的CORS头,您只需发出一个简单的AJAX请求。下面是一个基于jQuery的示例
$.ajax({
url: 'http://127.0.0.1:1337',
dataType: 'json',
success: function(jqXHR) {
//Replace links to app protocol URLs.
}
});
研究代码: 下面的代码是我为Firefox和Safari编写的超级黑客且相当脆弱的代码。虽然它在我这方面发挥作用,但我绝对不能保证它会如预期的那样发挥作用,或者在未来继续发挥作用。它依赖于特定于浏览器的未定义行为,应该被认为是不稳定的。我也不知道这段代码在非OSX系统上会做什么 火狐: 此代码依赖于在iframe中打开链接,当无法识别协议时,该链接将触发错误(成功后,它将正常打开URL) 用法示例:
游猎: 此代码依赖于在新选项卡中打开URL,如果无法识别URL,则该选项卡的
win.location.href
将在未定义的之前的一秒钟内(但时间可能更短)。如果未能打开协议,则“没有用于打开URL的应用程序集”对话框仍将打开
function openAppSafari(url, failure) {
var win = window.open(url);
var done = function(failed) {
win.close();
clearInterval(checkFail);
clearTimeout(giveup);
if (failed) {
failure();
}
};
//Chck for failure.
var checkFail = setInterval(function() {
//In Safari, location.href becomes undefined on failure.
if (!win.location.href) {
done(true);
}
});
//After a second, assume success.
var giveup = setTimeout(function() {
done(false);
}, 1000);
}
用法示例:
我真的不认为这是OP想要的。他问的是如何检测浏览器是否会打开特定于应用程序的协议,如github mac://
,而不是浏览器正在查看的协议。可能重复@atastrumf,这是类似的,但我相信它不是重复的。这似乎是答案。如果您为这个和/或您的Firefox代码提供JavaScriptGithub使用,即使只是为了学习,我也会非常感激。谢谢大家!@当然!GitHub的代码没有什么特别之处,但我添加了一个基本示例。我还添加了我的Firefox和Safari研究代码。
$.ajax({
url: 'http://127.0.0.1:1337',
dataType: 'json',
success: function(jqXHR) {
//Replace links to app protocol URLs.
}
});
function openAppFirefox(url, failure) {
var iframe = document.createElement('iframe');
//Firefox will fire an error if protocol fails to open.
iframe.onerror = function() {
failure();
};
//Hide the iframe.
iframe.style.width = 0;
iframe.style.height = 0;
iframe.style.visibility = "hidden";
iframe.style.position = "fixed";
//Load the URL.
iframe.src = url;
document.body.appendChild(iframe);
//Clean up the iframe.
setTimeout(function() {
document.body.removeChild(iframe);
}, 1000);
}
//Will work.
//var url = 'itmss://itunes.apple.com/us/app/stack-exchange/id871299723';
//Will fail.
var url = 'wat://bummer';
someElment.addEventListener('click', function() {
openAppFirefox(url, function() {
alert('Download my app!');
});
});
function openAppSafari(url, failure) {
var win = window.open(url);
var done = function(failed) {
win.close();
clearInterval(checkFail);
clearTimeout(giveup);
if (failed) {
failure();
}
};
//Chck for failure.
var checkFail = setInterval(function() {
//In Safari, location.href becomes undefined on failure.
if (!win.location.href) {
done(true);
}
});
//After a second, assume success.
var giveup = setTimeout(function() {
done(false);
}, 1000);
}
//Will work.
//var url = 'itmss://itunes.apple.com/us/app/stack-exchange/id871299723';
//Will fail.
var url = 'wat://bummer';
someElment.addEventListener('click', function() {
openAppSafari(url, function() {
alert('Download my app!');
});
});