Unc*_*MiF 24 ajax macos google-chrome
我有协议(如http)与在Mac OS XIe中注册的第三方应用程序管理的方案,x-someapp:// someaction或类似的东西.
如何使用Google Chrome打开此网址?默认情况下,Chrome会开始在Google引擎中搜索,而不是启动App并将URL处理传递给它...
Safari推出了一些注册的App.这是对的.
Firefox和Opera询问该怎么做......我也可以启动App.
但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(){})
Run Code Online (Sandbox Code Playgroud)
没有结果......
Bri*_*ity 25
当前接受的解决方案存在Chrome for SSL https问题.观看控制台日志,Chrome会阻止请求,因为它认为自定义网址协议不安全:
[blocked] The page at reports blah blah ran insecure content from customproto//blah blah
Run Code Online (Sandbox Code Playgroud)
这是一个解决方案(这花了我几天研究):
<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>
Run Code Online (Sandbox Code Playgroud)
此代码不适用于IE.我发现使用这种技术IE将自定义协议的参数限制为小于1000,因为使用iFrame技术IE将允许2083个字符.
克服javascript中url限制的唯一方法是清除数据并多次调用.如果有人想要捅这个,请告诉我它是怎么回事.我想用它.
要在执行的应用程序中处理长网址,请将一个标记传递到应用程序并让它从网址GET获取数据.
所以现在我正在使用Chrome/FF的一个功能和IE的另一个功能.
这些链接帮我开发了这个解决方案:
https://superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page
(希望我前几天知道这件事......希望这有助于某人)
==================================================
杰克为Chrome发布了一个很好的解决方案:https: //superuser.com/questions/655405/custom-protocol-handler-not-working-in-chrome-on-ssl-page
这仅适用于chrome:
window.location.assign("customprotocol://");
Run Code Online (Sandbox Code Playgroud)
它会在iframe中失败,所以这是有效的:
var w = (window.parent)?window.parent:window
w.location.assign(service + '://' + data)
Run Code Online (Sandbox Code Playgroud)
==================================================
打开自定义协议的所有示例(包括我自己的协议)在url中都有一个"://".这就是导致SSL警告的原因.
原来解决方案是将"://"更改为":"
这样做:
src="x-myproto:query" .....
Run Code Online (Sandbox Code Playgroud)
并且SSL警告将消失.
==================================================
这对于chorme来说效果很好.检测浏览器以及chrome是否执行此操作:
var w = (window.parent)?window.parent:window
w.location.assign('myproto://xyzabcdefetc')
Run Code Online (Sandbox Code Playgroud)
对于IE和其他浏览器,我做的事略有不同.
请注意,浏览器会对您可以在自定义URL协议中放入多少数据施加限制.只要您的字符串不超过800个字符,这似乎是适用于所有浏览器的神奇数字.
小智 8
它看起来像谷歌的位置栏解析正在阻碍它.
但是,浏览器似乎确实正确处理了自定义URL方案.在您的位置栏中尝试此操作:
javascript:document.location = 'myscheme://whatever'
Run Code Online (Sandbox Code Playgroud)
您页面上使用自定义方案的任何链接也应该做正确的事情.
我找到了适用于 Chrome 的解决方案。我用的是IFRAME方式。
示例(使用 JQuery):
$("body").append('<span id="__protoProxy"></span>');
function queryWord(aWord)
{
var protoProxy = document.getElementById('__protoProxy');
if (protoProxy)
{
var word = aWord.replace('"','\"');
protoProxy.innerHTML = '<div style="display:none;"><iframe src="x-myproto://query?' + word + '"></iframe></div>';
}
}
queryWord('hello');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34879 次 |
| 最近记录: |