我已成功创建并注册了自定义协议处理程序,该处理程序在所有浏览器中均能正常运行。初始警告对话框显示有关启动外部应用程序的信息,这没有问题。
但是,当应用程序部署并且网站在 SSL 下运行时,自定义协议链接在 Chrome 中不再起作用。我看到开发人员工具控制台中出现以下消息:
[已屏蔽] 页面位于https://my.site.com/path/to/page 从 iwd:-action=myaction 运行不安全的内容
相同的链接在 Internet Explorer 和 Firefox 中运行良好。
关于如何实现这一点,您有什么想法吗?顺便说一下,我的外部应用程序是安装在客户端上的控制台应用程序。
编辑:一个额外的重要信息是,该链接指定的目标是同一页面上的隐藏 iframe。
答案1
解决方案是不为 Chrome 用户指定目标框架。看来 Chrome 正在查看从主页传递到嵌入式 iframe 的 URL,并发现嵌入式 iframe URL 不安全,因此拒绝它。
我认为 Chrome 并不总是这样表现,但在 v30+ 中,解决方案似乎是在链接中指定一个空目标。
编辑-扩展解决方案
这是我用来清理链接的目标属性的 JavaScript(仅适用于 Chrome 用户) - 否则,简单的解决方案是首先不在 HTML 中指定目标属性。
// Get a list of all the links with external commands
var commandButtons = $("a[target='my_command']");
updateCommandButtonTargetsForChrome();
// Remove target attribute for Chrome only users
function updateCommandButtonTargetsForChrome() {
var browserInfo = getBrowserInfo();
if (browserInfo[0] == "Chrome")
commandButtons.attr("target", "");
}
function getBrowserInfo() {
var n = navigator.appName, ua = navigator.userAgent, tem;
var m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
if (m && (tem = ua.match(/version\/([\.\d]+)/i)) != null) m[2] = tem[1];
m = m ? [m[1], m[2]] : [n, navigator.appVersion, '-?'];
return m;
}
答案2
由于看起来该线程中的所有答案都已在执行特定于 Chrome 的操作,因此有一种更简单的方法可以通过协议处理程序打开仅适用于 Chrome 的应用程序。
只需调用window.location.assign("customprotocol://");
。对于用户而言,这将与以前的 IFRAME 方法完全相同。如果用户未安装协议处理程序,则不会发生任何事情。如果安装了协议处理程序,它将打开应用程序。
这只在 Chrome 中有效,因为如果用户的机器上没有安装协议处理程序,Firefox 和 IE 会将用户重定向到“无法加载”页面。
答案3
看起来整个问题都是 URL 的写法问题。
创建不带“//”的 URL:
customproto:xyzabcdef
代替:
customproto://xyzabcdef
答案4
谢谢你找到这个,使用同样的原理,我把它变成了一个动态函数调用,这里是代码:
<input type='button' value='Test Custom Url' onclick='exec()'>
<script>
function submitRequest(buttonId) {
if (document.getElementById(buttonId) == null || document.getElementById(buttonId) == undefined) return;
if (document.getElementById(buttonId).dispatchEvent) {
var e = document.createEvent("MouseEvents");
e.initEvent("click", true, true);
document.getElementById(buttonId).dispatchEvent(e);
}
else {
document.getElementById(buttonId).click();
}
}
function exec(){
var f = document.getElementById('customUrlLink')
if (f ) {f.parentNode.removeChild(f);}
var a = document.createElement('a');
a.href = 'mycustomproto://arg1';
a.innerHTML = "Link"
a.setAttribute('id', 'customUrlLink');
a.setAttribute("style", "display:none; ");
document.body.appendChild(a);
submitRequest("customUrlLink");
}
</script>
有一点,此代码不会在 iframe 中运行。因此,iframe 可以在父级中调用此代码,或者可以在父级中创建链接对象。
此外,IE 仅允许使用此方法<1000(我不知道具体数字)个字符。