打开自定义协议后关闭浏览器窗口

Phi*_*ffy 5 html javascript asp.net

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

我有3个我正在使用的场景

  1. 直接链接到处理页面将启动该文件并关闭浏览器
  2. 来自Intranet上其他页面的链接将启动处理页面,打开文件并返回到原始页面
  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>
Run Code Online (Sandbox Code Playgroud)

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

 <script type="text/javascript"> window.close();</script>
Run Code Online (Sandbox Code Playgroud)

这取自如何关闭浏览器窗口而不接收"是否要关闭此窗口"提示?

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

Max*_*rty 5

实现这一目标的最不实用和最可靠的方法是最烦人的实现.不幸的是,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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

明显的缺点是,这些文件的任何链接都需要来自您控制的页面.另外,请注意我使用document.querySelectorAll来定位链接href元素.这意味着按钮等不适用于此特定功能.使用更多浏览器兼容/健壮的查询与JQuery或在所有必需的按钮,链接等上设置类将使这更完整的方法.

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

这两种方法都不是完美的,但除了限制用户使用ie8-和chrome之外,你可能没有任何其他选择.