从外部程序定位相同的浏览器选项卡

时间:2014-03-06 17:20:45

标签: javascript php jquery ibm-midrange

当用户点击外部程序(非网络)中的按钮时,我们正在打开网页。问题是,当用户返回程序并打开另一个程序时,它会在同一浏览器窗口中打开,但会打开另一个选项卡。几个小时之后,我们的非技术精明的客户打开了30多个标签,这真的会减慢他们的电脑速度。

我们在外部程序中使用的语言是RPG(IBM iSeries)。我们还没有找到一种方法来从RPG中定位相同的标签。用户正坐在名为5250的专用telnet会话中,其中服务器程序(RPG)可以在连接的PC上调用exe。它也可以调用URL,并使用客户端的默认Web浏览器。执行此操作时,您可以指定的唯一真实参数是URL本身,因此我们认为解决方案需要完全在浏览器中。我们可以编写一个exe来调用浏览器,但这会破坏将这些迁移到Web应用程序的目的。

有没有办法用HTML / JavaScript / PHP /等实现这个目标?我们已经尝试让外部程序调用一个重定向脚本(JavaScript),该脚本将以浏览器选项卡为目标,然后自行关闭。如果浏览器不那么挑剔安全性,这将是一个很好的解决方案。

Firefox:您必须设置一个特殊设置,以便JavaScript可以关闭该标签 IE:在用户从此域中选择“允许弹出窗口”之前,不会打开弹出窗口。但是在用户执行此操作之前,原始选项卡会自行关闭。 Chrome:Chrome会杀死对指定标签的引用。因此,无论如何,每个新弹出窗口都会在新标签页中打开(即使它们调用相同的目标名称)。

我们已经变得非常有创意,但还没有找到一个可靠的解决方案。这是一个内联网项目,但由于这些公司的PC数量庞大,我们希望避免在每台计算机上安装或设置东西。

简而言之,主要问题是第二个RPG打开一个新窗口,新窗口没有对先前打开的命名选项卡的任何引用。

3 个答案:

答案 0 :(得分:3)

我在这里开箱即用,主要是因为我不知道你的程序是如何运作的。首先,实际上没有办法关闭X-tab,其中x是你想要的标签。唯一的方法是实际在该选项卡/页面中关闭它。这与PHP,HTML,JS等有关。我假设你可以通过一些C ++ / C#或者你的"客户端"上的任何运行来实现它。而不是浏览器。

现在,开箱即用的解决方案是进行一些会话管理和ajax调用。我的建议是在新标签上创建一个新会话。用户获得一个新标签,你给它编号1.你每隔x秒就对一个脚本进行ajax调用,这只是检查" tab"它是。让我举个例子。

用户打开一个新标签,会话开始,你有一个包含以下内容的数组:

$_SESSION['tabs'][1] = 'set';

现在这个标签一直在调用一个文件,看它是否应该保持" alive"。基本上你发布的是"嗨,我是标签1"。当您检查会话时,选项卡1应该是那里唯一的。

在新标签页上,会话标签获取另一个值,名为" 2"哪个得到了设定。现在,当标签1发布到ajax调用者时,它应该回复一条消息,它可以被关闭。当它收到该消息时,它应该调用一些JS,如:

javascript:window.open('','_self').close();

这只是大声思考,我想基本的想法应该有用,因为我从未测试过它,也不能给你一个完整的代码示例。也许当我有空闲时间时,我可以尝试创造这个。

答案 1 :(得分:0)

如果您在目标中命名一个不存在的框架,它将在新选项卡中打开。使用相同的框架名称,它将继续使用该选项卡。

答案 2 :(得分:0)

您是否考虑过创建一个从RPG rogram调用以处理浏览器请求的快速Handoff应用程序?这将允许您指定在发出新请求时应使用相同的选项卡,以及发送用于自定义的特定参数。请参阅Karl Anderson的回复==> Reusing browser/tab in VB.net

下面的类似代码:

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