代码之家  ›  专栏  ›  技术社区  ›  Greg Reynolds

如何在其他窗口中检查打开的URL?

  •  5
  • Greg Reynolds  · 技术社区  · 15 年前

    这是我最后一个问题的后续问题 Open a window if the window does not already exist 从本质上讲,我现在保留一个列表,其中列出了一个页面打开的所有窗口引用,并且只允许在尚未打开的情况下打开它们。然后我突然想到一个潜在的问题——用户当然有可能关闭原始窗口,然后再次打开它,从而丢失窗口引用列表。

    是否可以循环浏览浏览器中打开的窗口,检查特定的URL?

    编辑: 在这里(以及关于另一个问题)给出了很多有用的注释之后,这里是应用程序启动程序的最终代码。基本上,它尝试用适当的名称获取打开窗口的位置。如果这导致了异常(由于隐私问题),那么应用程序将被判断为已加载。如果它是“关于:空白”,那么它是一个新窗口。这适用于Firefox、IE7和谷歌Chrome。感觉很脏…

    var g_urlarray = [];
    
    Array.prototype.has = function(value) {
        var i;
        for (var i in this) {
            if (i === value) {
                return true;
            }
        }
        return false;
    };
    
    
    function launchApplication(l_url, l_windowName)
    {
        var l_width = screen.availWidth;
        var l_height = screen.availHeight;
        var winRef;
    
        var l_params = 'status=1' +
            ',resizable=1' +
            ',scrollbars=1' +
            ',width=' + l_width +
            ',height=' + l_height +
            ',left=0' +
            ',top=0';
        if (g_urlarray.has(l_url)) {
            winRef = g_urlarray[l_url];
        }
        if (winRef == null || winRef.closed) {
            winRef = window.open('', l_windowName, l_params);
            var l_openNew = 0;
            try {
                if (winRef.location == 'about:blank') {
                    l_openNew = 1;
                }
            }
            catch (e) {
                l_openNew = 0;
            }
            if (l_openNew === 1)
            {
                winRef.location = l_url;
                winRef.moveTo(0,0);
                winRef.resizeTo(l_width, l_height);
            }
            g_urlarray[l_url] = winRef;
        }
    }
    
    6 回复  |  直到 11 年前
        1
  •  0
  •   adam0101    15 年前

    @安纳卡塔(即使你储存了它们,你也不会再拥有关闭它们的权限)

    不是真的。如果您有窗口的名称,则可以使用window.open重新建立到窗口的链接,即使打开器已关闭并重新打开。例如:

    <script>
    function winOpen(url){
      return window.open(url,getWinName(url));
    }
    function winClose(url){
      var win = window.open("",getWinName(url));
      win.close();
    }
    function getWinName(url){
      return "win" + url.replace(/[^A-Za-z0-9\-\_]*/g,"");
    }
    </script>
    <a href="#" onclick="winOpen('http://google.com');return false;">Click me first</a>, close and open this window, then
    <a href="#" onclick="winClose('http://google.com');return false;">click me to close the other window</a>
    
        2
  •  4
  •   annakata    15 年前

    不,这是一个安全/隐私问题。


    由于其他人提出了所有权/cookie状态存储:只有当您也是打开窗口的同一个文档时,这才有效,即在用户关闭窗口并重新打开的情况下,这些引用确实会丢失(即使您存储了它们,您也不会再拥有关闭它们的权限)。

        3
  •  2
  •   EndangeredMassa    15 年前

    在javascript中,您只能获取对当前窗口和用其打开的任何窗口的引用 window.open .

    你可以查一下 winRef.closed 不过,看看用户是否关闭了窗口。不过,我不确定这是否适用于所有浏览器。

        4
  •  2
  •   adam0101    15 年前

    如果为每个窗口指定了唯一的窗口名称(window.open的第二个参数),则使用相同的窗口名称再次调用window.open将在窗口关闭时打开该窗口,或者返回对现有窗口的引用而不打开新窗口。

        5
  •  0
  •   community wiki Tamas Czinege    15 年前

    你真的可以用 曲奇饼 但是…如果你问我,你不会做的。

        6
  •  0
  •   Josh Stodola    15 年前

    设置一个数组,并在打开时用窗口引用递增…

    var wins = new Array();
    
    function openWindow(url) {
      wins.push(window.open(url));
    }
    

    然后,当您想检查窗口的状态时,您可以这样循环它们,并删除未打开的窗口…

    function updateWindowArray() {
      for(var i = 0, l = wins.length; i < l; i++) {
        if(wins[i] == null || wins[i].closed)
          arrayRemove(wins, i, i + 1);
      }
    }
    
    function arrayRemove(array, from, to) {
      var rest = array.slice((to || from) + 1 || array.length);
      array.length = from < 0 ? array.length + from : from;
      return array.push.apply(array, rest);
    }
    

    最好的问候…