我已经创建了一个 ASP.Net 应用程序页面来处理打开 FileSite链接。有一个自定义协议(protocol)可以正确处理链接,即它可以打开文件,但是在启动文件时给我留下一个空的浏览器页面。
我正在处理 3 个场景
- 直接链接到处理页面将启动文件并关闭浏览器
- 来自 Intranet 上另一个页面的链接将启动处理页面,打开文件并返回到原始页面
- 来自 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?
如果有任何关于如何在没有附加对话框的情况下打开协议(protocol)以启动应用程序的建议,我们将不胜感激
最佳答案
执行此操作最简单、最可靠的方法也是最烦人的实现方法。不幸的是,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 之外,您可能别无选择。
关于javascript - 打开自定义协议(protocol)后关闭浏览器窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17545430/