gpt4 book ai didi

ajax - 是否可以使用 Google Chrome 打开自定义 URL 方案?

转载 作者:行者123 更新时间:2023-12-01 23:10:32 25 4
gpt4 key购买 nike

我有协议(protocol)(如http),其方案由在Mac OS X中注册的第3方应用程序管理。即 x-someapp://someaction 或类似的东西。

如何使用 Google Chrome 打开此网址?默认情况下,Chrome 开始在 Google 引擎中搜索,而不是启动应用程序并将 URL 处理传递给它...

Safari 启动了一些已注册的应用程序。这是正确的事情。

Firefox 和 Opera 询问要做什么...我也可以启动应用程序。

但是 Chrome...不会询问。

我什至尝试编写一些包含 JavaScript 的 HTML 页面来发送 XHttpRequest:

function _httpExecuteCallback()
{
if (httpRequestCallbackFunction != null) {
if (httpRequest.readyState == 4) {
if (httpRequest.status == 200) {
httpRequestCallbackFunction();
httpRequestCallbackFunction = null;
}
}
}
}

function _httpGet(url, callbackFunction)
{
httpRequest = false;
httpRequestCallbackFunction = callbackFunction;
httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = _httpExecuteCallback;
httpRequest.open('GET', url, true);
httpRequest.send(null);
}


_httpGet('x-someapp://test',function(){})

也没有结果...

最佳答案

当前接受的解决方案对于 Chrome 的 SSL https 存在问题。查看控制台日志,Chrome 会阻止该请求,因为它认为自定义 url 协议(protocol)不安全:

[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 将自定义协议(protocol)的参数限制为少于 1000 个,而使用 iFrame 技术 IE 将允许 2083 个字符。

克服 javascript 中 url 限制的唯一方法是丢弃数据并多次调用。如果有人想尝试一下,请告诉我进展如何。我想使用它。

要在执行应用程序中处理长 url,请将 token 传递到应用程序并让它从 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)

================================================== ===

更新:(几周后)

================================================== ===

所有打开自定义协议(protocol)的示例(包括我自己的协议(protocol))的 URL 中都有一个“://”。这就是导致 SSL 警告的原因。

事实证明,解决方案是将“://”更改为“:”

所以这样做:

src="x-myproto:query"  .....

SSL 警告将会消失。

================================================== ===

遵循:(生产使用几个月后)

================================================== ===

这对于 Chorme 来说效果很好。检测浏览器以及 chrome 是否执行此操作:

var w = (window.parent)?window.parent:window
w.location.assign('myproto://xyzabcdefetc')

对于 IE 和其他浏览器,我做的事情略有不同。

请注意,浏览器确实对可以放入自定义 URL 协议(protocol)中的数据量施加了限制。只要您的字符串少于 800 个字符,这似乎就是适用于所有浏览器的神奇数字。

关于ajax - 是否可以使用 Google Chrome 打开自定义 URL 方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2330545/

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