我创建了一个ASP.Net应用程序页面来处理打开FileSite链接。有一个自定义协议正确处理链接,即打开文件,但是当文件启动时,它会留下一个空的浏览器页面。
我有3个与我合作的场景
我的代码如下(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?
任何建议如何在没有额外对话框的情况下打开协议来启动应用程序将不胜感激
答案 0 :(得分: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();
}
}
}
明显的缺点是,这些文件的任何链接都需要来自您控制的页面。另外,请注意我使用document.querySelectorAll来定位链接href元素。这意味着按钮等不适用于此特定功能。使用与JQuery更兼容浏览器/健壮的查询或在所有必需的按钮,链接等上设置类将使这更加完整。
另一种类似的方法,如果你需要从你不控制的页面链接,将始终使用参数从任何地方链接到同一页面,例如“/openfile.aspx?file=actualFilePath”,然后从该页面打开弹出窗口加载文件,观察新窗口并在文件完成时关闭它。然后,尝试根据场景重定向当前窗口:1)转到主页/登陆/等2)转到引荐者3)如果可能的话,转到内部网登陆/引荐者。这并不像从内部关闭弹出窗口那样优雅,但它解决了丑陋的空白窗口。
这两种方法都不是完美的,但除了将用户限制为ie8-和chrome之外,您可能没有任何其他选择。
答案 1 :(得分:2)
如果您尝试导航到<iframe>
而不是新窗口怎么办?
尝试向DOM添加新的<iframe>
,导航到您的自定义网址,然后从DOM中删除<iframe>
。不要费心加载close.html页面。
(免责声明:说实话,这只是一个想法,我没有尝试过)
答案 2 :(得分:0)
iframe解决方案适用于我:
var divgfa = document.getElementById('gfa');
var iframe = document.createElement("iframe");
iframe.src = "ticket://<?= $print ?>";
iframe.name = "frame"
divgfa.appendChild(iframe);