当前接受的解决方案在 Chrome for SSL https 方面存在问题。查看控制台日志,Chrome 会阻止请求,因为它认为自定义 url 协议不安全:
[blocked] The page at reports blah blah ran insecure content from customproto//blah blah
这是一个解决方案(这花了我几天时间研究):
<input type='button' value='Test Custom Url' onclick='exec()'>
<script>
function submitRequest(buttonId) {
var d = (window.parent)?window.parent.document:window.document
if (d.getElementById(buttonId) == null || d.getElementById(buttonId) == undefined) return;
if (d.getElementById(buttonId).dispatchEvent) {
var e = d.createEvent("MouseEvents");
e.initEvent("click", true, true);
d.getElementById(buttonId).dispatchEvent(e);
}
else {
d.getElementById(buttonId).click();
}
}
function exec(){
var d = (window.parent)?window.parent.document:window.document
var f = d.getElementById('customUrlLink')
if (f ) {f.parentNode.removeChild(f);}
var a = d.createElement('a');
a.href = 'mycustomproto://arg1';
a.innerHTML = "Link"
a.setAttribute('id', 'customUrlLink');
a.setAttribute("style", "display:none; ");
d.body.appendChild(a);
submitRequest("customUrlLink");
}
</script>
此代码不适用于 IE。我发现使用这种技术 IE 将自定义协议的参数限制在 1000 以下,而使用 iFrame 技术 IE 将允许 2083 个字符。
克服 javascript 中的 url 限制的唯一方法是抓取数据并多次调用。如果有人想尝试一下,请告诉我进展如何。我想用它。
要在正在执行的应用程序中处理长 url,请将令牌传递给应用程序并让它从 url GET 中获取数据。
所以现在我正在为 Chrome/FF 使用一个功能,为 IE 使用另一个功能。
这些链接帮助我开发了这个解决方案:
https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page
Simulating a click in jQuery/JavaScript on a link
(希望我几天前就知道这一点……希望这对某人有所帮助)
================================================ ===
更新:(8 小时后)
================================================ ===
Jake 发布了一个很棒的 chrome 解决方案:https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page
这仅适用于 chrome:
window.location.assign("customprotocol://");
它会在 iframe 中失败,所以这是有效的:
var w = (window.parent)?window.parent:window
w.location.assign(service + '://' + data)
================================================ ===
更新:(几周后)
================================================ ===
所有打开自定义协议的例子,包括我自己的,在 url 中都有一个“://”。这就是导致 SSL 警告的原因。
原来的解决方案是将“://”更改为“:”
这样做:
src="x-myproto:query" .....
SSL 警告将消失。
================================================ ===
关注:(经过数月的生产使用)
================================================ ===
这对 chorme 来说效果很好。检测浏览器,如果 chrome 这样做:
var w = (window.parent)?window.parent:window
w.location.assign('myproto://xyzabcdefetc')
对于 IE 和其他浏览器,我的做法略有不同。
请注意,浏览器确实对您可以在自定义 url 协议中放入多少数据施加了限制。只要您的字符串少于 800 个字符,这似乎就是适用于所有浏览器的神奇数字。