当用户单击外部程序(非WEB)的按钮时,我们将打开一个网页。问题是,当用户返回程序并打开另一个程序时,它将在同一浏览器窗口中打开,但也有一个不同的选项卡。几个小时后,我们的非科技顾客开放了30个以上的选项卡,这确实减慢了他们的计算机。
我们在外部程序中使用的语言是RPG(IBM Iseries)。我们还没有找到一种从RPG瞄准同一选项卡的方法。用户坐在一个名为5250的专用telnet会话中,服务器程序(RPG)可以在连接的PC上调用EXE。它还可以调用URL,并使用客户端的默认Web浏览器。执行此操作时,您可以指定的唯一真正参数是URL本身,因此我们认为解决方案需要完全在浏览器中。我们可以写一个exe来打电话给浏览器,但这将失败将这些浏览器迁移到Web应用程序的目的。
有没有一种方法可以使用HTML/JavaScript/php/等实现此目的?我们尝试让外部程序调用重定向脚本(JavaScript),该脚本将针对浏览器选项卡,然后关闭自身。如果浏览器对安全性不那么挑剔,这将是一个很好的解决方案。
firefox:有一个特殊的设置,您必须设置一个特殊的设置,以便JavaScript可以关闭选项卡即:直到用户选择"允许此域中的弹出窗口"之前,才打开弹出窗口。但是原始标签在用户完成此操作之前就关闭了自己。Chrome:Chrome杀死对指定标签的引用。因此,无论如何,每个新的弹出窗口都在新选项卡中打开(即使他们在调用相同的目标名称)。
我们对此非常有创造力,但没有提出一个可靠的解决方案。这是一个Intranet项目,但由于这些公司的PC数量庞大,我们希望避免在每台计算机上安装或设置内容。
简而言之,主要问题是第二个RPG打开一个新窗口,新窗口没有任何先前打开的命名选项卡。
我在这里开箱即用的思考主要是因为我不知道您的程序是如何工作的。首先,实际上无法关闭X-tab,其中x是您想要的选项卡。唯一的方法是实际在该选项卡/页面上关闭它。这是PHP,HTML,JS等。我认为您可以使用一些C /C#或"客户端"而不是浏览器上运行的任何内容来实现它。
现在,开箱即用的解决方案是进行一些会话管理和AJAX调用。我的建议是在新标签上创建一个新会话。用户获得了一个新的选项卡,您将其提供数字1。您对脚本进行AJAX调用的每个X秒,这只会检查它是什么"选项卡"。让我举个例子。
用户打开一个新选项卡,启动会话,您的数组具有以下内容:
$_SESSION['tabs'][1] = 'set';
现在,此选项卡一直在打电话给文件,以查看是否应该保持"活着"。基本上,您发布了"嗨,我是Tab 1"。当您检查会话时,TAB 1应该是其中唯一的。
在新选项卡上,"会话"选项卡将获得另一个值,称为" 2",该值已设置。现在,当Tab 1向Ajax呼叫者帖子时,它应该给它回馈可以关闭的消息。收到该消息时,应该调用一些JS,例如:
javascript:window.open('','_self').close();
这只是大声思考,我想基本的想法应该起作用,这是我从未测试过的,也不能给您一个完整的代码示例。也许当我有一些业余时间时,我可以尝试创建这个。
如果在目标中命名一个不存在的帧,它将在新选项卡中打开。使用相同的框架名称,它将继续使用该选项卡。
您是否考虑过创建一个从RPG Rogram调用以处理浏览器请求的快速交接应用程序?这将允许您指定在提出新请求以及发送特定参数以进行自定义时使用相同的选项卡。请参阅karl anderson ==>重复使用vb.net中的浏览器/tab
中的响应。下面类似的代码:
Private Sub ToUrl(ByVal url As String, ByVal strDocType As String, ByVal strSSN As String)
Dim IE As SHDocVw.InternetExplorer
IE = GetTopmostInstanceOfCustomApp() ' Get the topmost instance of custom app (will return new instance if not running)
If Not IE Is Nothing Then
Dim Header As String = "Content-Type: application/x-www-form-urlencoded" & Chr(10) & Chr(13)
SetForegroundWindow(IE.HWND)
url = url & strCustomParameter
IE.Navigate2(url, , , , Header)
End If
End Sub