【问题标题】:Close browser window after opening Custom Protocol打开自定义协议后关闭浏览器窗口
【发布时间】:2013-07-06 21:28:21
【问题描述】:

我创建了一个 ASP.Net 应用程序页面来处理打开 FileSite 链接。有一个自定义协议可以正确处理链接,即它打开文件,但是当文件启动时它给我留下一个空的浏览器页面。

我正在处理 3 个场景

  1. 直接指向处理页面的链接将启动文件并关闭浏览器
  2. 来自内网其他页面的链接将启动处理页面,打开文件并返回原始页面
  3. Intranet 对话框中的链接打开处理页面,启动文件,然后关闭处理页面

我的代码如下(Codebehind 是设置 FileUrl 并选择调用两者中的哪个函数)

<script type="text/javascript" language="javascript">

    // Files opened directly from link
    function OpenFileSiteLink() {
        window.location.href = '<%= FileUrl %>';
    }

    // Files opened from within Intranet
    function OpenFileSiteLinkReferrer(referrer, dialogOpened) {

        window.open('<%= FileUrl %>');

        if (dialogOpened) {
            window.open('close.html', '_self');
        } else {
            window.location.href = referrer;
        }
    }

</script>

close.html文件中的代码只有以下内容

 <script type="text/javascript"> window.close();</script>

这取自How can I close a browser window without receiving the "Do you want to close this window" prompt?

任何关于如何打开协议以启动应用程序而无需额外对话框的建议将不胜感激

【问题讨论】:

    标签: javascript html asp.net


    【解决方案1】:

    实现这一点的最简单和最可靠的方法是最烦人的。不幸的是,IE 9/10 和 Firefox 已经堵塞了完成此任务的常规方法,因此您可能别无选择。

    策略是从父窗口弹出窗口,而不是直接打开它。您将需要创建一个函数以在弹出窗口中加载适当的 url,然后将其应用于链接到处理程序 url 的每个链接的 onclick。然后,将此脚本包含在您网站的每个页面上。我还假设每个文件 url 都是唯一的,但具有某种通用的基本 url。如果不是这种情况,您还需要设置一个标识类或属性。进行替换的功能类似于:

    var replaceHandlerLinks = function () {
        var fileLinks = document.querySelectorAll("[href*='/beginning/to/file/path']");
        for (var i = 0; i < fileLinks.length; i++) {
            fileLinks[i].onclick = function () {
                var fileOpener = window.open(fileLinks[i].href);
                //depending on how long your file takes to load, you may need to wait here
                fileOpener.close();
            }
        }
    }
    

    这样做的明显缺点是任何指向这些文件的链接都需要来自您控制的页面。此外,请注意,我使用 document.querySelectorAll 来定位链接 href 元素。这意味着按钮等将不适用于此特定功能。通过 JQuery 使用更兼容浏览器/更强大的查询或在所有必需的按钮、链接等上设置一个类将使这成为一种更完整的方法。

    如果您需要从不受控制的页面链接,另一种类似的方法是始终使用参数从任何地方链接到同一页面,例如“/openfile.aspx?file=actualFilePath”,然后从该页面打开一个弹出窗口以加载文件,观看新窗口并在文件完成后关闭它。然后,尝试根据场景重定向当前窗口:1)转到主页/登陆/等 2)转到引荐来源网址 3)如果可能,转到内网登陆/引荐来源网址。这不像从内部关闭弹出窗口那样优雅,但它解决了丑陋的空白窗口。

    这两种方法都不是完美的,但除了将用户限制为 ie8- 和 chrome 之外,您可能没有其他选择。

    【讨论】:

      【解决方案2】:

      如果您尝试导航到 &lt;iframe&gt; 而不是新窗口会怎样?

      尝试将新的&lt;iframe&gt; 添加到 DOM,导航到您的自定义 url,然后从 DOM 中删除 &lt;iframe&gt;。不必费心加载 close.html 页面。

      (免责声明:老实说,这只是一个想法,我没有尝试过)

      【讨论】:

      • 感谢您的提示,我会检查并回帖
      【解决方案3】:

      iframe 解决方案适合我:

              var divgfa = document.getElementById('gfa');
              var iframe = document.createElement("iframe");
              iframe.src = "ticket://<?= $print ?>";
              iframe.name = "frame"
              divgfa.appendChild(iframe);
      

      【讨论】:

        猜你喜欢
        • 2016-03-06
        • 1970-01-01
        • 1970-01-01
        • 2011-10-06
        • 2019-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多