【问题标题】:Adding an iframe with a custom protocol causes IE to navigate to the iframe source添加具有自定义协议的 iframe 会导致 IE 导航到 iframe 源
【发布时间】:2014-07-01 23:35:36
【问题描述】:

这个太简单了,一定有办法。

我创建了一个jsFiddle for it

代码是:

$(function(){
    $('<iframe>').attr('src', 'xyz://test').appendTo('body');
});

当 iframe 被附加时,IE 会导航到 src。我在 IE9 和 IE10 中都进行了测试。这在 Firefox、Chrome 或 Safari 中不会发生。

只有在使用自定义协议(例如 xyz:// 而不是 http://)时才会发生这种情况。

任何帮助表示赞赏。

【问题讨论】:

  • 不确定我是否理解。您的意思是在 iframe 中显示源代码,而不是调用外部应用程序来处理 URL?

标签: javascript internet-explorer iframe


【解决方案1】:

这可能有助于http://blogs.msdn.com/b/ieinternals/archive/2011/07/14/url-protocols-application-protocols-and-asynchronous-pluggable-protocols-oh-my.aspx

应用协议

与可插拔协议相比,应用程序协议要多得多 更简单。他们不是将内容返回给浏览器,而是简单地 启用浏览器(或其他程序,如文字处理器或 PDF reader) 启动程序,将请求的 URL 传递给该程序 程序。应用协议的常见示例包括 mailto:[1] news:, and onenote:protocols.

【讨论】:

  • 这确实有很大帮助,谢谢!我会将您的答案标记为已接受,然后发布第二个答案,详细说明我们最终使用的解决方案。
【解决方案2】:

接受的答案有一个指向 MSDN 文章的链接,该文章解释了 IE 的行为。简而言之,文章解释说没有办法测试未安装的自定义协议。

在大多数浏览器中,用作 iframe 源的已卸载协议将在 iframe 内静默失败。可以观察到此故障并将其视为未安装协议的指示。

然而,在 IE 中,iframe 会将父浏览器窗口重定向到失败的协议地址,即使该协议被用作 iframe src,而不是被点击的链接。

为了解决这个问题,我们必须设置一个与已安装应用程序通信的服务器端组件。

在 IE 中,我们总是显示安装说明,当他们安装软件时,服务器端组件会向浏览器发出信号,要求其设置 cookie 或本地存储值,表明软件已安装。

这适用于大多数情况,但不是全部。如果这个人卸载了软件,它仍然会失败。此外,如果他们清除了 cookie 或本地存储,那么即使软件已经安装,他们也会被要求再次安装。

【讨论】:

  • 在 Win 8、IE 10+ 中,您可以使用 msLaunchUri。引用上述文章:而是使用 msLaunchUri api 启动协议,如下所示:navigator.msLaunchUri('skype:123456', function(){alert('success');}, function(){alert('failed');} ); 如果未安装协议,将触发失败回调。否则,协议将启动并触发成功回调。
猜你喜欢
  • 2013-10-21
  • 2017-07-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 2013-02-21
相关资源
最近更新 更多